2

次のスクリプトを検討してください。

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;

最後の 2 つのSELECTステートメントの出力は次のとおりです。

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

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

ドキュメントでは、この操作は VARRAY とネストされたテーブルで可能であると主張しています

member_condition は、要素がネストされたテーブルのメンバーであるかどうかをテストするメンバーシップ条件です。expr が、指定されたネストした表または VARRAY のメンバーと等しい場合、戻り値は TRUE です。

私は何を間違っていますか?

4

1 に答える 1

0

これはドキュメントのバグです。このAskTom question and answerを参照してください。

回避策は、次のクエリを実行することです。

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

他の誰かがこれを役に立つと思った場合に備えて、すべての multiset 条件と operator のエミュレーションを示すブログ投稿を書きました。

于 2018-08-14T09:13:01.847 に答える