2011-01-12 3 views
1

Я пытаюсь вызвать Oracle хранимую процедуру, используя SQL Developer. Функция proc выводит результаты с использованием sys_refcursor. Я нажимаю правой кнопкой мыши в окне proc, которое выводит окно Run PL/SQL. Когда я выбираю proc, я хочу, чтобы он создал все входные параметры и т. Д. Для меня. Ниже приведен код, который я использую, чтобы попытаться выполнить цикл sys_refcursor и вывести результаты, но я получаю сообщение об ошибке «v_rec v_Return% rowtype;» line:Результаты вывода Oracle хранимой процедуры из SQL Developer

ORA-06550: строка 6 column 9: PLS-00320: объявление типа этого выражения является неполным или искаженным. ORA-06550: строка 6 колонок 9: PL/SQL: Пункт игнорировал

код поставщика 6550

Я нашел зацикливание кода на пару других сайтов, и это, кажется, способ сделать это, но это не работает для меня независимо от того, что я пытаюсь. Другой вопрос - на DBMS_OUTPUT.PUT_LINE ('name =' || v_rec.ADM) я ссылаюсь на v_rec правильно, то есть v_rec. "Column_name" правильный путь ??

Я не привык к Oracle и никогда не использовал SQL plus. Любые предложения оценили.

DECLARE 
    P_CAE_SEC_ID_N NUMBER; 
    P_PAGE_INDEX NUMBER; 
    P_PAGE_SIZE NUMBER; 
    v_Return sys_refcursor; 
    v_rec v_Return%rowtype; 
BEGIN 
    P_CAE_SEC_ID_N := NULL; 
    P_PAGE_INDEX := 0; 
    P_PAGE_SIZE := 25; 

    CAE_FOF_SECURITY_PKG.GET_LIST_FOF_SECURITY(
    P_CAE_SEC_ID_N => P_CAE_SEC_ID_N, 
    P_PAGE_INDEX => P_PAGE_INDEX, 
    P_PAGE_SIZE => P_PAGE_SIZE, 
    P_FOF_SEC_REFCUR => v_Return 
); 
    -- Modify the code to output the variable 
    -- DBMS_OUTPUT.PUT_LINE('P_FOF_SEC_REFCUR = '); 
    loop 
    fetch v_Return into v_rec; 
    exit when v_Return%notfound; 
    DBMS_OUTPUT.PUT_LINE('name = ' || v_rec.ADM); 
    end loop; 

END; 

ответ

4

Ваша проблема здесь:

v_Return sys_refcursor; 
v_rec v_Return%rowtype; 

v_Return является переменной курсора и не имеет специфическую структуру (список столбцов), так v_Return% ROWTYPE не является допустимым структура записи объявить v_rec. Даже при разных вызовах процедуры можно возвращать курсоры с разными структурами.

Вы знаете, что вы ожидаете от структуры возвращаемого курсора (но не Oracle), поэтому вам нужно явно определить соответствующую структуру записи, например.

type t_row is record (empno number, ename varchar2(30)); 
v_rec t_row; 
3

Чтобы определить его как% ROWTYPE, вам понадобится строго типизированный указатель курсора.

Пример here

0

@Tony Andrews спасибо за это он дал мне лучшее представление о том, где я собирался неправильно. Все еще есть проблемы, хотя - вот сокращенная версия моего proc. Это немного сложно в том, что он выбирающий все поля из подзапроса и 2 других значений:

open p_fof_sec_refcur for  

SELECT * 
FROM( 
    SELECT securities.*, rownum rnum, v_total_count 
    FROM 
     (
     SELECT 
      CFS.CAE_SEC_ID, 
      CFS.FM_SEC_CODE, 
      ... 
     FROM 
     CAEDBO.CAE_FOF_SECURITY CFS 
     INNER JOIN caedbo.CAE_DATA_SET_ELEMENT CDSE_STAT 
      ON (CDSE_STAT.DATA_SET_ELEMENT_ID = CFS.APPR_STATUS) 
     ... 
     WHERE APPR_STATUS = NVL(p_appr_status, APPR_STATUS) 
     ... 
     )securities 
    ) 

    WHERE rnum between v_pgStart and v_pgEnd; 

я явно определил выходную структуру, как показано ниже, чтобы соответствовать возвращаемые полям из прока, но я все еще получаю ошибку:

v_Return sys_refcursor; 
type t_row is record (CAE_SEC_ID NUMBER,FM_SEC_CODE VARCHAR2(7),...rnum number, v_total_count number); 
v_rec t_row; 

ошибки я получаю

ORA-06504: PL/SQL: Return types of Result Set variables or query do not match 
ORA-06512: at line 45 

Я просто интересно, это "ROWNUM rnum, v_total_count" часть расцепления меня. Я уверен, что все остальные поля в структуре вывода корректны, поскольку я скопировал их непосредственно из proc.

Смежные вопросы