2

我有两个 .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 username/password @report_setup.sql

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

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

提前致谢,

4

3 回答 3

3

我认为你必须删除'exec'-word,并且在行首的底部有斜线,前面没有空格是至关重要的:

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;
/
于 2013-07-31T16:21:00.480 回答
1

显示比调用它创建的过程的脚本更有用report_setup.sql......但从你描述的症状来看,在过程声明的末尾report_setup.sql 没有 a/

它大概有类似的东西:

CREATE OR REPLACE PROCEDURE REPORT(NAME VARCHAR2, VERSION VARCHAR2,
  STARTDATE DATE, ENDDATE DATE) AS
...
BEGIN
  ...
END REPORT;

它需要有

...
BEGIN
  ...
END REPORT;
/

由于您是从命令行运行它,因此它的末尾@也应该有一个;EXIT但如果没有/那将被视为过程的一部分,它永远不会被编译。

顺便说一句,您可以通过使用标志调用 SQL*Plus 来抑制行号显示-s- 尽管目前它们很有用,因为它们大致显示了问题所在。

于 2013-07-31T15:10:21.603 回答
0

我有一个类似的问题。问题是使用的编码,sqlplus需要UTF-8标准编码,不同的编码会导致奇怪的行为。

于 2019-01-22T17:48:25.167 回答