PLS-00488:对象“字符串”必须是类型或子类型-但它是类型

时间:2018-11-08 03:57:59

标签: sql oracle plsql oracle12c user-defined-types

我正尝试使用UDT构建句子,如下所示:

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 TYPE fv_grouping AS OBJECT (
 fv_and_group fv_group_array,
 MEMBER PROCEDURE insert_groupby(FV NUMBER),
 MEMBER FUNCTION which_group(FV NUMBER) RETURN INTEGER
);
/

CREATE OR REPLACE TYPE BODY fv_grouping as
 MEMBER PROCEDURE insert_groupby(FV NUMBER) 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;
MEMBER FUNCTION which_group(FV NUMBER) RETURN INTEGER IS
feature NUMBER;
BEGIN
    FOR i IN 1..fv_and_group.count LOOP
        feature := fv_and_group(i).fv;
        IF  fv_and_group(i).fv = fv THEN
            RETURN fv_and_group(i).group_number;
        END IF;
    END LOOP;
    RETURN 0;
END;
END;
/

我需要的表示是:

DECLARE
     obj fv_grouping;
BEGIN

 SELECT :obj.which_group(gb.fv), count(*)
 FROM (
   SELECT :obj.insert_groupby(c.fv, 6, 3)
   from  cophir
   ) gb
   GROUP BY :obj.which_group(gb.fv);

END; 
/

过程insert_groupby将 cophir 表的每个值插入到varray中,并保存其值和相应的组。 在varray加载了所有值及其对应的组之后,我想将它们分组。是否可以在查询中进行? 预先感谢!

1 个答案:

答案 0 :(得分:2)

  

分组是一种类型。怎么了?

组为an Oracle keyword。如果您将类型重命名为FV_GROUPING,则可以解决PLS-00488。这样您就可以自由解决代码中的所有其他语法错误:

  1. 在查询中没有正确实例化对象类型。
  2. 嵌入在PL / SQL中的SELECT语句必须选择一个与查询的投影相匹配的变量。

不确定您的代码试图实现什么,但是此版本的代码可以运行:

DECLARE
     obj fv_grouping;
BEGIN

   SELECT fv_grouping(cast(collect(fv_group(fv, 3)) as fv_group_array))
   into obj
   from  cophir;

   dbms_output.put_line(obj.which_group(2)) ;

END; 
/

这使用COLLECT将fv_group对象收集到fv_group_array实例中,该实例可用于实例化fv_grouping并填充obj变量。