2016-09-15 1 views
0

SQL QueryをJSONとして生成する簡単な方法を探していますが、空白になります。これは、クエリです:私はこの表示を持ちたいどんなOracleクエリーを減らして所有者を返す

SELECT DISTINCT owner 
FROM dba_segments 
WHERE owner NOT IN ('SYS', 'SYSTEM', 'EXFSYS', 'DBSNMP', 'SQLTXPLAIN', 'XDB', 'WMSYS', 'PERFSTAT', 'OUTLN'); 

はこれに似JSONです:

SQL Serverで
{ 
    "data": [{ 
     "{#Owner}": "ABC123Test" 
    }, { 
     "{#Owner}": "Accounting" 
    }, { 
     "{#Owner}": "Treasury" 
    }, { 
     "{#Owner}": "Production1" 
    }] 
} 

私は単純にXMLパスを利用して、このようなものだろう -

SELECT '{"data":[' + (SELECT CAST(STUFF((SELECT ',' + '{"{#Owner}":"' + DISTINCT[owner] + '"}' 
FROM dba_segments 
where owner not in ('SYS', 'SYSTEM', 'EXFSYS', 'DBSNMP', 'SQLTXPLAIN', 'XDB', 'WMSYS', 'PERFSTAT', 'OUTLN') FOR XML PATH('')), 1, 1, '') AS VARCHAR(MAX))) + ']}' as 'XML_F52E2B61-18A1-11d1-B105-00805F49916B' 
+0

{#OWNER}のように、マクロ/変数名はすべて大文字であることに注意してください。 – Richlv

答えて

1

何か:

SELECT '{ "data": [{'||listagg('"{#owner}":"'||owner||'"}', ',') within group (order by owner)||'}]}' as json 
FROM (
    select distinct owner 
    from dba_segments 
    WHERE owner NOT IN ('SYS', 'SYSTEM', 'EXFSYS', 'DBSNMP', 'SQLTXPLAIN', 'XDB', 'WMSYS', 'PERFSTAT', 'OUTLN', 'APEX_040200') 
) t; 

(私は右のすべての{[のネスティングを得たかどうかわからない)

+0

クエリを実行して'' '、'、 '、')WITHINGROUP(ORDERBYOWNER)|| '}]}以下のように '' {"DATA":{{' | {LISTAGG( '"{#OWNER} ' – whoisearth

+0

@whoisearth:これは、Oracleが式に割り当てるデフォルトの名前です(私は、列の別名を提供するためにクエリを変更しました)。派生テーブルの 'where'節と一致するユーザーがシステムにない場合を除き、JSONデータを含む1行を返す必要があります。 '(...)にない所有者が返ってくるdba_segmentsからの選択カウント(別名所有者)は何ですか? –

+0

私はオラクルに私の無知を呼び出すつもりです。私はあなたの更新を走らせ、 'JSON'を表示していますが、SQLデベロッパーで実際にデータを表示しているのですか? – whoisearth

0

本当に大きなプロジェクトを手にしたいのでなければ、自分でJSONパーサー/ライターをロールしたくないのです。多くのプロジェクトで、私はPLJSONを使用しました。これは、PL/SQL内でJSONを操作/解析/書き込むことができるパッケージのライブラリです。そこには他のオプションもあると確信していますが、これは私のためにうまくいっています。

EDIT

は12Cでのように見える、OracleはJSONをサポートしています。詳細については、hereを参照してください。このような

+0

Oracle 12のJSONサポートは、Postgresの 'row_to_json()'や 'json_agg()'のように、_query_ JSONドキュメントのみを有効にして_generate_することはできません。 –

1

この作品12.2.0.1.0を使用するには、(私が使用していた注意してください

SQL> set lines 89 
SQL> with DBA_SEGMENT_OWNERS 
    2 as 
    3 (
    4 select /*+ MATERIALIZE */ DISTINCT OWNER 
    5  from dba_segments 
    6  where owner NOT IN ('SYS', 'SYSTEM', 'EXFSYS', 'DBSNMP', 'SQLTXPLAIN', 'XDB', 'WMSYS', 'PERFSTAT') 
    7 ) 
    8 select JSON_OBJECT('data' is JSON_ARRAYAGG(JSON_OBJECT('{#Owner}' is OWNER))) 
    9 from DBA_SEGMENT_OWNERS 
10/
{"data":[{"{#Owner}":"MDSYS"},{"{#Owner}":"VPDTEST"},{"{#Owner}":"CTXSYS"},{"{#Owner}":"H 
R"},{"{#Owner}":"DVSYS"},{"{#Owner}":"AUDSYS"},{"{#Owner}":"SCOTT"},{"{#Owner}":"VPDOWNER 
"},{"{#Owner}":"GSMADMIN_INTERNAL"},{"{#Owner}":"OJVMSYS"},{"{#Owner}":"ORDSYS"},{"{#Owne 
r}":"ORDS_METADATA"},{"{#Owner}":"ORDDATA"},{"{#Owner}":"XDBEXT"},{"{#Owner}":"LBACSYS"}, 
{"{#Owner}":"XFILES"}]} 


SQL> 
関連する問題