#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. да, как динамический, так и статический вызовы работают нормально, большое спасибо!