2009-10-29 25 views
7

Sto utilizzando Oracle SQL Developer, ma sto riscontrando un problema nel vedere i risultati di un pacchetto che restituisce un cursore di riferimento. Qui di seguito è la definizione del pacchetto:Utilizzo del cursore di riferimento in Oracle SQL Developer

CREATE OR REPLACE package instance.lswkt_chgoff_recov 
as 
     type rec_type is record 
      (
      source_cd      lswk_tpr.gltrans.tpr_source_cd%TYPE, 
      as_of_dt      lswk_tpr.gltrans.tpr_as_of_dt%TYPE, 
      chrg_off_recov     varchar2(5), 
      process_dt      lswk_tpr.gltrans.dtgltran%TYPE, 
      effect_dt      lswk_tpr.gltrans.dtgltran%TYPE, 
      account_nbr      lswk_tpr.contract.lcontid%TYPE, 
      naics_cd      lswk_tpr.udfdata.sdata%TYPE, 
      prod_type      varchar2(20), 
      off_nbr       lswk_tpr.schedule.sctrcdty%TYPE, 
      borrower_nm      lswk_tpr.customer.scustnm%TYPE, 
      tran_type_cd     lswk_tpr.gltrans.sglcd%TYPE, 
      tran_type_desc     lswk_tpr.gltrans.sglcd%TYPE, 
      tran_amt      lswk_tpr.gltrans.ctranamt%TYPE, 
      note_dt       lswk_tpr.schedule.dtbk%TYPE, 
      accru_cd      number, 
      non_accr_cd      lswk_tpr.schedule.dtlstincsus%TYPE, 
      comm_sb_ind      varchar2(4) 
      ); 

     type cur_type is ref cursor return rec_type; 

     procedure sp 
      (
      p_as_of_dt    in  date, 
      ref_cur     in out cur_type 
      ); 
end; 
/

Credo che la domanda è questo possibile ed in caso affermativo, che cosa devo fare. Sto usando Oracle SQL Developer 1.5.5. Grazie.

Wade

Ecco il codice che ho usato per chiamare il mio pacchetto (generato da TOAD):

DECLARE 
    P_AS_OF_DT DATE; 
    REF_CUR instance.LSWKT_CHGOFF_RECOV.CUR_TYPE; 
    REF_CUR_row REF_CUR%ROWTYPE; 

