【问题标题】:How do I write the correct request to output information to "get"? SQL如何编写正确的请求以将信息输出到“get”? SQL
【发布时间】:2022-10-06 23:10:41
【问题描述】:

我立即为我的英语向你道歉。 事实是我需要用食谱为我的应用程序编写一个获取请求。我想让请求看起来像这样:

{
  \"items\": [
    {
      \"id_recipe\": 1,
      \"ingredients\": [
        {
          \"name_ingredient\": \"Ingredient1\",
          \"counts\": 30,
          \"name_unit\": \"unit1\"
        },
        {
          \"name_ingredient\": \"Ingredient2 \",
          \"counts\": 1,
          \"name_unit\": \"unit2 \"
        },
        {
          \"name_ingredient\": \"Ingredient3\",
          \"counts\": 2,
          \"name_unit\": \"unit1 \"
        }
      ]
    },
    {
      \"id_recipe\": 2,
      \"ingredients\": [
        {
          \"name_ingredient\": \"Ingredient2\",
          \"counts\": 1,
          \"name_unit\": \"unit3 \"
        },
        {
          \"name_ingredient\": \"Ingredient1\",
          \"counts\": 400,
          \"name_unit\": \"unit4\"
        }
      ]
    }
  ]
}

但它看起来像这样

{
  \"items\": [
    {
      \"id_recipe\": 1,
      \"name_ingredient\": \"Ingredient1\",
      \"counts\": 30,
      \"name_unit\": \"unit1\"
    },
    {
      \"id_recipe\": 1,
      \"name_ingredient\": \"Ingredient2 \",
      \"counts\": 1,
      \"name_unit\": \"unit2 \"
    },
    {
      \"id_recipe\": 1,
      \"name_ingredient\": \"Ingredient3\",
      \"counts\": 2,
      \"name_unit\": \"unit1 \"
    },
    {
      \"id_recipe\": 2,
      \"name_ingredient\": \"Ingredient2\",
      \"counts\": 1,
      \"name_unit\": \"unit3 \"
    },
    {
      \"id_recipe\": 2,
      \"name_ingredient\": \"Ingredient1\",
      \"counts\": 400,
      \"name_unit\": \"unit4\"
    }
  ]
}

也就是说,有必要以某种方式将具有相同 id_recept 的元素组合成一个数组。但是我不知道怎么做! 这是我现在使用的代码:

SELECT PRODUCTS.ID_RECIPE, INGREDIENTS.NAME_INGREDIENT, PRODUCTS.COUNTS, UNITS_OF_MEASUREMENT.NAME_UNIT 
FROM PRODUCTS, INGREDIENTS, UNITS_OF_MEASUREMENT 
WHERE PRODUCTS.ID_INGREDIENT = INGREDIENTS.ID_INGREDIENT 
AND PRODUCTS.ID_MEASUREMENT = UNITS_OF_MEASUREMENT.ID_MEASUREMENT 
ORDER BY ID_RECIPE

这是表数据的样子: table ingredients

table products

我使用甲骨文。 如果您能提供帮助,我将很高兴!

  • JSON是如何生成的?您是否使用 ORDS 从表中进行选择并使用 GET REST API 获取响应?
  • JSON 是通过 Oracle 中称为 RESTful Data Service 的内置服务生成的。我刚刚写了一个请求,创建了一个模板并在其中插入了获取请求的代码。

标签: sql oracle get-request


【解决方案1】:

你可以尝试这样的事情(因为我既没有你的 ddl 也没有你的数据):

select json_object('table name' value table_name,'columns' value json_arrayagg(json_object('column name' value column_name, 'type' value data_type) returning clob pretty) returning clob pretty)
from dba_tab_columns
where table_name like 'DBA_HIST_SQL%'
group by table_name;

输出是这样的:

{
  "table name" : "DBA_HIST_SQLBIND",
  "columns" : [
  {"column name":"SNAP_ID","type":"NUMBER"},
  {"column name":"CON_ID","type":"NUMBER"},
  {"column name":"CON_DBID","type":"NUMBER"},
  {"column name":"VALUE_ANYDATA","type":"ANYDATA"},
  {"column name":"VALUE_STRING","type":"VARCHAR2"},
  {"column name":"LAST_CAPTURED","type":"DATE"},
  {"column name":"WAS_CAPTURED","type":"VARCHAR2"},
  {"column name":"MAX_LENGTH","type":"NUMBER"},
  {"column name":"SCALE","type":"NUMBER"},
  {"column name":"PRECISION","type":"NUMBER"},
  {"column name":"CHARACTER_SID","type":"NUMBER"},
  {"column name":"DATATYPE_STRING","type":"VARCHAR2"},
  {"column name":"DATATYPE","type":"NUMBER"},
  {"column name":"DUP_POSITION","type":"NUMBER"},
  {"column name":"POSITION","type":"NUMBER"},
  {"column name":"NAME","type":"VARCHAR2"},
  {"column name":"SQL_ID","type":"VARCHAR2"},
  {"column name":"INSTANCE_NUMBER","type":"NUMBER"},
  {"column name":"DBID","type":"NUMBER"}
]
}"
"{
  "table name" : "DBA_HIST_SQLCOMMAND_NAME",
  "columns" : [
  {"column name":"DBID","type":"NUMBER"},
  {"column name":"CON_ID","type":"NUMBER"},
  {"column name":"CON_DBID","type":"NUMBER"},
  {"column name":"COMMAND_NAME","type":"VARCHAR2"},
  {"column name":"COMMAND_TYPE","type":"NUMBER"}
]
}

