是否可以在Oracle / SQL中将对象用作UDF的参数?

时间:2018-11-10 21:21:28

标签: oracle stored-procedures plsql oracle12c

有没有一种方法可以将对象用作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 ..表coph​​ir:

SQL> desc cophir
 Nome                          Tipo

 FV                         NUMBER(38)

 ID                         NUMBER(38)

1 个答案:

答案 0 :(得分:3)

要回答您的问题:是的,您可以将对象传递给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; 

好运。