BEGIN 
    P_AS_OF_DT := '31-AUG-2009'; 

    instance.LSWKT_CHGOFF_RECOV.SP (P_AS_OF_DT, REF_CUR); 

    DBMS_OUTPUT.Put_Line('REF_CUR ='); 
    IF REF_CUR%ISOPEN THEN 
    DBMS_OUTPUT.Put_Line(' SOURCE_CD AS_OF_DT CHRG_OFF_RECOV PROCESS_DT EFFECT_DT ACCOUNT_NBR NAICS_CD PROD_TYPE OFF_NBR BORROWER_NM TRAN_TYPE_CD TRAN_TYPE_DESC TRAN_AMT NOTE_DT ACCRU_CD NON_ACCR_CD COMM_SB_IND'); 
    LOOP 
     FETCH REF_CUR INTO REF_CUR_row; 
     EXIT WHEN REF_CUR%NOTFOUND; 
     DBMS_OUTPUT.Put_Line(
      ' ' || '[TPR_SOURCE_CD%type]' 
     || ' ' || '[TPR_AS_OF_DT%type]' 
     || ' ' || '''' || REF_CUR_row.CHRG_OFF_RECOV || '''' 
     || ' ' || '[DTGLTRAN%type]' 
     || ' ' || '[DTGLTRAN%type]' 
     || ' ' || '[LCONTID%type]' 
     || ' ' || '[SDATA%type]' 
     || ' ' || '''' || REF_CUR_row.PROD_TYPE || '''' 
     || ' ' || '[SCTRCDTY%type]' 
     || ' ' || '[SCUSTNM%type]' 
     || ' ' || '[SGLCD%type]' 
     || ' ' || '[SGLCD%type]' 
     || ' ' || '[CTRANAMT%type]' 
     || ' ' || '[DTBK%type]' 
     || ' ' || NVL(TO_CHAR(REF_CUR_row.ACCRU_CD), 'NULL') 
     || ' ' || '[DTLSTINCSUS%type]' 
     || ' ' || '''' || REF_CUR_row.COMM_SB_IND || ''''); 
    END LOOP; 
    ELSE 
    DBMS_OUTPUT.Put_line(' (Ref Cursor is closed)'); 
    END IF; 


    COMMIT; 
END; 

ottengo l'errore:

ORA-06502: PL/SQL: numerico o errore di valore

Spero che questo chiarisca un po 'di più.

+0

Tutto quello che vedo è lo spc - dov'è l'albero? –

+0

Che "problema" stai avendo? – kurosch

+0

Il problema che sto avendo è che quando provo a leggere il cursore ref ho degli errori. Ho inserito lo spc solo per mostrare come appare il mio ref cur e spero che qualcuno possa mostrarmi il codice PL/SQL da eseguire in SQL Developer per produrlo. – Wade73

risposta

12

È possibile stampare facilmente i risultati di uscita di un ref_cursor in SQL Developer per vedere il valore di ritorno ..

Ecco un esempio di una funzione refcursor:

create or replace function get_employees() return sys_refcursor as 
    ret_cursor sys_refcursor; 
begin 
    open ret_cursor for 
    select * from employees; 
    return ret_cursor; 
end get_employees; 

metodo rapido e sporco:

select get_employees() from dual; 

pulito e ordinato metodo:

variable v_ref_cursor refcursor; 
exec :v_ref_cursor := get_employees(); 
print :v_ref_cursor 
.210
0

Basta creare un ciclo che itera attraverso il cursore di riferimento restituito. È possibile eseguire l'output sulla console utilizzando DBMS_OUTPUT.PUT_LINE() e scegliendo campi specifici da mostrare.

+0

Ho apportato una modifica sopra, poiché non sembra funzionare. – Wade73

0

L'unico valore esplicito che vedo nel programma generato è

P_AS_OF_DT := '31-AUG-2009'; 

Prova a una conversione esplicita (to_date ('31-AUG-2009', 'DD-MON-YYYY') invece, forse che si sbarazza del problema.

Se questo non aiuta , puoi vedere se il tuo errore è generato nello sp o nel tuo codice? Se non riesci a capirlo direttamente, definisci una sp dal codice che hai, imposta un breakpoint e passa attraverso il codice per vedere dove viene l'errore da

0

Non c'è modo di dire senza vedere quale sia la query del cursore. Dai un'occhiata alla dichiarazione SELECT che stai utilizzando nella procedura SP. Una delle colonne che stai selezionando in un campo numerico in rec_type sta restituendo i dati dei caratteri, che non possono essere convertiti in un numero.

Invece di cercare di capire come emettere il cursore, prendere l'istruzione SELECT da sp ed eseguirlo da solo. Guarda in basso i risultati che ottieni. Stai per cercare valori non numerici che tornano in uno dei campi in cui ti aspetti un numero.

1

Nel suo commento si sayHere è l'errore:

ORA-06502: PL/SQL: numeric or value error ORA-06512: at line 16

Qualunque cosa può apparire come a volte, gli errori di PL/SQL non sono generati casualmente. Questo errore indica una conversione del tipo di dati imperfetto che si verifica alla riga 16 della procedura. Senza vedere la tua intera procedura non è possibile per noi individuare la linea 16.Fortunatamente l'editor di codice in SQL Developer inserirà i numeri di linea nella grondaia; se non visualizzi i numeri di riga dovrai alternare una preferenza.

Quello che dovete cercare è una stringa di essere lanciato a una variabile numero o una data, o un numero di essere gettato in un campo della data. Questo può essere segnalato da un esplicito TO_NUMBER() o TO_DATE, nel qual caso è necessario controllare la maschera di formato e/o il contenuto dei dati. In alternativa potresti avere un cast implicito. In tal caso potrebbe essere necessario renderlo esplicito, con la maschera di formato appropriata. Naturalmente potrebbe trattarsi di una conversione accidentale e indesiderata perché la proiezione dell'istruzione SELECT non corrisponde alla firma del record REF CURSOR. È facile da risolvere.

8

Se si dispone di una procedura che richiede un refcursor nella firma del proc, si può fare questo:

var rc refcursor; 
execute <package>.my_proc(:rc); 
print rc; 

Evidenziare e premere F5.

Problemi correlati