Standardwert für Parameter, die das SQLPlus-Skript nicht bestanden haben

Gibt es eine Möglichkeit, den Standardwert von paramter in sqlplus-Skripten ohne Benutzereingabe festzulegen?

Zum Beispiel habe ich ein SQL-Skript 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';

Und ich möchte es wie folgt aus sqlplus aufrufen:

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> 

Ich kann einen leeren Wert für Parameter nur übergeben, wenn ich zur Eingabe aufgefordert werde, oder ich kann einen leeren Parameter nach dem Skriptnamen durch "" übergeben. Dieses Verhalten ist aber sehr ärgerlich. Irgendeine Art von IF DEFINED "& 1" wird sehr nützlich sein.

Haben Sie Tipps oder Tricks, wie dies erreicht werden sollte, um WHERE-Bedingungen im sqlplus-Skript anzuwenden, wenn der Parameter ohne unnötige Benutzerinteraktion definiert ist oder nicht?

Lösung

Gemäß dem von Martin verlinkten Artikel habe ich das vorherige Skript so geändert, dass es funktioniert, ohne nach Parameterwerten zu fragen:

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

Antworten auf die Frage(2)

Ihre Antwort auf die Frage