【问题标题】:Default value for paramteters not passed SQLPlus script未通过 SQLPlus 脚本的参数的默认值
【发布时间】:2012-11-08 14:53:13
【问题描述】:

有没有办法在没有用户输入的情况下设置sqlplus脚本中参数的默认值?

比如我有一个SQL脚本sessions.sql:

设置验证关闭 设置 TERMOUT 关闭 定义 uname = '&1' 列 search_uname new_value search_uname SELECT CASE WHEN '&uname' = '' THEN '%' ELSE UPPER('&uname') END AS search_uname 从双; 设置 TERMOUT ON SELECT sid, serial, username FROM v$session WHERE username LIKE '&search_uname';

我想像这样从 sqlplus 调用它:

SQL> @会话 输入 1 的值: SID 序列号# 用户名 ---------- ---------- ------------------ 56 20577 上下文 ...... 选择了 236 行。 SQL> @会话“” SID 序列号# 用户名 ---------- ---------- ------------------ 56 20577 上下文 ...... 选择了 236 行。 SQL> @sessions SDE SID 序列号# 用户名 ---------- ---------- ------------------ 113 56675 SDE 165 64881 SDE ...... 选择了 43 行。 SQL>

当我被要求输入参数时,我只能为参数传递一个空值,或者我可以通过“”在脚本名称后传递一个空参数。但这种行为非常烦人。某种 IF DEFINED "&1" 会非常有用。

您是否有任何提示或技巧,以在 sqlplus 脚本中应用 WHERE 条件,无论是否定义了参数,而无需不必要的用户交互?

解决方案

根据 Martin 链接的文章,我修改了以前的脚本以在不要求参数值的情况下工作:

设置验证关闭 设置 TERMOUT 关闭 第 1 列新值 1 SELECT '' "1" FROM dual WHERE ROWNUM = 0; 定义 uname = '&1' 设置 TERMOUT ON 从 v$session 中选择 sid、序列号、用户名 WHERE username LIKE UPPER(DECODE('&uname', '', '%', '&uname')); 取消定义 1

【问题讨论】:

    标签: oracle sqlplus


    【解决方案1】:

    对于那些不喜欢追逐和细读可能随时消失的链接的人,这里有一个快速剪切和粘贴 sn-p。

    set termout on
    set serveroutput on
    set feedback off
    set verify off
    
    -- start
    column 1 new_value 1 noprint
    select '' "1" from dual where rownum = 0;
    define param = &1 "default"
    -- end
    
    begin
        dbms_output.put_line ( 'Param 1 value is &param' );
    end;
    /
    
    exit 0
    /
    

    执行:

    $ sqlplus -s SCOTT/TIGER@ORCL @a.sql
    参数 1 为默认值
    $ sqlplus -s POSF/POSF@ECMDB @a.sql 非定义
    参数 1 的值是非定义的

    【讨论】:

    • 您能解释一下为什么会这样吗?我不明白column 1...select '' "1"... 部分的意义,但我对其进行了测试,没有它们就无法工作。
    • 似乎列名实际上并不重要。我可以做column dummy_a new_value 1 noprintselect '' dummy_a from dual where rownum = 0 并得到相同的结果。就此而言,我可以将 '' 替换为任何内容,甚至是像 42 这样的数字文字,它不会有任何区别。
    【解决方案2】:

    请阅读"On SQL*Plus Defines" 以获得您的问题的答案。

    引用:

    SQL> COLUMN 1 NEW_VALUE 1
    SQL> COLUMN 2 NEW_VALUE 2
    SQL> COLUMN 3 NEW_VALUE 3
    SQL> COLUMN 4 NEW_VALUE 4
    SQL> SELECT '' "1", '' "2", '' "3", '' "4"
      2    FROM dual
      3   WHERE ROWNUM = 0
      4  /
    
    no rows selected
    
    SQL> DEFINE 1
    DEFINE 1               = "1" (CHAR)
    SQL> DEFINE 2
    DEFINE 2               = "2" (CHAR)
    SQL> DEFINE 3
    DEFINE 3               = "" (CHAR)
    SQL> DEFINE 4
    DEFINE 4               = "" (CHAR)
    SQL> 
    SQL> REM ...but...
    SQL> 
    SQL> DEFINE 5
    SP2-0135: symbol 5 is UNDEFINED
    

    【讨论】:

    • 请提供答案
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-25
    • 2019-01-20
    • 1970-01-01
    • 2011-10-01
    • 1970-01-01
    • 2012-08-01
    相关资源
    最近更新 更多