首页 文章

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

提问于
浏览
1

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

提前致谢,

2 回答

  • 1

    我认为你必须删除'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;
    /
    
  • 2

    显示 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来抑制行号显示 - 尽管目前它们很有用,因为它们大致显示了问题所在 .

相关问题