2012-11-20 6 views
7

Czy istnieje sposób ustawienia domyślnej wartości parametru w skrypcie sqlplus bez wprowadzania danych przez użytkownika?Wartość domyślna dla nie przekazanych parametrów skrypt SQLPlus

Na przykład, mam sessions.sql skryptów 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'; 

I chcę, aby wywołać go z sqlplus tak:

 
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> 

mogę tylko przekazać pustą wartość parametru kiedy zostaniesz poproszony o jej wprowadzenie, lub jestem w stanie przekazać pusty parametr po nazwie skryptu przez "". Ale to zachowanie jest bardzo denerwujące. Jakiś JEŻELI DEFINIOWANY "& 1" będzie bardzo przydatny.

Czy masz jakieś wskazówki, jak to osiągnąć, aby zastosować warunki WHERE w parametrze skryptowym sqlplus, czy nie, bez niepotrzebnej interakcji użytkownika?

Rozwiązanie

Według artykułu związanego przez Martin I zmodyfikowany poprzedni skrypt pracować bez aksing dla wartości parametrów:

 
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 

Odpowiedz

6

Proszę przeczytać "On SQL*Plus Defines" na odpowiedź na swoje pytanie.

+0

Bardzo dziękuję za skierowanie mnie do świetnego artykułu. – adrive

0

Dla tych, którzy nie mają ochoty ścigać i przeglądać linków, które mogą zniknąć w dowolnym momencie, oto krótki cut'n fragment kodu.

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 
/

Wykonanie:

$ SQLPLUS -s SCOTT/TIGER @ ORCL @ a.sql
Param 1 jest wartością domyślną
$ SQLPLUS -s POSF/POSF @ ECMDB @ a.sql nondef
Wartość Param 1 jest niedostateczna

Powiązane problemy