sql - PLS-00488 : object "string" must be a type or subtype - but it is a type

标签 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表的每个值插入到一个vararray中,该变量保存其值和相应的组。 在变量数组加载了所有值及其相应的组后,我想对它们进行分组。是否可以在查询中执行此操作? 提前致谢!

最佳答案

grouping is a type. What is wrong?

分组为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 变量。

关于sql - PLS-00488 : object "string" must be a type or subtype - but it is a type,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53201359/

相关文章:

sql - 通过 dblink 调用存储过程

java - 将数组从 Java 传递到 PLSQL 存储过程

sql - Snowflake SQL 编译错误 : View Definition Declared but view Query Produced

sql - case 语句中的 count 函数

sql - SQL 查询中的汇总和总发票数据

oracle - 如何在PL/SQL中比较字符串?

mysql - 订购了最多共同产品的夫妇 - SQL

c# - 如何使用 ADO.NET 实现嵌套 SQL 事务?

node.js - 无法使用 NodeJS 从表中检索数据。错误: ORA-12560: TNS:protocol adapter error

oracle - PL/SQL 输入验证技术/实用程序