14

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

例如,我有一个 SQL 脚本 session.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
4

2 回答 2

8

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

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 nondef
参数 1 值为 nondef

于 2017-01-09T16:41:31.840 回答
6

请阅读“关于 SQL*Plus 定义”以获得您问题的答案。

引用:

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
于 2012-11-20T14:44:48.463 回答