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

È stato utile?

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;
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top