2011-09-26 14 views
26

In SQL Server possiamo usare questa:Dichiarazione di una variabile e impostando il suo valore da una query SELECT in Oracle

DECLARE @variable INT; 
SELECT @variable= mycolumn from myTable; 

Come posso fare lo stesso in Oracle? Attualmente sto facendo il seguente:

DECLARE COMPID VARCHAR2(20); 
SELECT companyid INTO COMPID from app where appid='90' and rownum=1; 

Perché questo non è di lavoro?

enter image description here

+0

Qualche idea su come questo possa funzionare per i tipi come oggetti? – Avias

risposta

54

SELECT INTO

DECLARE 
    the_variable NUMBER; 

BEGIN 
    SELECT my_column INTO the_variable FROM my_table; 
END; 

Assicurarsi che la query restituisce solo una singola riga:

Per impostazione predefinita, un'istruzione SELECT INTO deve restituire solo una riga. In caso contrario, PL/SQL solleva l'eccezione predefinita TOO_MANY_ROWS e i valori delle variabili nella clausola INTO non sono definiti. Assicurati che la tua clausola WHERE sia sufficientemente specifica per corrispondere solo a una riga

Se non viene restituita alcuna riga, PL/SQL genera NO_DATA_FOUND. È possibile evitare questa eccezione selezionando il risultato di una funzione di aggregazione, ad esempio COUNT (*) o AVG(), dove possibile. Queste funzioni sono garantite per restituire un singolo valore, anche se nessuna riga corrisponde alla condizione.

Un'istruzione SELECT ... BULK COLLECT INTO può restituire più righe. È necessario impostare le variabili di raccolta per contenere i risultati. È possibile dichiarare array associativi o tabelle nidificate che crescono secondo necessità per contenere l'intero set di risultati.

Il cursore SQL implicito e i relativi attributi% NOTFOUND,% FOUND,% ROWCOUNT e% ISOPEN forniscono informazioni sull'esecuzione di un'istruzione SELECT INTO.

+0

DECLARE COMPID VARCHAR2 (20); SELECT companyid INTO COMPID da sasapplication dove appid = '90 'e rownum = 1; Puoi dire perché questo SQL sta generando l'errore – user960567

+0

e il messaggio di errore sarebbe? – Thilo

+0

basta vedere sopra. – user960567

4

Non del tutto sicuro di quello che sono dopo, ma in PL/SQL si farebbe semplicemente

DECLARE 
    v_variable INTEGER; 
BEGIN 
    SELECT mycolumn 
    INTO v_variable 
    FROM myTable; 
END; 

Ollie.

+0

Come afferma @Thilo, c'è altro da considerare attorno a questa specifica sintassi. Un po 'più di informazioni su ciò che stai cercando di ottenere ci consentirebbe di personalizzare un metodo migliore per popolare la tua variabile. – Ollie

0

ORA-01422: esatto recuperare rendimenti più di numero richiesto di righe

se non si specifica il record esatto utilizzando cui condizioni, si otterrà l'eccezione sopra

DECLARE 
    ID NUMBER; 
BEGIN 
    select eid into id from employee where salary=26500; 
    DBMS_OUTPUT.PUT_LINE(ID); 
END; 
0

Per memorizzare un'uscita a riga singola in una variabile dalla selezione alla query:

declare v_username varchare (20); SELEZIONA il nome utente in v_username Dagli utenti WHERE user_id = '7';

questo memorizzerà il valore di un singolo record nella variabile v_username.


Per memorizzare uscita più righe in una variabile da selezionare in query:

è necessario utilizzare la funzione listagg.listagg concatena le righe risultanti di una colonna in una singola colonna e anche per differenziarle puoi usare un simbolo speciale. utilizza la query come sotto SELECT listagg (nome utente || ',') all'interno di un gruppo (ordine per nome utente) in utenti v_username FROM;

0

Un punto supplementare:

Quando si esegue la conversione tsql a plsql bisogna preoccuparsi no_data_found eccezione

DECLARE 
    v_var NUMBER; 
BEGIN 
    SELECT clmn INTO v_var FROM tbl; 
Exception when no_data_found then v_var := null; --what ever handle the exception. 
END; 

In tsql se no data found allora la variabile sarà null ma nessuna exception

Problemi correlati