我正在尝试使用 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表的每个值插入到一个vararray中,该变量保存其值和相应的组。 在变量数组加载了所有值及其相应的组后,我想对它们进行分组。是否可以在查询中执行此操作? 提前致谢!
最佳答案
grouping is a type. What is wrong?
分组为an Oracle keyword 。如果您将类型重命名为 FV_GROUPING,您将解决 PLS-00488。这将使您可以自由地解决代码中的所有其他语法错误:
- 对象类型未在查询中正确实例化。
- 嵌入 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
变量。
关于sql - PLS-00488 : object "string" must be a type or subtype - but it is a type,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53201359/