【问题标题】:ORA-06561 while executing PL/SQL procedureORA-06561 在执行 PL/SQL 过程时
【发布时间】:2019-03-08 10:58:27
【问题描述】:

我有这个程序:

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.

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

【问题讨论】:

  • 错误来自在“BIDB.P_P1”第 40 行进行的调用,而您没有向我们展示该过程。您似乎还直接执行P_P1,而不是通过P_P2,这有点令人困惑,因为这似乎不是错误的意思。

标签: oracle stored-procedures plsql dynamic-sql


【解决方案1】:

您还没有展示P_P1 正在做什么,但从您展示的内容来看,您的P_P2 程序可能调用它为时过早;你有一个对 P_P1 的调用,它使用 v_str 作为参数,但此时它为空 - 你在使用它的调用之后 设置它。

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

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

这会引发您看到的错误。你对v_filename 也做同样的事情,这可能会导致其他问题。

因此,首先,交换这些行,以便最后调用该过程:

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 似乎调用了错误的名称......)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-10-25
    • 2019-03-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-01
    相关资源
    最近更新 更多