2009-10-29 24 views
7

Estoy usando Oracle SQL Developer, pero estoy teniendo un problema al ver los resultados de un paquete que devuelve un cursor de referencia. A continuación se muestra la definición del paquete:Usando el Cursor de Ref en 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; 
/

Supongo que la pregunta es esto posible y si es así, ¿qué es lo que hay que hacer. Estoy usando Oracle SQL Developer 1.5.5. Gracias.

Wade

Aquí está el código que yo solía llamar mi paquete (generada por SAPO):

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; 

me sale el error:

ORA-06502: PL/SQL: numérico o error de valor

Espero que esto lo aclare un poco más.

+0

Todo lo que veo es el spc - ¿dónde está el bdy? –

+0

¿Qué "problema" estás teniendo? – kurosch

+0

El problema que estoy teniendo es que cuando trato de leer el cursor de referencia obtengo errores. Puse el spc solo para mostrar cómo se ve mi ref y, con suerte, alguien me puede mostrar el código PL/SQL para ejecutarlo en SQL Developer y sacarlo. – Wade73

Respuesta

12

se pueden imprimir fácilmente los resultados de salida de un ref_cursor en SQL Developer para ver el valor de retorno ..

He aquí un ejemplo de una función 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; 

método rápido y sucio:

select get_employees() from dual; 

método Neat y ordenado:

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

Simplemente haga un ciclo que itere a través del cursor de ref regresado. Puede enviar a la consola usando DBMS_OUTPUT.PUT_LINE() y elegir campos específicos para mostrar.

+0

He realizado una modificación anteriormente, ya que parece que no funciona. – Wade73

0

El único valor explícito que veo en el programa generado es

P_AS_OF_DT := '31-AUG-2009'; 

Try a una conversión explícita (to_date ('31-AUG-2009', 'DD-MON-YYYY') lugar, tal vez que se deshace del problema.

Si eso no ayuda , ¿puedes ver si tu error se genera en el código sp o en yor? Si no puedes resolverlo directamente, define un sp del código que tienes, establece un punto de interrupción y paso por el código para ver dónde viene el error desde.

0

No hay forma de decir sin ver cuál es la consulta del cursor. Eche un vistazo a la instrucción SELECT que está ejecutando en el procedimiento SP. Una de las columnas que está seleccionando en un campo numérico en rec_type es devolver datos de caracteres, que no se pueden convertir a un número.

En lugar de tratar de averiguar cómo generar el cursor, tome la instrucción SELECT de sp y ejecútela de forma autónoma. Mira los resultados que obtienes. Buscará algunos valores que no sean dígitos que regresen en uno de los campos donde espera un número.

1

En su comentario que sayHere es el error:

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

Sea lo que puede aparecer como a veces, los errores de PL/SQL no se generan aleatoriamente. Este error apunta a una conversión de tipo de datos defectuosa que ocurre en la línea 16 de su procedimiento. Sin ver todo su procedimiento, no es posible identificar la línea 16.Afortunadamente, el Editor de Código en SQL Developer pondrá los números de línea en la cuneta; si no está viendo los números de línea, deberá alternar una preferencia.

Lo que debe buscar es una secuencia que se envía a un número o variable de fecha, o un número que se convierte en un campo de fecha. Esto puede ser señalado por un TO_NUMBER() o un TO_DATE explícitos, en cuyo caso debe verificar la máscara de formato y/o el contenido de datos. Alternativamente, puede tener un elenco implícito. En ese caso, puede necesitar hacerlo explícito, con la máscara de formato apropiada. Por supuesto, podría tratarse de una conversión accidental y no deseada porque la proyección de la instrucción SELECT no coincide con la firma del registro REF CURSOR. Eso es fácil de arreglar.

8

Si usted tiene un procedimiento que requiere una refcursor en la firma del proc, se puede hacer esto:

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

Resalte y presione F5.

Cuestiones relacionadas