2012-06-04 12 views
22

In Sql Server, spesso quando sto testando il corpo di una stored procedure, copio il corpo in SSMS, DECLARE le variabili nella parte superiore della pagina, impostale su alcuni valori di esempio ed eseguo il corpo as- è.Come dichiarare e utilizzare le variabili in PL/SQL come faccio in T-SQL?

Per esempio, se il mio proc è

CREATE PROC MySampleProc 
    @Name VARCHAR(20) 
AS 
    SELECT @Name 

Poi la mia prova sql sarebbe

DECLARE @Name VARCHAR(20) 
SET  @Name = 'Tom' 

    SELECT @Name 

Qual è l'Oracle PL/SQL equivalente a questo?

Questo è il più vicino che mi è venuta in mente, ma mi sto "PLS-00428: una clausola INTO è previsto in questa SELECT"

DECLARE 
    myname varchar2(20); 
BEGIN 
    myname := 'Tom'; 

    select myname from DUAL; 
END; 

Questo è un esempio migliore di quello sto davvero cercando di fare:

DECLARE 
    myname varchar2(20); 
BEGIN 
    myname := 'Tom'; 

    SELECT * 
    FROM Customers 
    WHERE Name = myname; 
END; 

Ma ancora una volta, vuole un 'in', quando in realtà voglio solo i record stampati sullo schermo, non memorizzato in un altro tavolo ....

risolto :

Grazie a @ Allan, ho funzionato abbastanza bene. Oracle SQL Developer apparentemente ricorda i valori dei parametri con i quali viene fornito. PL/SQL Developer, però, non vuole avere niente a che fare con questo ....

enter image description here

Se "Esegui come Script", sarà rispettare le impostazioni predefinite, ma restituisce solo i risultati come testo ASCI , non in una griglia/foglio

enter image description here

+0

Questa è l'io più vicino trovato alla mia risposta, ma non mostrano come utilizzare la variabile all'interno dell'elenco di selezione della query e che continua a generare errori. http://plsql-tutorial.com/plsql-variables.htm –

+0

Ci sono due problemi nell'ultima parte di codice. 1) Non sono necessari i due punti davanti alla variabile, né nell'assegnazione né nell'istruzione SELECT. 2) Il risultato dell'istruzione SELECT deve andare da qualche parte, ad es. dichiari una seconda variabile e scrivi 'SELECT Name INTO Name2 FROM DUAL'. – Codo

+0

Cosa succede se non voglio che i risultati vadano da qualche parte, voglio solo che vengano visualizzati in una griglia in PL/SQL Developer? –

risposta

18

risposta Revised

Se non stai chiamando questo codice da un altro programma, una possibilità è quella di ignorare PL/SQL e farlo rigorosamente in SQL utilizzando variabili di bind:

var myname varchar2(20); 

exec :myname := 'Tom'; 

SELECT * 
FROM Customers 
WHERE Name = :myname; 

In molti strumenti (come Toad e SQL Developer), omettendo le dichiarazioni var e exec, il programma richiederà all'utente il valore.


risposta originale

Una grande differenza tra T-SQL e PL/SQL è che Oracle non consente ritorni implicitamente il risultato di una query. Il risultato deve sempre essere restituito esplicitamente in qualche modo. Il modo più semplice è quello di utilizzare DBMS_OUTPUT (più o meno equivalente a print) all'uscita variabile:

DECLARE 
    myname varchar2(20); 
BEGIN 
    myname := 'Tom'; 

    dbms_output.print_line(myname); 
END; 

Questo non è molto utile se si sta cercando di restituire un set di risultati, però. In tal caso, dovrai anche restituire una raccolta o un refcursor. Tuttavia, l'utilizzo di una di queste soluzioni richiede il wrapping del codice in una funzione o procedura e l'esecuzione della funzione/procedura da qualcosa che è in grado di consumare i risultati. Una funzione che ha lavorato in questo modo potrebbe essere simile a questo:

CREATE FUNCTION my_function (myname in varchar2) 
    my_refcursor out sys_refcursor 
BEGIN 
    open my_refcursor for 
    SELECT * 
    FROM Customers 
    WHERE Name = myname; 

    return my_refcursor; 
END my_function; 
+0

Penso che il tuo terzo esempio sia quello che sto cercando. Come dovrei eseguirlo nello sviluppatore PL/SQL? Se utilizzo questa sintassi, ottengo "un'istruzione SQL non valida" sulla riga var? O devo solo usare il rospo? –

+0

Inizialmente ho lasciato un colon dell'istruzione 'exec'. Con i due punti, se "Esegui script" dovrebbe funzionare in SQL Developer, ma i risultati verranno visualizzati nel riquadro Output dello script, anziché nella griglia dei risultati della query. Data la sperimentazione limitata, l'unico modo per scoprirlo sulla griglia è di omettere le istruzioni 'var' e' exec' e lasciare che SQL Developer richieda un valore. – Allan

+0

Continuo a ricevere "ORA-01008: non tutte le variabili vincolate". Dovrei farlo funzionare come una "finestra SQL" o una "finestra di test" o qualche altra finestra? –

1
+0

Forse non sto facendo la domanda giusta. In base al tuo link, ottengo come assegnare il valore, ma come selezionarlo e mostrarlo in un set di risultati? –

+0

Cosa intendi per mostrarlo in un set di risultati? vuoi selezionare il valore come una funzione? – rkosegi

+0

Aggiornato la coda della domanda con un esempio migliore di ciò che sto cercando di fare/rispondere alla tua domanda di follow-up. –

4

In Oracle PL/SQL, se si esegue una query che può restituire più righe, è necessario un cursore per scorrere i risultati. Il modo più semplice è con un ciclo, ad esempio:

declare 
    myname varchar2(20) := 'tom'; 
begin 
    for result_cursor in (select * from mytable where first_name = myname) loop 
    dbms_output.put_line(result_cursor.first_name); 
    dbms_output.put_line(result_cursor.other_field); 
    end loop; 
end; 

Se si dispone di una query che restituisce esattamente una riga, quindi è possibile utilizzare la sintassi select...into..., ad esempio:

declare 
    myname varchar2(20); 
begin 
    select first_name into myname 
    from mytable 
    where person_id = 123; 
end; 
Problemi correlati