Можно ли использовать объект в качестве параметра UDF в Oracle / SQL? - PullRequest
0 голосов
/ 11 ноября 2018

Есть ли способ использовать объект в качестве входного параметра UDF? Как я пытаюсь ниже:

CREATE OR REPLACE TYPE fv_group as object(
fv NUMBER,
group_number INTEGER
);
/

CREATE OR REPLACE TYPE fv_group_array IS VARRAY(100) OF fv_group;


CREATE OR REPLACE PROCEDURE insert_groupby(FV NUMBER, fv_and_group IN OUT fv_group_array) IS
    g fv_group;
BEGIN
    IF fv < 15 THEN
        g := fv_group(fv,1);
    ELSE
        g := fv_group(fv,2);
    END IF;

    fv_and_group.extend(1);
    fv_and_group(fv_and_group.last) := g;
END;
/

declare
    obj fv_group_array := fv_group_array();
begin
    select insert_groupby(c.fv,obj)
    from   cophir c;
end; 
/

Когда я выполняю код выше, я получаю ошибку PL / SQL: ORA-00904 .

PS .. Настольный копфир:

SQL> desc cophir
 Nome                          Tipo

 FV                         NUMBER(38)

 ID                         NUMBER(38)

1 Ответ

0 голосов
/ 11 ноября 2018

Чтобы ответить на ваш вопрос: да, вы можете передавать объекты в UDF. Но это не твоя проблема.

В анонимном блоке в конце вашего кода вы получили утверждение

select insert_groupby(c.fv,obj)
  from   cophir c;

Однако insert_groupby - это процедура. Процедуры нельзя вызывать из операторов SQL, поскольку они не возвращают значение. Возможно, вы сможете изменить insert_groupby на функцию, но вам нужно выяснить, что она должна возвращать.

Другой вариант - использовать цикл:

declare
  obj fv_group_array := fv_group_array();
begin
  FOR aRow IN (SELECT fv FROM cophir)
  LOOP
    insert_groupby(aRow.fv, obj);
  END LOOP;
end; 

Удачи.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...