【问题标题】:Is it possible to use an object as the parameter of a UDF in Oracle/SQL?是否可以在 Oracle/SQL 中使用对象作为 UDF 的参数?
【发布时间】:2019-04-14 01:46:25
【问题描述】:

有没有办法将对象用作 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 .. 表 cophi:

SQL> desc cophir
 Nome                          Tipo

 FV                         NUMBER(38)

 ID                         NUMBER(38)

【问题讨论】:

  • cophir 是如何定义的?
  • 将此信息添加到问题中。

标签: oracle stored-procedures plsql oracle12c


【解决方案1】:

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

祝你好运。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-05-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多