带有索引的类型和表的Oracle关联运算符

时间:2018-02-01 21:17:05

标签: oracle oracle12c

在带有索引的表上调用带有查询的类型构造函数时,Oracle 12C R2(12.2.0.1)是否不支持关联运算符 => ?或者是否有另一种方法来调用构造函数并显式地为属性赋值?

请注意,这适用于11G和12C R1

即。 如果我有一个自定义类型:

CREATE OR REPLACE TYPE T_MY_TYPE FORCE AS OBJECT (
  id     NUMBER(10, 0),
  attribute1 VARCHAR2(60 BYTE),
  attribute2 VARCHAR2(2 BYTE),
  attribute3 VARCHAR2(3 BYTE),
  CONSTRUCTOR FUNCTION T_MY_TYPE RETURN SELF AS RESULT );

和表格一样:

CREATE TABLE my_table (
  idd  NUMBER(10, 0),
  att1 VARCHAR2(60 BYTE),
  att2 NUMBER(4),
  att3 NUMBER(8),
  att4 NUMBER(5)
);

INSERT ALL
INTO my_table (idd, att1, att2, att3, att4) VALUES (1, '123', 3, 4, 4)
INTO my_table (idd, att1, att2, att3, att4) VALUES (2, '123', 7, 4, 4)
INTO my_table (idd, att1, att2, att3, att4) VALUES (3, '234', 5, 4, 4)
  SELECT *
  FROM dual;

我试着用它来查询:

SELECT t_my_type(attribute1 => NULL,
                 id => NULL,
                 attribute2 => NULL,
                 attribute3 => NULL)
FROM my_table mt
WHERE mt.att3 = 1
      OR mt.att3 > 3;

它可以工作,但只要我使用以下命令在attr3上添加索引:

CREATE INDEX myIndex ON my_table (att3);

ORA-06553失败:PLS-306:调用&t; T_MY_TYPE'

时参数的数量或类型错误

请注意,没有关联运算符的类型构造函数没有问题,请参阅:

SELECT t_my_type(NULL,
                 NULL,
                 NULL,
                 NULL)
FROM my_table mt
WHERE mt.att3 = 1
      OR mt.att3 > 3;

1 个答案:

答案 0 :(得分:0)

支持请求已注册为错误,请参阅Bug 27653957 : TYPE CONSTRUCTOR FUNCTION FAILS WITH ORA 6553 PLS-306 WITH INDEX

在解决之前,解决方法(如Oracle Bug中所述)是删除构造函数。如果你有空的初始化(即v_variable := t_my_type()),这可能会有点痛苦 在整个代码中,因为您需要用NULL替换它们 (即v_variable := t_my_type(NULL, NULL, NULL, NULL)