Вывод результатов Oracle, хранимых процедур из SQL Developer - PullRequest
1 голос
/ 12 января 2011

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

ORA-06550: строка 6, столбец 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;

Ответы [ 3 ]

4 голосов
/ 12 января 2011

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

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 голосов
/ 12 января 2011

Вам нужен строго типизированный ref-курсор, чтобы определить его как% ROWTYPE.

Пример здесь

0 голосов
/ 13 января 2011

@ Тони Эндрюс, спасибо за это, это дало мне лучшее представление о том, где я ошибаюсь.Все еще возникают проблемы - вот сокращенная версия моего процесса.Это немного сложно, поскольку он выбирает все поля из подзапроса и 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" подвела меня.Я почти уверен, что все остальные поля в структуре вывода правильные, поскольку я скопировал их непосредственно из процедуры.

...