在PL/SQL中使用oracle设置值

在PL/SQL中使用oracle设置值,oracle,plsql,oracle11g,Oracle,Plsql,Oracle11g,我被要求为迁移文件设置一些环境参数。但是,例如SQLBLANKLINES等参数仅在sqlplus中有效,其他工具(如Flyway)将因其使用而失效。这同样适用于自动提交 有没有办法执行以下操作: declare v1 varchar2(60) begin v1 := SHOW SQLBLANKLINES if (v1 is not empty) then SET SQLBLANKLINES ON end if; end; / 或者以某种方式查询环境以获取要设

我被要求为迁移文件设置一些环境参数。但是,例如
SQLBLANKLINES
等参数仅在sqlplus中有效,其他工具(如Flyway)将因其使用而失效。这同样适用于
自动提交

有没有办法执行以下操作:

declare
   v1 varchar2(60)
begin
   v1 := SHOW SQLBLANKLINES
   if (v1 is not empty) then
      SET SQLBLANKLINES ON
   end if;
end;
/
或者以某种方式查询环境以获取要设置的可用参数

或者以某种方式确定是否正在使用sqlplus

我知道
SHOW
SET
命令,但我不知道如何将它们的结果放入变量并在PL/SQL中调用
SET


Oracle是11g。

您不能在PL/SQL中引用
SQL*Plus
命令,因为PL/SQL无法识别它们。此外,您不能在
SQL*Plus
脚本中直接使用条件语句,因此您必须有点创造性。但是,您可以使用一个脚本来创建和运行另一个脚本,您可以使用它来注入条件语句

例如,这是一个脚本,我使用它来让我的发布脚本继续或不继续(它退出
SQL*Plus
):

继续\u或\u exit.sql:

prompt Do you want to continue script execution? 

accept yn prompt 'Y / N :  ';
set termout off;
set verify off;
set heading off;
set pause off;
set echo off;
column aaaa newline;

spool continue_or_exit_output.sql

select decode(upper('&&yn'), 'Y', 'prompt Executing ...',
                                  'prompt Stopped'
              ),
       decode(upper('&&yn'), 'Y', '', 'accept return_key prompt ''Press <Return>''') aaaa,
       decode(upper('&&yn'), 'Y', '', 'exit') aaaa
from dual;

spool off;
set termout on;

@continue_or_exit_output.sql

set termout on;
set verify on;
set heading on;
prompt是否继续执行脚本?
接受yn提示“是/否:”;
出发;
抵销;
出发;
设置暂停;
设置回声;
aaaa列换行符;
spool continue\u或exit\u output.sql
选择解码(上限('&&yn'),'Y','prompt Executing…',
“提示已停止”
),
解码(上限('&&yn')、'Y'、'accept return_键提示“按”)aaaa,
解码(上('&&yn'),'Y','exit')aaaa
来自双重;
关闭;
在……上设定条款;
@继续\u或退出\u output.sql
在……上设定条款;
设置验证;
设置航向;

您应该能够根据您的案例修改该命令,以决定是否打印出相关的SQL*plus命令。

您不能从PL/SQL中调用SQL*plus或任何客户端命令。它完全在服务器上执行。您至少可以判断客户机是否行为良好,但这并不能真正帮助您,因为您仍然无法使用该信息来控制发出哪些客户机命令

最简单的方法可能是使用迁移命令编写核心脚本,然后为特定客户机编写包装器脚本;因此,如果您使用了
core\u migration.sql
,您可以使用另一个名为
sqlplus\u migration.sql
的脚本,该脚本刚刚完成了:

SET SQLBLANKLINES ON
-- any other SQL*Plus-specific set-up you want
SET PAGESIZE 0
SET LINESIZE 200
SET SERVEROUTPUT ON SIZE UNLIMITED
WHENEVER SQLERROR EXIT FAILURE
-- etc.
-- Run core migration script
@core_migration
exit 0;
SQL*Plus需要能够找到核心脚本,因此最好/有必要使用以下命令传递该脚本的完整路径:

。。。然后称之为:

sqlplus -s -l usr/pwd @sqlplus_migration /path/to/core_migration.sql
(我不喜欢将凭据放在命令行上;您的脚本可以提示输入凭据,但您建议希望它是非交互式的)


我不熟悉Flyway-它可能只想调用核心脚本,而不需要额外的步骤。

如果您不知道将使用哪个客户端,则应在运行迁移文件之前在客户端环境中设置这些内容。这是安装说明中需要指定的内容(如有必要)。但是不,您无法从PL/SQL块中查看客户端设置或运行客户端命令。看起来不错,但此脚本是交互式的,但我希望通过Flyway手动和自动运行它。您不必以交互方式定义变量;调用时,可以将其作为脚本的一部分传入。例如,
@your_release_编写您的_参数值
,然后通过
和&1
引用它。这样,您可以在调用时定义它,希望您可以在Flyway中这样做?实际上,Flyway只需获取带有特定前缀的文件列表并逐个执行它们。然后,也许您可以创建包装器脚本,只需使用正确的参数调用相关脚本?您提供的客户端链接很酷。我可以从PL/sql执行sql文件吗?@ka2m-不,您不能执行文件,PL/sql块在服务器上执行,无法查看客户端的文件或运行sql*Plus命令(如@或start)。您可以使用utl_文件读取该文件,提取语句,运行它们-但前提是该文件位于服务器上,即使这样也不简单。。。
sqlplus -s -l usr/pwd @sqlplus_migration /path/to/core_migration.sql