ORA-00900: недопустимая инструкция SQL- при запуске пакета в oracle 12c

#oracle #plsql #package #oracle12c #ora-00900

#Oracle #plsql #пакет #oracle12c #ora-00900

Вопрос:

Я использую базу данных Oracle 12c и пытаюсь запустить пакет с помощью команд SQL.

 CREATE OR REPLACE PACKAGE "PK_CP_OTM" as
FUNCTION F_CP_OPTIMIZATION (
     v_current_day IN VARCHAR2,
     v_branch_code IN VARCHAR2)
     RETURN VARCHAR2;
END PK_CP_OTM;
  

Когда я пытаюсь выполнить его с помощью:

 DECLARE
BEGIN
EXECUTE IMMEDIATE PK_CP_OTM.F_CP_OPTIMIZATION('20190409','BRNCD001');
END;
  

Это показывает:

 ORA-00900: invalid SQL statement
ORA-06512: at line 3
00900. 00000 -  "invalid SQL statement"
  

Спасибо за вашу помощь.

Ответ №1:

Как сказал @Littlefoot, здесь вам не нужен динамический SQL, вы можете выполнить статический вызов; но поскольку вы вызываете функцию, вам нужно куда-то поместить результат вызова:

 declare
  l_result varchar2(30); -- make it a suitable size 
begin
  l_result := pk_cp_otm.f_cp_optimization('20190409','BRNCD001');
end;
/
  

В SQL * Plus, SQL Developer и SQLcl вы можете использовать execute команду client (что могло вызвать некоторую путаницу) и переменную bind для результата:

 var result varchar2(30);

exec :result := pk_cp_otm.f_cp_optimization('20190409','BRNCD001');

print result
  

Комментарии:

1. да, как динамический, так и статический вызовы работают нормально, большое спасибо!

Ответ №2:

Здесь нет ничего динамического, так зачем вам вообще использовать динамический SQL?

В любом случае: если вы настаиваете, то вам придется выбрать функцию в что-нибудь (например, локальную переменную). Вот пример

Во-первых, пакет:

 SQL> set serveroutput on
SQL>
SQL> create or replace package pk_cp_otm
  2  as
  3     function f_cp_optimization (v_current_day  in varchar2,
  4                                 v_branch_code  in varchar2)
  5        return varchar2;
  6  end pk_cp_otm;
  7  /

Package created.

SQL> create or replace package body pk_cp_otm
  2  as
  3     function f_cp_optimization (v_current_day  in varchar2,
  4                                 v_branch_code  in varchar2)
  5        return varchar2
  6     is
  7     begin
  8        return 'Littlefoot';
  9     end;
 10  end pk_cp_otm;
 11  /

Package body created.
  

Как вызвать функцию?

 SQL> declare
  2     l_result  varchar2 (20);
  3  begin
  4     execute immediate
  5        'select pk_cp_otm.f_cp_optimization (''1'', ''2'') from dual'
  6        into l_resu<
  7
  8     dbms_output.put_line ('result = ' || l_result);
  9  end;
 10  /
result = Littlefoot

PL/SQL procedure successfully completed.

SQL>
  

Комментарии:

1. да, как динамический, так и статический вызовы работают нормально, большое спасибо!