无法在 Oracle 中执行存储过程

Posted

技术标签:

【中文标题】无法在 Oracle 中执行存储过程【英文标题】:Cannot execute a stored procedure in Oracle 【发布时间】:2021-02-03 14:53:16 【问题描述】:

这是一个使用 Toad for Data Analysts 3.0.1.1734 的简单示例。我对架构 JSWEENEY 拥有完全权限。

创建表

CREATE TABLE JSWEENEY.TEMP_SQL
(
    SQL VARCHAR2(3000)
);

创建过程

CREATE OR REPLACE PROCEDURE JSWEENEY.SP_INSERT_SQL
IS
BEGIN   
   INSERT INTO JSWEENEY.TEMP_SQL(SQL) VALUES('SELECT * FROM TEMP_SQL');
   COMMIT;
END JSWEENEY.SP_INSERT_SQL;    
/

执行程序:

BEGIN
    JSWEENEY.SP_INSERT_SQL;
END;

第一个错误:

ORA-06550:第 2 行,第 11 列: PLS-00905:对象 JSWEENEY.SP_INSERT_SQL 无效

ORA-06550:第 2 行,第 2 列:PL/SQL:语句被忽略

执行程序:

BEGIN
    EXECUTE JSWEENEY.SP_INSERT_SQL;
END;

第二个错误:

ORA-06550:第 2 行,第 10 列: PLS-00103:在预期以下之一时遇到符号“JSWEENEY”::=。 ( @ % ; 立即符号 ":=" 被替换为 "JSWEENEY" 以继续。

任何建议将不胜感激。

【问题讨论】:

运行过程时遇到的错误表明create procedure 语句因语法错误而失败。如果您返回并重新创建该过程,您应该会得到一个错误列表。 谢谢,但Toad 表明程序编译正确。如果编译不正确,它会在过程名称旁边显示一个“X”。 【参考方案1】:

编译过程会报错;如果您的客户端没有显示,那么您可以查询user_errors 视图(或all_errors,如果您在不同的架构中创建它)来查看问题。在这里它会抱怨:

LINE/COL ERROR
-------- -----------------------------------------------------------------
6/13     PLS-00103: Encountered the symbol "." when expecting one of the following:
         ;

create调用中使用模式名是有效的;但不是end 的一部分。因此,如果您完全需要指定架构 - 如果您在自己的架构中创建对象,则不需要指定架构,但是您对权限的引用听起来好像您不需要 - 那么它应该是:

CREATE OR REPLACE PROCEDURE JSWEENEY.SP_INSERT_SQL
IS
BEGIN   
   INSERT INTO JSWEENEY.TEMP_SQL(SQL) VALUES('SELECT * FROM TEMP_SQL');
   COMMIT;
END SP_INSERT_SQL;    
/

您的第二个错误是因为execute 是客户端命令(在 SQL*Plus 和关系中),而不是 PL/SQL 语句。该错误指的是immediate,因为PL/SQL 确实有一个execute immediate 语句用于动态SQL,而不是用于对过程进行静态调用。一旦程序本身有效,您运行该程序的第一个语法是正确的:

BEGIN
    JSWEENEY.SP_INSERT_SQL;
END;
/

【讨论】:

好吧,这行得通。第二个问题是添加参数。 创建或替换过程 JSWEENEY.SP_INSERT_SQL ( pSQL TEMP_SQL.SQL%TYPE ) 开始插入 JSWEENEY.TEMP_SQL(SQL) VALUES(pSQL');犯罪;结束 SP_INSERT_SQL; / 这编译正确然后我用 BEGIN JSWEENEY.SP_INSERT_SQL('Testing Insert'); 运行它结尾; 并得到一个错误对象 JSWEENEY.SP_INS 编译不正确。您在VALUES(pSQL') 中有一个杂散引用。当您执行create 时,Toad 应该会告诉您存在问题,并且应该将其显示为无效。不知道为什么不这样做 - 如果您正在跨模式工作,可能会感到困惑。如果你仍然不能让它工作,你应该问一个新问题;原始问题已解决,并且代码在 cmets 中实际上不起作用。但它看起来像一个错字。 看起来它也不满意在pSQL TEMP_SQL.SQL%TYPE 部分中将列称为SQL(或pSQL JSWEENEY.TEMP_SQL.SQL%TYPE,如果您保持一致*8-)。 SQL 是关键字,因此不是一个好的名称选择。【参考方案2】:

试试这个编辑过的 SQL 语句。

create table TEMP_SQL ( col1 varchar2(100));

CREATE OR REPLACE PROCEDURE SP_INSERT_SQL
AS
BEGIN   
   INSERT INTO TEMP_SQL SELECT * FROM TEMP_SQL;
   COMMIT;
END  SP_INSERT_SQL;

【讨论】:

谢谢,但该示例应该说明将文字字符串插入表中。

以上是关于无法在 Oracle 中执行存储过程的主要内容,如果未能解决你的问题,请参考以下文章

oracle 执行存储过程 无法中断 但是是循环执行 怎么办

Oracle测量执行时间存储过程

Oracle SQL - 无法创建存储过程

oracle 存储过程中多线程执行另一个存储过程

怎么知道 oracle存储过程是不是执行完

oracle中 kill 正在执行的存储过程