Oracle查询结果为JSON

Oracle查询结果为JSON,oracle,plsql,Oracle,Plsql,我在Oracle 12.2中工作。 我有一个复杂的查询,我希望以JSON格式的CLOB形式接收查询结果。我已经研究了json_对象,但这意味着完全重写查询。 有没有一种方法可以简单地传递ref游标或结果集并接收JSON数组,其中每一行都是JSON对象 我的问题是: SELECT * FROM ( SELECT LABEL_USERS.*, ROWNUM AS RANK , 14 AS

我在Oracle 12.2中工作。 我有一个复杂的查询,我希望以JSON格式的CLOB形式接收查询结果。我已经研究了json_对象,但这意味着完全重写查询。 有没有一种方法可以简单地传递ref游标或结果集并接收JSON数组,其中每一行都是JSON对象

我的问题是:

SELECT
    *
FROM
    (
        SELECT
            LABEL_USERS.*,
            ROWNUM AS RANK ,
            14     AS TOTAL
        FROM
            (
                SELECT DISTINCT
                    SEC_VS_USER_T.USR_ID,
                    SEC_VS_USER_T.USR_FIRST_NAME,
                    SEC_VS_USER_T.USR_LAST_NAME,
                    SEC_USER_ROLE_PRIV_T.ROLE_ID,
                    SEC_ROLE_DEF_INFO_T.ROLE_NAME,
                    1     AS IS_LABEL_MANAGER,
                    LOWER(SEC_VS_USER_T.USR_FIRST_NAME ||' '||SEC_VS_USER_T.USR_LAST_NAME) AS
                    SEARCH_STRING
                FROM
                    SEC_VS_USER_T,
                    SEC_USER_ROLE_PRIV_T,
                    SEC_ROLE_DEF_INFO_T
                WHERE
                    SEC_VS_USER_T.USR_ID = SEC_USER_ROLE_PRIV_T.USR_ID
                AND SEC_VS_USER_T.USR_SITE_GRP_ID IS NULL
                ORDER BY
                    UPPER(USR_FIRST_NAME),
                    UPPER(USR_LAST_NAME)) LABEL_USERS) LABEL_USER_LIST
WHERE
    LABEL_USER_LIST.RANK >= 0
AND LABEL_USER_LIST.RANK < 30

我找不到可以用来生成JSON的过程,但我能够使用新的12.2函数来创建我需要的JSON

SELECT JSON_ARRAYAGG( --Used to aggregate all rows into single scalar value
    JSON_OBJECT( --Creating an object for each row
    'USR_ID'            VALUE USR_ID,
    'USR_FIRST_NAME'    VALUE USR_FIRST_NAME,
    'USR_LAST_NAME'     VALUE USR_LAST_NAME,
    'IS_LABEL_MANAGER'  VALUE IS_LABEL_MANAGER,
    'SEARCH_STRING'     VALUE SEARCH_STRING,
    'USR_ROLES'         VALUE USR_ROLES   
    )returning CLOB) AS JSON --Need to cpecify CLOB, otherwise the result is limited by VARCHARC2(4000)
FROM
    (
        SELECT * FROM (
          SELECT LABEL_USERS.*, ROWNUM AS RANK, 14 AS TOTAL from 
            (SELECT
                    SEC_VS_USER_T.USR_ID,
                    SEC_VS_USER_T.USR_FIRST_NAME,
                    SEC_VS_USER_T.USR_LAST_NAME,
                    1                   AS IS_LABEL_MANAGER,
                    LOWER(SEC_VS_USER_T.USR_FIRST_NAME ||' '||SEC_VS_USER_T.USR_LAST_NAME) AS SEARCH_STRING,
                    (
                        SELECT --It is much easier to create the JSON here and simply use this column in the outer JSON_OBJECT select
                            JSON_ARRAYAGG(JSON_OBJECT('ROLE_ID'   VALUE ROLE_ID,
                                                      'ROLE_NAME' VALUE ROLE_NAME)) AS USR_ROLES
                        FROM
                            (
                                SELECT DISTINCT
                                    prv.ROLE_ID,
                                    def.ROLE_NAME
                                FROM
                                    SEC_user_ROLE_PRIV_T prv
                                JOIN
                                    SEC_ROLE_DEF_INFO_T def
                                ON
                                    prv.ROLE_ID = def.ROLE_ID
                                ORDER BY
                                    ROLE_ID DESC)) AS USR_ROLES

                FROM
                    SEC_VS_USER_T,
                    SEC_USER_ROLE_PRIV_T,
                    SEC_ROLE_DEF_INFO_T
                WHERE
                    SEC_VS_USER_T.USR_ID = SEC_USER_ROLE_PRIV_T.USR_ID
                AND SEC_USER_ROLE_PRIV_T.ROLE_PRIV_ID = SEC_ROLE_DEF_INFO_T.ROLE_ID
                AND SEC_VS_USER_T.USR_SITE_GRP_ID IS NULL 
                ORDER BY UPPER(USR_FIRST_NAME),
                         UPPER(USR_LAST_NAME))LABEL_USERS)) LABEL_USER_LIST
WHERE LABEL_USER_LIST.RANK >= 0--:bv_Min_Rows
  AND LABEL_USER_LIST.RANK < 30--:bv_Max_Rows

@一匹没有名字的马,我仍然没有这个程序。我在问是否有办法创建它。@Ali a,我喜欢这个解决方案,但得到的错误是:00907。00000-缺少右括号*原因:*操作:此查询第34行第19列出现错误:选择JSON_ArrayAg-用于将所有行聚合为单个标量值JSON_对象-为每行“集成”值名称“int_id”值int_id创建一个对象,“Description”值Description返回CLOB作为JSON-需要指定CLOB,否则结果会受到SELECT NAME、int_id、integrations中Description的VARCHARC2400的限制。我使用的是12.1.0.2?Reddy,JSON功能在12.1和12.2之间发生了变化。虽然我预计这里会有另一个错误。你能在没有任何评论的情况下尝试你的查询吗?