Nee*_*els 5 sqlplus batch-file conditional-statements
我有一个批处理文件,其中包含许多步骤,可以一一执行。
但是,为了能够使其更加灵活,我想在SQLPlus.
类似于,首先从查询中获取条件变量的值并存储在 say 中v_variable。然后将其用于一些检查,例如
IF v_variable = 'Y' THEN
--DO SOME DDL
ELSE
--DO OTHER DDL
END IF
Run Code Online (Sandbox Code Playgroud)
我必须在批处理文件的许多地方重复这个块,我无法通过 PL/SQL 以某种方式完成它。
我正在尝试使用此COLUMN命令,SQLPlus但以某种方式无法获取要保存的变量值。
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
Run Code Online (Sandbox Code Playgroud)
那是绝对错误的吗?我们如何查看是否V_VARIABLE1从查询中获取值?
即使我做对了,我也对这IF-ELSE部分一无所知。有人可以帮忙吗?我对适用于 SQLPlus 的解决方案感兴趣。
sql*plus 本身不支持流控制,因此您在这里可以执行的任何操作都将介于“解决方法”和“黑客”之间。一些可能的选项是:
execute
immediate使用 PL/SQL 块并通过或将 DDL 作为动态 SQL 运行dbms_utility.execute_ddl_statement。完全访问 PL/SQL 功能,因此在流程控制和语句构建方面最灵活,但如果您要部署大型内容,则更难以管理。
每个 if/else 分支编写一个脚本文件,使用您在帖子中提供的列/查询技巧之类的内容获取其名称,使用@&scriptname.
使用替换变量,如果使用得当,将注释掉脚本的某些部分。您可以使用 Tanel Poder 的 snapper 实用程序脚本作为示例;注意&_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
Run Code Online (Sandbox Code Playgroud)