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