Как встроить переменную типа записи во время вызова процедуры? - PullRequest
0 голосов
/ 10 июля 2019

Я пытаюсь передать оператор SELECT напрямую в качестве параметра хранимой процедуры, но не могу.Если я добавлю локальную переменную и Select INTO, она будет работать нормально.

Вот пример:

DECLARE
    something MyTable%ROWTYPE;
    PROCEDURE Test(param IN MyTable%ROWTYPE) as
    BEGIN
        ...
    END;
BEGIN
    SELECT 
      SYS_GUID() as ID,
      'X' as COLUMN1,
      'Y' as COLUMN2,
      'Z' as COLUMN3
      INTO something
      FROM DUAL
      WHERE rownum < 2;

    Test(something);
END;

Это работает нормально, как и ожидалось, но если я попытаюсьвставьте переменную something, произойдет сбой:

DECLARE
    PROCEDURE Test(param IN MyTable%ROWTYPE) as
    BEGIN
        ...
    END;
BEGIN
    Test((SELECT 
      SYS_GUID() as ID,
      'X' as COLUMN1,
      'Y' as COLUMN2,
      'Z' as COLUMN3
      FROM DUAL
      WHERE rownum < 2));
END;

ORA-06550: строка 11, столбец 11: PLS-00103: Обнаружен символ «ВЫБОР» при ожидании одного из следующих действий:

(- + case мод новый, не нулевой, продолжить среднее число текущих существует макс. Мин. Ранее sql отклонение суммы stddev выполнить за все время слияния интервал времени отметка даты конвейер

  • & - +; / at для остатка мода rem иили группа с пересекающимся объединением начала минус порядка, где connect || multiset

Почему он не принимает мой встроенный оператор выбора, а работает при сохранении результата в переменную? Что мне нужно сделать?позволить встроенному оператору работать так, как я собираюсь?

1 Ответ

2 голосов
/ 10 июля 2019

Oracle не может напрямую использовать операторы SQL в выражениях PL / SQL . (Хотя это возможно в Postgres и, возможно, в других системах баз данных.)

Если вы хотите передать SQL-операторы, может быть проще использовать SYS_REFCURSOR, например:

CREATE TABLE mytable(id varchar2(32), x varchar2(1), y varchar2(1), z varchar2(1));

DECLARE
    v_cursor SYS_REFCURSOR;

    something MyTable%ROWTYPE;
    PROCEDURE Test(p_cursor sys_refcursor) as
    BEGIN
        FETCH p_cursor INTO something;
        dbms_output.put_line(something.id);
    END;
BEGIN
    OPEN v_cursor for
    SELECT 
        SYS_GUID() as ID,
        'X' as COLUMN1,
        'Y' as COLUMN2,
        'Z' as COLUMN3
        INTO something
        FROM DUAL;

    Test(v_cursor);
END;
/
...