oracle-sqldeveloper - 如何编写可以在 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 文件并让它执行该脚本而不需要那个愚蠢的包装器来附加那个“/”吗?
希望我能把自己说清楚...
解决方案
据我了解,您有一个要在 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.
推荐阅读
- python - 我想抓取这个网站 https://hdyc.neis-one.org/ 它有两页登录验证
- ssl - 如何使用通用代码修复 Http 公钥固定问题
- selenium - Firefox:浏览器处于远程控制状态时不保留会话 cookie
- python - 使用 numpy 数组的每个元素的乘法/加法
- android - 自定义恢复Android的分区安装问题
- html - 桌面视图中的条件链接显示
- c++ - 赋值运算符更改分配对象的值
- c++ - 如何使 xpressive 引擎像常规文本搜索一样工作
- excel - 在 foreach 语句中创建检查点
- jquery - OWL carousel 在 iphone 和 ipad 的 iframe 中不起作用