无法在 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 应该会告诉您存在问题,并且应该将其显示为无效。不知道为什么不这样做 - 如果您正在跨模式工作,可能会感到困惑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 中执行存储过程的主要内容,如果未能解决你的问题,请参考以下文章