执行PL / SQL过程时的ORA-06561

时间:2018-10-03 08:51:26

标签: oracle stored-procedures plsql dynamic-sql

我有此过程:

create or replace
PROCEDURE P_P2
IS
v_str varchar2(1000);
v_file_name varchar2(1000);
BEGIN
P_P1(v_str, 'EXPORT_CSV',v_file_name);
v_str := 'select * from H----)';
v_file_name :=  'H_'||to_char(sysdate,'DD-MM-YYYY')||'.csv';
END;

执行它时出现错误“ ORA-06561:包DBMS_SQL不支持给定语句”:

Error starting at line : 165 in command -
exec P_P1
Error report - 
ORA-06561: given statement is not supported by package DBMS_SQL
ORA-06512: at "SYS.DBMS_SQL", line 1120
ORA-06512: at "BIDB.P_P1", line 40
ORA-06512: at "BIDB.P_P2", line 7
ORA-06512: at line 1
06561. 00000 -  "given statement is not supported by package DBMS_SQL"
*Cause:    Attempting to parse an unsupported statement using procedure
           PARSE provided by package DBMS_SQL.
*Action:   Only statements which begin with SELECT, DELETE, INSERT, UPDATE,
           LOCK, BEGIN, DECLARE or << (PL/SQL label delimiter) are supported.

我不明白为什么。我在做什么错了?

1 个答案:

答案 0 :(得分:2)

您尚未显示P_P1在做什么,但是从您显示的情况来看,您的P_P2过程可能只是为时过早;您有一个使用P_P1作为参数的v_str调用,但此时为空-您在使用它的调用之后 设置它。

这意味着P_P1中的某个地方您可能最终会执行以下操作:

 dbms_sql.parse(c, null, dbms_sql.native);

会引发您看到的错误。您对v_filename进行的操作可能会导致其他问题。

因此,一开始,请交换这些行,以便将该过程称为last:

create or replace
PROCEDURE P_P2
IS
  v_str varchar2(1000);
  v_file_name varchar2(1000);
BEGIN
  v_str := 'select * from H----)';
  v_file_name :=  'H_'||to_char(sysdate,'DD-MM-YYYY')||'.csv';
  -- call this AFTER populating the variables
  P_P1(v_str, 'EXPORT_CSV',v_file_name);
END;
/

当然,您可能还有其他问题-由于破折号和右括号,表名看起来很奇怪;但您可能只是奇怪地隐藏了真实姓名。您似乎也更改了过程名称(尽管不一致,因为您的exec似乎调用了错误的名称...)。