2011-01-12 15 views
13

Scrivo codice utilizzando Oracle SQL Developer. Ho una semplice dichiarazione prescelta che funziona:Esegui codice SQL con variabili nella finestra del codice Oracle SQL Developer

SELECT 
     CFS.CAE_SEC_ID, 
     CFS.FM_SEC_CODE, 
     CFS.LAST_USER_ID, 
     case 
      when 1 = 1 then 
      sl.usbank_to_edit 
      else 
      case 
       when 'ENT\CB174' = CFS.last_user_id then 
       sl.owner_to_edit 
       else 
       sl.to_edit 
      end 
     end canEdit 
    FROM 
    CAEDBO.CAE_FOF_SECURITY CFS 
    INNER JOIN caedbo.CAE_DATA_SET_ELEMENT CDSE_STAT 
     ON (CDSE_STAT.DATA_SET_ELEMENT_ID = CFS.APPR_STATUS) 
    INNER JOIN caedbo.CAE_STATE_LOOKUP sl 
     ON (sl.object_state = CDSE_STAT.data_set_element_id) 
    where 
     cfs.CAE_SEC_ID in (3741, 3744, 3748, 3752); 

Tuttavia voglio aggiungere alcune variabili ad essa e fare riferimento alle variabili nella dichiarazione, simile al di sotto, e anche eseguirlo nella finestra del codice. Come faccio a farlo correttamente?

DECLARE 
    p_USBank_n NUMBER; 
    p_user_id_c VARCHAR2(20); 
BEGIN 
    p_USBank_n := 1; 
    p_user_id_c := 'ENT\CB174'; 

    SELECT 
     CFS.CAE_SEC_ID, 
     CFS.FM_SEC_CODE, 
     CFS.LAST_USER_ID, 
     case 
      when p_USBank_n = 1 then 
      sl.usbank_to_edit 
      else 
      case 
       when p_user_id_c = CFS.last_user_id then 
       sl.owner_to_edit 
       else 
       sl.to_edit 
      end 
     end canEdit 
    FROM 
    CAEDBO.CAE_FOF_SECURITY CFS 
    INNER JOIN caedbo.CAE_DATA_SET_ELEMENT CDSE_STAT 
     ON (CDSE_STAT.DATA_SET_ELEMENT_ID = CFS.APPR_STATUS) 
    INNER JOIN caedbo.CAE_STATE_LOOKUP sl 
     ON (sl.object_state = CDSE_STAT.data_set_element_id) 
    where 
     cfs.CAE_SEC_ID in (3741, 3744, 3748, 3752); 
END; 

Quando ho eseguito questo in una finestra SQL ottengo il messaggio qui sotto:

Error report: 
ORA-06550: line 8, column 5: 
PLS-00428: an INTO clause is expected in this SELECT statement 
06550. 00000 - "line %s, column %s:\n%s" 
*Cause: Usually a PL/SQL compilation error. 
*Action: 
+3

Eh se potevo capirlo, allora non avrei chiesto sarebbe I..what tipo di commento muto è quello? Se non hai nulla di costruttivo da dire, per favore non dire nulla, grazie –

risposta

19

se sto leggendo correttamente, penso che siete alla ricerca di Oracle Substitution variables.

questo chiederà ogni volta per inserire i valori, utilizzando & val ti verrà richiesto @ runtime

SELECT 
     CFS.CAE_SEC_ID, 
     CFS.FM_SEC_CODE, 
     CFS.LAST_USER_ID, 
     CASE 
      when &p_USBank_n = 1 then 
      sl.usbank_to_edit 
      else 
      CASE 
       when '&p_user_id_c' = CFS.last_user_id then 
       sl.owner_to_edit 
       else 
       sl.to_edit 
      end 
     end canEdit 
    FROM 
    CAEDBO.CAE_FOF_SECURITY CFS 
    INNER JOIN caedbo.CAE_DATA_SET_ELEMENT CDSE_STAT 
     ON (CDSE_STAT.DATA_SET_ELEMENT_ID = CFS.APPR_STATUS) 
    INNER JOIN caedbo.CAE_STATE_LOOKUP sl 
     ON (sl.object_state = CDSE_STAT.data_set_element_id) 
    where 
     CFS.CAE_SEC_ID IN (3741, 3744, 3748, 3752); 

