在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