创建Oracle存储过程并从.sql文件执行它

时间:2013-07-31 14:26:14

标签: oracle stored-procedures plsql sqlplus oracle-sqldeveloper

我有两个.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正确创建和执行这些存储过程。

提前致谢,

3 个答案:

答案 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标准编码,而无论哪种编码都会导致奇怪的行为。