cambiamento a & & var averlo mantenere il valore, quindi utilizzare

UNDEFINE var 

per cancellarlo

Ora è possibile impostare questi in cima alla pagina (evitando così il prompt) utilizzando dEFINIRE come tale

DEFINE XYZ = 5 
DEFINE AAA = to_date('10/10/2010','mm/dd/rrrr') 
DEFINE textString = AaBbCc 

SELECT &&XYZ b, &&AAA a, '&&textString' textString 
    from dual ; 

    B      A       TEXTSTRING 
    ---------------------- ------------------------- ---------- 
    5      10.OCT.2010 00:00   AaBbCc  
    --typing define will show you all the "defined" values 
define 

    DEFINE XYZ = "5" 
    DEFINE TEXTSTRING = "AaBbCc" 
    DEFINE AAA = "to_date('10/10/2010','mm/dd/rrrr')" 

il doppio e commerciale sarà 'mantenere' il valore fino a quando non definirlo (vedi sopra) o ridefinirlo.

+0

ringrazia quello che dici che funziona così +1, ma mi piacerebbe dichiarare le variabili nella parte superiore della pagina. La mia query è parte di una molto più grande con diverse variabili, quindi viene richiesto un po 'di dolore per ciascuna –

+2

@Ciaran Bruen, è possibile aggirare il prompt utilizzando' DEFINE '(vedere sopra per modifica ed esempio) – Harrison

+0

grazie per aggiornamento molto apprezzato. Non sei sicuro di quale contrassegnare come risposta in quanto entrambe le risposte sono corrette? –

4

Il messaggio di errore spiega il problema; all'interno di un blocco PL/SQL devi selezionare qualcosa INTO e non puoi semplicemente scaricare i risultati di una query sullo schermo come puoi con un semplice SQL. (Ci sono modi per farlo ma probabilmente troppo complicato per quello che sembra che tu stia cercando di ottenere qui).

Se non si desidera utilizzare le variabili di sostituzione come suggerito da @Harrison, è possibile utilizzare variabili di bind definite dall'utente all'inizio in un blocco anonimo separato. È quindi possibile fare riferimento alla variabile si legano in SQL pianura:

var p_usbank_n number; 
var p_user_id_c varchar2(20); 

exec :p_usbank_n := 1; 
exec :p_user_id_c := 'ENT\CB174'; 

select 
    cfs.cae_sec_id, 
    cfs.fm_sec_code, 
    cfs.last_user_id, 
    case 
     when 1 = :p_usbank_n then 
      sl.usbank_to_edit 
     when cfs.last_user_id = :p_user_id_c then 
      sl.owner_to_edit 
     else 
      sl.to_edit 
    end as canEdit 
from 
    caedbo.cae_fof_security cfs 
inner join caedbo.cae_data_set_element cdse_stat 
    on (cdse_stat.data_set_element_id = cfs.appr_status) 
inner join caedbo.cae_state_lookup sl 
    on (sl.object_state = cdse_stat.data_set_element_id) 
where 
    cfs.cae_sec_id in (3741, 3744, 3748, 3752); 
+0

Ciao Alex, tornando a questo ora. Il codice sopra mi richiede i valori di input anche se i valori sono specificati nel codice. Qualche idea del perché questo potrebbe essere? –

+1

@Ciaran: In SQL Developer, stai facendo 'Esegui' (che verrà visualizzato in una finestra intitolata 'inserisci binding', perché esegue solo l'istruzione corrente); o 'Esegui script' (F5)? È necessario eseguire quest'ultimo per far sì che esegua 'var',' exec' e quindi 'select' come un'unica unità. Questo vale anche per la versione 'define' di @ Harrison - se si esegue 'Esegui' ti vengono richieste le variabili di sostituzione. –

+1

in SQL Developer Versione 3.0.02, se si evidenzia/seleziona l'intero blocco con la variabile di sostituzione insieme alla query non verrà richiesto (run = F9) – Harrison

Problemi correlati