2009-10-29 5 views
7

J'utilise Oracle SQL Developer, mais je rencontre un problème en voyant les résultats d'un package qui renvoie un curseur ref. Ci-dessous la définition du package:Utilisation de Ref Cursor dans 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; 
/

Je suppose que la question est-ce possible et si oui, que dois-je faire. J'utilise Oracle SQL Developer 1.5.5. Merci.

Wade

Voici le code que je l'habitude d'appeler mon paquet (généré par 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; 

Je reçois l'erreur:

ORA-06502: PL/SQL: numérique ou erreur de valeur

Espérons que cela efface un peu plus.

+0

Tout ce que je vois est le spc - où est le bdy? –

+0

De quel "problème" avez-vous? – kurosch

+0

Le problème que je rencontre est que lorsque j'essaie de lire le curseur ref, j'obtiens des erreurs. J'ai placé le spc juste pour montrer à quoi ressemble mon ref et j'espère que quelqu'un peut me montrer le code PL/SQL à exécuter dans SQL Developer pour le sortir. – Wade73

Répondre

12

Vous pouvez facilement imprimer les résultats de sortie d'un ref_cursor dans SQL Developer pour voir la valeur de retour ..

Voici un exemple d'une refcursor Fonction:

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; 

Méthode rapide et sale:

select get_employees() from dual; 

procédé Propre et bien rangé:

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

Juste faire une boucle qui itère à travers le curseur ref renvoyé. Vous pouvez sortir sur la console en utilisant DBMS_OUTPUT.PUT_LINE() et en choisissant des champs spécifiques à afficher.

+0

J'ai fait une modification ci-dessus, car cela ne semble pas fonctionner. – Wade73

0

La seule valeur explicite que je vois dans le programme généré est

P_AS_OF_DT := '31-AUG-2009'; 

Essayez une conversion explicite (au lieu to_date ('31-AUG-2009', 'DD-MON-YYYY'), peut-être qui se débarrasse du problème.

Si cela ne vous aide pas , pouvez-vous voir si votre erreur est générée dans le code sp ou dans yor? Si vous ne pouvez pas comprendre cela directement, définissez un sp du code que vous avez, définissez un point d'arrêt et parcourez le code pour voir où l'erreur vient

0

Il n'y a pas façon de dire sans voir ce que la requête du curseur est. Jetez un oeil à l'instruction SELECT que vous utilisez dans la procédure SP. L'une des colonnes que vous sélectionnez dans un champ numérique dans rec_type renvoie des données de caractères, qui ne peuvent pas être converties en nombre. Au lieu d'essayer de comprendre comment afficher le curseur, prenez l'instruction SELECT de sp et exécutez-la de manière autonome. Regardez les résultats que vous obtenez. Vous allez rechercher des valeurs non numériques revenant dans l'un des champs où vous attendez un nombre.

1

Dans votre commentaire, vous sayHere est l'erreur:

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

Quoi qu'il en peut apparaître comme parfois, des erreurs PL/SQL ne sont pas générées au hasard. Cette erreur pointe vers une conversion de type de données erronée qui se produit à la ligne 16 de votre procédure. Sans voir toute votre procédure, il nous est impossible de repérer la ligne 16.Heureusement, l'éditeur de code dans SQL Developer mettra les numéros de ligne dans la gouttière; Si vous ne voyez pas les numéros de ligne, vous devez activer une préférence. Ce que vous devez rechercher est une chaîne en train d'être convertie en une variable de nombre ou de date, ou un nombre étant converti en un champ de date. Cela peut être signalé par un TO_NUMBER() ou TO_DATE explicite, auquel cas vous devez vérifier le masque de format et/ou le contenu de données. Vous pouvez également avoir une distribution implicite. Dans ce cas, vous devrez peut-être le rendre explicite, avec le masque de format approprié. Bien sûr, il peut s'agir d'une conversion accidentelle et indésirable car la projection de l'instruction SELECT ne correspond pas à la signature de l'enregistrement REF CURSOR. C'est facile à réparer.

8

Si vous avez une procédure qui nécessite une refcursor dans la signature du proc, vous pouvez le faire:

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

Mettez en surbrillance et appuyez sur F5.

Questions connexes