Query nella procedura PLSQL deve restituire 1 fila, ma tornare più righe
Domanda
Ho un problema strano attuazione PL / SQL procedura.
La mia procedura ha parametro di input quattro varchar, ed estratti da una tabella un valore id con una query come questa:
SELECT ID INTO idvar FROM TABLE T WHERE T.NAME = pn AND T.SUR = ln;
In questa tabella, il nome e sur sono chiave univoca. Così per un paio di parametro di input (pn, ln), mi aspetto di ottenere solo una riga, ma non è così. Infatti, sembra che solo la prima condizione elaborato, e il secondo no.
Nel mio tavolo ho, questa riga di test:
ID | NAME | SUR
1 | JO | SOME THING
2 | JO | OTHER ONE
3 | BO | SOME THING
Se nella mia procedura passo
('JO', 'SOME THING')
ottengo ID: 1 e 2.
Ma se mi passa i valori
('BO', 'SOME THING')
ottengo solo ID 3.
Chiaramente, con precedente errore ottenuto domanda che ORA-01422, quindi sostituirla con una definizione cursore prima, e un "per riga (query)" più avanti:
CURSOR C IS
SELECT ID FROM TABLE T WHERE T.NAME = pn AND T.SUR = ln;
Questo comportamento è strano per me, infatti se io exec solo query da sqlplus o rospo, ottengo risultato corretto.
versione Oracle è 8.1.
Grazie in anticipo
#Questa è la mia procedura (spero non trovate disallineamento, perché ho cambiato nome degli oggetti):
CREATE OR REPLACE PROCEDURE myproc (
pn in VARCHAR2,
ln in VARCHAR2,
other in VARCHAR2,
datarif in VARCHAR2
)
AS
idT NUMBER;
idST NUMBER;
idSE NUMBER;
CURSOR C IS
SELECT ID
FROM TABLE T
WHERE
T.NAME = pn AND T.SUR = ln;
BEGIN
for x in ( SELECT ID
FROM TABLE T
WHERE
T.NAME = pn AND T.SUR = ln )
loop
DBMS_OUTPUT.put_line('INFOR:' || x.ID);
end loop;
open C;
loop
fetch C into idT;
exit when C%NOTFOUND;
DBMS_OUTPUT.put_line('INLOOP:ID='||idT);
end loop;
close C;
DBMS_OUTPUT.put_line ( 'OUTLOOP: ID='||idT );
EXCEPTION
WHEN NO_DATA_FOUND THEN
NULL;
WHEN TOO_MANY_ROWS THEN
RAISE_APPLICATION_ERROR(-20001, 'Exact Fetch Returned many Rows');
WHEN OTHERS THEN
DBMS_OUTPUT.put_line('ERROR');
ROLLBACK;
RAISE;
END myproc;
/
Grazie
Soluzione
Forse c'è uno scontro tra i parametri ei campi della tabella?
Cambia aggiungendo il nome della procedura portata per i parametri:
T.NAME = myproc.pn AND T.SUR = myproc.ln
Altri suggerimenti
"... perché ho cambiato nome degli oggetti"
Forse alcuni dei vostri parametri hanno gli stessi nomi di alcune colonne.
Per esempio se il procedimento si presentava così:
CREATE OR REPLACE PROCEDURE myproc (
pn in VARCHAR2,
sur in VARCHAR2,
other in VARCHAR2,
datarif in VARCHAR2
)
...
SELECT ID INTO idvar FROM TABLE T WHERE T.NAME = pn AND T.SUR = sur;
...
si otterrebbe errore TOO_MANY_ROWS perché la condizione "T.SUR = sur" avrebbe avuto lo stesso effetto di "T.SUR = T.SUR".
Ho testato la tua prima dichiarazione con la vostra tabella di esempio! E sulla mia macchina funziona. Ma questo è un Oracle Database 10g.
Modifica : I ri-writed la vostra procedura e sulla mia macchina che la versione funziona bene!
create or replace
PROCEDURE myproc (
pn in VARCHAR2,
ln in VARCHAR2,
other in VARCHAR2,
datarif in VARCHAR2
)
AS
idvar NUMBER;
BEGIN
SELECT ID INTO idvar FROM TEST T WHERE T.NAME = pn AND T.SUR = ln;
DBMS_OUTPUT.put_line ( 'OUTLOOP: ID='||idvar );
END myproc;