使用来自查询的变量的 SQLPlus 条件执行

Posted

技术标签:

【中文标题】使用来自查询的变量的 SQLPlus 条件执行【英文标题】:SQLPlus conditional execution with variable from query 【发布时间】:2014-12-18 10:02:04 【问题描述】:

我有一个批处理文件,其中包含许多步骤,将逐个执行。

但是,为了使其更灵活,我想在SQLPlus 中包含条件检查。

类似于,首先从查询中获取条件变量的值并存储在v_variable 中。然后将其用于一些检查,例如

IF v_variable = 'Y' THEN
--DO SOME DDL
ELSE
--DO OTHER DDL
END IF

我必须在批处理文件的许多地方重复这个块,我无法通过 PL/SQL 以某种方式完成。

我正在尝试在SQLPlus 中使用这个COLUMN 命令,但不知何故没有得到要保存的变量值。

COLUMN VARIABLE1 NEW_VALUE V_VARIABLE1

SELECT PARAM_VAL AS VARIABLE1 FROM TABLE_T WHERE PARAM_TYPE =  'XYZ'; 
-- This query will only throw one record.

DEFINE V_VARIABLE1

这是绝对错误的吗?我们如何查看V_VARIABLE1 是否正在获取来自查询的值?

即使我做对了,我对IF-ELSE 部分一无所知。有人可以在这里帮忙吗?我对适用于 SQLPlus 的解决方案感兴趣。

【问题讨论】:

【参考方案1】:

sql*plus 本身不支持流控制,因此您可以在此处执行的任何操作都介于“解决方法”和“破解”之间。一些可能的选择是:

    使用 PL/SQL 块并通过 execute immediatedbms_utility.execute_ddl_statement 将 DDL 作为动态 SQL 运行。完全访问 PL/SQL 特性,在流量控制和 语句构建,但是如果您正在部署则更难管理 很大的东西。

    为每个 if/else 分支编写一个脚本文件,用一些东西获取它的名字 就像您在帖子中提供的列/查询技巧一样,运行它 类似@&scriptname

    使用替换变量,如果使用得当,将注释 删除脚本的某些部分。您可以使用 Tanel Poder 的鲷鱼 实用程序script 为例;通知&_IF_替换 变量在那里。

    您可以将子脚本嵌入到父脚本的 pl/sql 块中。像 这个:

--

21:21:23 SQL> ho cat run.sql
begin
case '&1.' when 'A' then
@script_a
when 'B' then
@script_b
else
null;
end case;
end;
/

21:21:26 SQL> ho cat script_a.sql
dbms_output.put_line('this is a');

21:21:30 SQL> ho cat script_b.sql
dbms_output.put_line('this is b');

21:21:34 SQL> @run
Enter value for 1: A
this is a

PL/SQL procedure successfully completed.

Elapsed: 00:00:00.02
21:21:37 SQL> @run B
this is b

PL/SQL procedure successfully completed.

Elapsed: 00:00:00.03

【讨论】:

感谢您的解释。现在连我都觉得 SQLPlus 是不够的。我已将代码移至 PL/SQL 块。 @Neels 仅供参考 - 您可能想看看条件编译 docs.oracle.com/cd/B19306_01/appdev.102/b14261/…【参考方案2】:

我对 SQLPlus 没有任何经验。我将假设您可以将 select 命令的输出重定向到临时文件。假设您只选择了 1 条记录中的一列,那么您可以执行以下操作:

FOR /F "tokens=*" %%A IN ('FINDSTR /v "(" YourTempFile.txt) DO SET YourVariable=%%A

"tokens=*" 是可选的。它将删除前导空格并保存字符串的其余部分,包括空格。根据您的数据,可能不相关。

您可能也不需要 'FINDSTR /V "(" 和结尾的 '。我假设 SQLPlus 的输出将类似于 SQL,这将排除 SQL 报告的已处理行数。可能。如果您无法完成这项工作,请发布临时文件的内容,我们可以进行必要的修改。

【讨论】:

以上是关于使用来自查询的变量的 SQLPlus 条件执行的主要内容,如果未能解决你的问题,请参考以下文章

查询oracle数据库时,如何定义变量进行查询

抑制来自 sqlplus 输出的 CURSOR 消息

在没有提示变量文本的情况下假脱机 sqlplus 查询

获取 sqlplus 的结果并放入脚本 .bat 上的变量中

如何从sqlplus到bash脚本获取SQL查询输出

需要 nosql 数据库进行按位条件查询