2012-11-20 78 views
7

有沒有方法可以在沒有用戶輸入的情況下在sqlplus腳本中設置參數默認值?未傳遞參數的默認值SQLPlus腳本

例如,我有一個SQL腳本sessions.sql中:

 
SET VERIFY OFF 
SET TERMOUT OFF 
DEFINE uname = '&1' 

COLUMN search_uname new_value search_uname 
SELECT CASE WHEN '&uname' = '' THEN '%' ELSE UPPER('&uname') END AS search_uname 
FROM dual; 

SET TERMOUT ON 

SELECT sid, serial, username FROM v$session WHERE username LIKE '&search_uname'; 

我想從sqlplus中調用它是這樣的:

 
SQL> @sessions 
Enter value for 1: 

     SID SERIAL# USERNAME 
---------- ---------- ------------------------------ 
    56 20577 CONTEXT 
..... 
236 rows selected. 

SQL> @sessions "" 

     SID SERIAL# USERNAME 
---------- ---------- ------------------------------ 
    56 20577 CONTEXT 
..... 
236 rows selected. 

SQL> @sessions SDE 

     SID SERIAL# USERNAME 
---------- ---------- ------------------------------ 
     113 56675 SDE 
     165 64881 SDE 
..... 
43 rows selected. 

SQL> 

我只能通過對參數的空值當我被要求輸入它時,或者我能夠通過「」在腳本名稱之後傳遞一個空的參數。但是這種行爲非常煩人。某些IF定義爲「& 1」將非常有用。

您是否有任何提示或技巧如何實現應用WHERE條件在sqlplus腳本中wheter參數是否定義或沒有不必要的用戶交互?

解決方案

據馬丁鏈接的文章中,我修改的是工作不aksing參數值前一個腳本:

 
SET VERIFY OFF 
SET TERMOUT OFF 

column 1 new_value 1 
SELECT '' "1" FROM dual WHERE ROWNUM = 0; 
define uname = '&1' 

SET TERMOUT ON 

SELECT sid, serial#, username FROM v$session 
WHERE username LIKE UPPER(DECODE('&uname', '', '%', '&uname')); 

undefine 1 

回答

0

對於那些不喜歡追逐和閱讀可隨時消失的鏈接的人來說,這裏有一個快速剪貼的代碼片段。

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的值是非自定義的