2017-08-15 4 views
0
CREATE TABLE t (
    contents CLOB 
) 

INSERT INTO t (contents) VALUES ('[{"foo": "a"}, {"foo": "a", "bar": "b"}]'); 

私は、次のようなクエリを持っている:Oracle 12C Json - 他のすべてのERROR ON ERROR条件を強制しながら、欠損属性をNULLに設定する方法は?

SELECT foo, 
     bar 
FROM t, 
    json_table(contents, '$[*]' COLUMNS (
     foo VARCHAR2(4000) PATH '$.foo' ERROR ON ERROR, 
     bar VARCHAR2(4000) PATH '$.bar' ERROR ON ERROR, 
    ) 

私が何をしたいのかは、まだ他のすべてのエラーの例を施行しながら、配列は、NULLに属性を欠落しているため、デフォルト値を設定することが可能です。特に、fooまたはbarの値が4000より大きい場合は、クエリを失敗させてください。

しかし、は、JSONオブジェクトにfooまたはbarが見つからない場合にクエリを失敗させます。これのエラーコードはORA-40462: JSON_VALUE evaluated to no valueです。

私はNULL ON ERRORを設定することができましたが、クエリが失敗するのではなく、4000を超えるすべての属性がNULLに設定されます。

他のすべてのERROR ON ERROR条件を引き続き実行しながら、Oracleに不足している属性をNULLに設定する方法はありますか?

私はまさにこの目的、例えばオラクル12CR1

+0

は、あなたのステーションがファンクションまたはプロシージャのようなPL/SQLを使用するために利用できるのですか? –

答えて

1

12CR2があります句 'EMPTY ON' を使用しています:

foo VARCHAR2(4000) PATH '$.foo' ERROR ON ERROR NULL ON EMPTY, 
+0

ありがとう - あまりにも悪い私はまだ12CR1にいる。私たちがアップグレードするとき、私はこれを試してみるでしょう。 –

関連する問題