14

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

たとえば、SQLスクリプトsessions.sqlがあります。

確認をオフに設定
タームアウトをオフに設定
DEFINE uname ='&1'

COLUMN search_uname new_value search_uname
SELECT CASE WHEN'&uname' ='' THEN'%' ELSE UPPER('&uname')END AS search_uname
デュアルから;

TERMOUTをオンに設定

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

そして、私は次のようにsqlplusからそれを呼び出したいと思います:

SQL> @sessions
1の値を入力します:

       SID SERIAL#USERNAME
---------- ---------- ------------------------------
    5620577コンテキスト
....。
236行が選択されました。

SQL> @sessions ""

       SID SERIAL#USERNAME
---------- ---------- ------------------------------
    5620577コンテキスト
....。
236行が選択されました。

SQL> @sessions SDE

       SID SERIAL#USERNAME
---------- ---------- ------------------------------
       113 56675 SDE
       165 64881 SDE
....。
43行が選択されました。

SQL>

パラメータに空の値を渡すことができるのは、入力を求められたときだけです。または、スクリプト名の後に「」を介して空のパラメータを渡すことができます。しかし、この動作は非常に厄介です。ある種のIFDEFINED"&1"は非常に便利です。

パラメータが定義されているかどうかにかかわらず、sqlplusスクリプトのWHERE条件を適用するためにこれをどのように達成する必要があるかについてのヒントやコツはありますか?

解決

Martinによってリンクされた記事によると、以前のスクリプトを変更して、パラメーター値を確認せずに機能するようにしました。

確認をオフに設定
タームアウトをオフに設定

列1new_value1
SELECT'' "1" FROM dual WHERE ROWNUM = 0;
uname ='&1'を定義する

TERMOUTをオンに設定

SELECT sid、serial#、username FROM v $ session
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.sqlParam1の
値がデフォルトです
$sqlplus-s POSF / POSF @ ECMDB @ a.sql nondefParam1の
値は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 に答える