Результат запроса Oracle в виде JSON - PullRequest
0 голосов
/ 09 октября 2018

Я работаю в Oracle 12.2.У меня сложный запрос, результаты которого я хотел бы получить в виде CLOB в формате JSON.Я посмотрел в json_object, но это означает, что полностью переписать запрос.Есть ли способ просто передать курсор 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

1 Ответ

0 голосов
/ 11 октября 2018

Мне не удалось найти процедуру, которую я мог бы использовать для генерации 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...