【问题标题】:Using Oracle MEMBER OF operator with VARRAY columns in SQL在 SQL 中将 Oracle MEMBER OF 运算符与 VARRAY 列一起使用
【发布时间】:2018-08-14 09:13:01
【问题描述】:

考虑以下脚本:

CREATE TYPE t1 AS TABLE OF VARCHAR2(10);
/
CREATE TYPE t2 AS VARRAY(10) OF VARCHAR2(10);
/

CREATE TABLE t (
  id NUMBER(10),
  t1 t1,
  t2 t2
)
NESTED TABLE t1 STORE AS t1_nt;

INSERT INTO t VALUES (1, NULL, NULL);
INSERT INTO t VALUES (2, t1('abc'), t2('abc'));

SELECT * FROM t WHERE 'abc' MEMBER OF t1;
SELECT * FROM t WHERE 'abc' MEMBER OF t2;

最后两个SELECT 语句的输出是

ID    T1      T2
-------------------
2     [abc]   [abc]

ORA-00932: inconsistent datatypes: expected UDT got 
SQL_XQMZQAMSETXZLGIEEEEBUTFWF.T2

The documentation claims that this operation should be possible for varrays as well as for nested tables:

member_condition 是一种成员条件,用于测试元素是否是嵌套表的成员。如果 expr 等于指定的嵌套表或可变数组的成员,则返回值为 TRUE。

我做错了什么?

【问题讨论】:

  • 我认为这一定是文档错误。它在五个地方说“嵌套表”,但在第二句话中只提到“varray”,'如果 expr 等于指定嵌套表或 varray 的成员,则返回值为 TRUE。'相同的文本出现在 18c 文档中,所以也许有人应该告诉他们。
  • @WilliamRobertson:是的,绝对是一个文档错误:asktom.oracle.com/pls/apex/…

标签: sql oracle varray


【解决方案1】:

这是一个文档错误,请参阅AskTom question and answer

一种解决方法是运行此查询:

SELECT *
FROM t
WHERE EXISTS (
  SELECT 1 FROM TABLE(t2) WHERE column_value = 'abc'
)

I've written up a blog post showing emulations of all the multiset conditions and operators,以防其他人觉得这很有用。

【讨论】:

    猜你喜欢
    • 2011-10-06
    • 2018-08-02
    • 1970-01-01
    • 1970-01-01
    • 2011-10-20
    • 1970-01-01
    • 2011-08-20
    • 2012-04-29
    • 1970-01-01
    相关资源
    最近更新 更多