首页 > 解决方案 > 如何编写可以在 Oracle 的 SQLPlus 和 SQLDeveloper 中作为脚本运行的 PL/SQL 脚本?

问题描述

我已经使用 SQLDeveloper 开发了一个脚本。

它的基本结构是:

文件 pl_sql.sql:

-- setting some options here, e.g. set linesize 32767 / set serveroutput on / etc.
declare
-- some variables declared here
begin
-- some SQL statements and PL/SQL code here
end;

这在 SQLDeveloper 中运行良好。要在 SQLPlus 中运行它,我必须像这样编写一个包装器:

文件包装器.sql:

@pl_sql.sql
/
quit

没有那个'/',脚本不会被执行,但我只会得到一个提示。但是,当我调用它时,我总是在声明后的第一个变量声明时出错。正如我发现的那样 - 使用了大量的试验和错误 - 我显然不能在被调用的 pl_sql.sql 文件中使用“声明”之前的选项。所以我将选项移动到 wrapper.sql 中,如下所示:

文件 wrapper2.sql:

-- setting some options here, e.g. set linesize 32767 / set serveroutput on / etc.
@pl_sql2.sql
/
quit

并且脚本与第一个完全相同,但没有前导选项:

文件 pl_sql2.sql:

declare
-- some variables declared here
begin
-- some SQL statements and PL/SQL code here
end;

但是现在,PL/SQL 脚本的那个变体当然不再在 SQLDeveloper 中工作了。或更准确地说:它可以工作,但不会产生任何输出(因为现在缺少“设置服务器输出”和其他选项)。

是否真的不可能以某种方式将这些选项包含到内部文件中并让包装器真正成为:

文件包装器.sql:

@pl_sql2.sql
/
quit

即只是文件的调用和尾随的“/”+退出?

或者甚至更好:不能直接调用带有选项和来自 slqplus 的代码的内部 .sql 文件并让它执行该脚本而不需要那个愚蠢的包装器来附加那个“/”吗?

希望我能把自己说清楚...

标签: oracle-sqldevelopersqlplus

解决方案


据我了解,您有一个要在 SQLPlus 中运行的 sql 文件。在 SqlPlus 中运行该块时,它总是需要正斜杠 /,你告诉 Sqlplus,我已经完成了我的 proc 定义,现在运行它(在 proc 中,每一行都以分号结尾,sqlplus 有无法确定何时应该执行该语句)。在您的 plsql.sql 文件中设置命令非常好。我怀疑您因为 sql 文件中的任何不可打印字符而出错。

下面是我的脚本的副本,它工作正常。

$cat slqtest.sh

#!/bin/sh
sqlplus -s ${DBUSER}/${DBUSERPASS}@//${DBHOST}:${DBPORT}/${DBSERVICENAME}<<EOSQL
@sqltest.sql
/
EOSQL

$ cat sqltest.sql
set linesize 32767
set serveroutput on
declare
        l_string varchar2(100);
begin
        select 'This works' into l_string from dual;
        dbms_output.put_line('l_string '||l_string);
end;

$ ./slqtest.sh
l_string This works


PL/SQL procedure successfully completed.

推荐阅读