【讨论】:

  • 是的,它运作良好!谢谢你!但是有一个问题。将此代码上传到 Oracle 中的 RESTfull 数据服务,它不能正常工作。正在生成 JSON,这看起来不太合适。有没有什么办法解决这一问题?
  • 在这里,我正在生成一个 json_object。可能对于 ORDS,您需要删除 JSON_OBJECT 函数。
【解决方案2】:

gsalem 完全正确。就我而言,它看起来像这样:

    select 'application/json', "JSON" from (SELECT JSON_OBJECT('items' value JSON_ARRAYAGG(
    JSON_OBJECT(
        'idRecipe' VALUE R.ID_RECIPE,
        'nameRecipe' VALUE R.NAME_RECIPE,
        'urlImage' VALUE R.URL_IMAGE,
        'descriptionText' VALUE R.DESCRIPTION_TEXT,
        'timeCooking' VALUE R.TIME_COOKING,
        'category' VALUE (
            SELECT JSON_ARRAYAGG(
                JSON_OBJECT(
                    'idCategory' VALUE CAT.ID_CATEGORY,
                    'nameCategory' VALUE CAT.NAME_CATEGORY
                ) RETURNING CLOB
            ) FROM CATEGORIES CAT WHERE R.ID_CATEGORY = CAT.ID_CATEGORY
        ),
        'userInfo' VALUE (
            SELECT JSON_ARRAYAGG(
                JSON_OBJECT(
                    'idUser' VALUE U.ID_USER,
                    'nameUser' VALUE U.FULLNAME
                ) RETURNING CLOB
            ) FROM USERS U WHERE R.ID_USER = U.ID_USER
        ),
        'rating' VALUE R.RATING,
        'products' VALUE (
            SELECT JSON_ARRAYAGG(
                JSON_OBJECT(
                    'idIngredient' VALUE I.ID_INGREDIENT,
                    'nameImgredient' VALUE I.NAME_INGREDIENT,
                    'counts' VALUE P.COUNTS,
                    'measurement' VALUE (
                        SELECT JSON_ARRAYAGG(
                            JSON_OBJECT(
                                'idMeasurement' VALUE M.ID_MEASUREMENT,
                                'nameMeasurement' VALUE M.NAME_UNIT
                            ) RETURNING CLOB
                        ) FROM UNITS_OF_MEASUREMENT M WHERE P.ID_MEASUREMENT = M.ID_MEASUREMENT
                    )
                ) RETURNING CLOB
            ) FROM PRODUCTS P, INGREDIENTS I WHERE P.ID_RECIPE = R.ID_RECIPE AND P.ID_INGREDIENT = I.ID_INGREDIENT
        ),
        'preparation' VALUE (
            SELECT JSON_ARRAYAGG(
                JSON_OBJECT(
                    'step' VALUE PR.STEP,
                    'urlImage' VALUE PR.URL_IMAGE,
                    'description' VALUE PR.DESCRIPTIONS
                )  RETURNING CLOB 
            ) FROM PREPARATION PR WHERE PR.ID_RECIPE = R.ID_RECIPE
        ) RETURNING CLOB
        ) ORDER BY ID_RECIPE RETURNING CLOB
    ) RETURNING CLOB
) AS "JSON" FROM RECIPES R)

我解释为什么'应用程序/json'是需要的。如果您想使用RESTful 服务从 oracle apex,为了在输出中获取 json 文件,您需要将其添加到您的代码中。同时选择源类型为“媒体资源”.在这种情况下,一切都会奏效。

【讨论】:

    猜你喜欢
    • 2017-03-06
    • 2021-01-25
    • 1970-01-01
    • 2016-10-01
    • 2011-05-12
    • 1970-01-01
    • 2019-05-09
    • 1970-01-01
    • 2021-05-04
    相关资源
    最近更新 更多