SQLPlus条件执行与查询变量

时间:2014-12-18 10:02:04

标签: batch-file sqlplus conditional-statements

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

但是,为了能够更灵活,我想在SQLPlus中加入条件检查。

要获得条件变量'首先是查询的值,而商店是v_variable。然后将它用于某些检查,如

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

我必须在批处理文件的许多地方重复这个块,我不能以某种方式通过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

这绝对错了吗?我们如何看待V_VARIABLE1是否从查询中获取值?

即使在我做对了之后,我对IF-ELSE部分也毫无头绪。有人可以帮忙吗?我对适用于SQLPlus的解决方案感兴趣。

2 个答案:

答案 0 :(得分:2)

sql * plus本身不支持流量控制,所以你在这里可以做的任何事情都会介于"解决方法"和" hack"。一些可能的选择是:

  1. 使用PL / SQL块并通过execute immediatedbms_utility.execute_ddl_statement将DDL作为动态SQL运行。完全访问权限 PL / SQL功能,因此在流量控制方面最灵活 声明构建,如果您正在部署,则难以管理 大事。

  2. 根据if / else分支编写脚本文件,获取其名称 比如你在帖子中提供的列/查询技巧,运行它 类似于@&scriptname

  3. 使用替换变量,如果使用得当,将会发表评论 你的脚本的一些部分。你可以使用Tanel Poder的鲷鱼 实用程序script作为示例;注意&_IF_替换 变量那里。

  4. 您可以子脚本嵌入到父脚本的pl / sql块中。喜欢 这样:

  5. -

    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
    

答案 1 :(得分:0)

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

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

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

你可能不需要' FINDSTR / V"("以及尾随&..它假设SQLPlus的输出类似于SQL,这将排除SQL报告处理的行数。一切皆有可能。如果你不能完成这项工作,请发布临时文件的内容,我们可以进行必要的修改。