我有两个.sql文件都是Oracle存储过程,它们都接受输入参数。我想先在命令行中使用sqlplus连接到远程oracle数据库,并希望首先使用这两个文件来创建各自的存储过程,所以我在Oracle SQL Developer的程序中看到它们。
在此之后,我还有两个.sql文件看起来像这样,旨在获取输入参数并执行存储过程。这是用于执行存储过程“REPORT”的文件之一。
DECLARE
NAME VARCHAR2(200);
VERSION VARCHAR2(200);
STARTDATE DATE;
ENDDATE DATE;
BEGIN
NAME := '&1';
VERSION := '&2';
STARTDATE := '&3';
ENDDATE := '&4';
exec REPORT(NAME, VERSION, STARTDATE, ENDDATE);
EXCEPTION
WHEN OTHERS THEN
RAISE_APPLICATION_ERROR(-20101,SQLERRM);
END;
/
在命令提示符中,我首先尝试通过以下方式在数据库中创建存储过程: C:\ Users \ Desktop> sqlplus用户名/密码@ report_setup.sql
当我尝试这个时,输出get只是空行,这些行是编号的,并且以比我的.sql文件的最后一行大1的数字开头。我的report_setup.sql文件长81行,sqlplus命令的输出是空白的编号行,从83开始。
请告诉我如何通过sqlplus正确创建和执行这些存储过程。
提前致谢,
答案 0 :(得分:2)
我认为你必须删除'exec'字,并且在行的最开始处在底部有斜线是至关重要的,前面没有空格:
DECLARE
NAME VARCHAR2(200);
VERSION VARCHAR2(200);
STARTDATE DATE;
ENDDATE DATE;
BEGIN
NAME := '&1';
VERSION := '&2';
STARTDATE := '&3';
ENDDATE := '&4';
REPORT(NAME, VERSION, STARTDATE, ENDDATE);
EXCEPTION
WHEN OTHERS THEN
RAISE_APPLICATION_ERROR(-20101,SQLERRM);
END;
/
答案 1 :(得分:1)
显示report_setup.sql
比调用它创建的过程的脚本更有用...但是根据您描述的症状,report_setup.sql
doesn't have a /
at the end of the procedure declaration。
它可能有类似的东西:
CREATE OR REPLACE PROCEDURE REPORT(NAME VARCHAR2, VERSION VARCHAR2,
STARTDATE DATE, ENDDATE DATE) AS
...
BEGIN
...
END REPORT;
需要
...
BEGIN
...
END REPORT;
/
由于您使用@
从命令行运行它,因此最后还应该有一个EXIT
;但没有/
将被视为程序的一部分,而这个程序从未被编译过。
顺便提一下,您可以通过使用-s
标志调用SQL * Plus来抑制行号显示 - 尽管它们很有用,因为它们大致显示了问题所在。
答案 2 :(得分:0)
我有一个类似的问题。问题在于所使用的编码,sqlplus
期望UTF-8
标准编码,而无论哪种编码都会导致奇怪的行为。