2013-07-31 48 views
1

我有两个.sql文件,都是Oracle存储过程,它们都接受输入参数。我想首先使用命令行中的sqlplus连接到远程oracle数据库,并且希望首先使用这两个文件创建它们各自的存储过程,以便我在Oracle SQL Developer中的连接过程中看到它们。创建Oracle存储过程并从.sql文件执行

在此之后,我有两个看起来像这样的.sql文件,旨在获取输入参数并执行存储过程。这是要执行存储过程“报告”的文件之一。

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:\用户\桌面> sqlplus的用户名/密码@ report_setup.sql

当我尝试这个输出得到只是空行,这些行被编号并从数字开始,这个数字比我的.sql文件的最后一行大1。我的report_setup.sql文件长度为81行,sqlplus命令的输出是从83开始的空白编号行。

请让我知道如何通过sqlplus正确创建和执行这些存储过程。

由于提前,

回答

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; 
/
+0

好点;但如果我理解了问题中的描述,那么它还没有达到运行该块的程度。另外还可以指出,在设置'startdate'和'enddate'时,它会进行隐式日期转换(并且似乎没有太多要点声明/设置这些),这可能有一天会失败。 –

1

这本来是展现report_setup.sql比调用它的创建过程的脚本更有用......但是从你描述的症状,在report_setup.sqldoesn'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来禁止显示行号 - 尽管此时它们很有用,因为它们大致显示了问题所在。