2012-11-20 3 views
7

ユーザー入力なしでsqlplusスクリプトでparamterのデフォルト値を設定する方法はありますか?paramtetersのデフォルト値は渡されませんSQLPlusスクリプト

 
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.sql持っ

 
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"は非常に便利です。

不要なユーザー操作を行わずにsqlplusスクリプトwheterパラメーターが定義されているWHERE条件を適用するためのヒントやヒントがありますか?

ソリューション

マーティンによってリンク先の記事によると、私は、パラメータ値のため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 

答えて

6

あなたの質問への答えを"On SQL*Plus Defines"をお読みください。

+0

私に素晴らしい記事を指摘していただきありがとうございます。 – adrive

0

いつでも消えてしまうリンクを追いかけたり熟読したりしない人のために、すぐにcut'nペーストスニペットがあります。

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 @
Paramの1つの値は、デフォルト
$ sqlplusを-s POSF/POSF @ ECMDB @ a.sqlですnondef
パラメータ1の値は非定義です