是否可以在变量 CLOB 中的执行代码中指定另一个 CLOB (JSON) 中的值

Posted

技术标签:

【中文标题】是否可以在变量 CLOB 中的执行代码中指定另一个 CLOB (JSON) 中的值【英文标题】:Is it possible to specify in the execution code, which is in the variable CLOB, the values that are in another CLOB (JSON) 【发布时间】:2021-03-28 03:19:40 【问题描述】:

JSON 通过 api 来找我。我把它放在一个可移动的 clob (v_clob) 中


"devices":
"id":"d652f632-0835-871b-a140-58701f019000",
"scale_id":"88348A32BD3D149FE055000000000001"
,
"data":
"external_id":"40023"
,
"data_weight":
"weight":"20322",
"prevWeight":"1000",
"prevTransaction":"1607680754361",
"transaction":"1607680754361",
"on":"false",
"transactionDataCount":"1",
"stable":"false",
"duration":"12",
"transactionMaxWeight":"2000",
"perimetr":"true",
"driverInCar":"false"

我有一个 clob 格式的表格。我在这个表中存储了一些代码(以 clob 格式)。下面是代码(在这段代码中,我查找带有外部 ID 的条目,然后根据条件查找必要的脚本):

WITH rowsel as (select OBL_TAREDAT  ,OBL_BRUTTODAT,DIRECTIONID,TARE,BRUTTO   from
                                (select OBL_TAREDAT ,OBL_BRUTTODAT,DIRECTIONID,TARE,BRUTTO from  WAYBILLS 
                                 where EXTERNAL_ID = EXTERNAL_ID 
                                 and OBL_TTN is null))
SELECT CASE
WHEN rowsel.OBL_BRUTTODAT  is null and rowsel.DIRECTIONID = '1'   THEN 41
WHEN rowsel.OBL_TAREDAT  is null and rowsel.DIRECTIONID = '1'     THEN 21
WHEN rowsel.OBL_TAREDAT  is null and rowsel.DIRECTIONID = '-1'     THEN 62
WHEN rowsel.OBL_BRUTTODAT  is null and rowsel.DIRECTIONID = '-1'    THEN 61
ELSE 0 END
FROM rowsel

我有一个问题,当我在查询中搜索我需要的记录时,是否可以使用通过 api 传给我的数据来指定这些数据。例如,我想替换 v_clob.data.external_id 上的“EXTERNAL_ID”???

我知道我可以用命令解析这个键

v_external_id: = apex_json.get_varchar2 (p_path => 'data.external_id', p_values => tv);

然后进行替换,并运行表中的代码。

 v_msg_in := REPLACE(v_msg_in,'EXTERNAL_ID',chr(39)|| v_external_id|| chr(39))

(v_msg_in - clob 我保存代码运行) 但问题是这个 JSON 可以改变,我总是需要改变代码。但是如果我可以参考来找我的Jason本人,那么我可以通过表格中的代码来完成(我将使用apex oracle)。通过oracle的顶部,用户将能够编辑查询 在表单中,并且在此过程中不需要编辑代码。

【问题讨论】:

【参考方案1】:

像下面这样的查询应该会为您提供您正在寻找的值。在下面的示例中,我将整个示例 JSON 粘贴为字符串,但您可以将其替换为代码中的 CLOB 变量。 JSON_VALUE 函数可用于通过指定值的路径从 JSON CLOB/BLOB/VARCHAR2 检索单个值。

WITH
    rowsel
    AS
        (SELECT OBL_TAREDAT,
                OBL_BRUTTODAT,
                DIRECTIONID,
                TARE,
                BRUTTO
           FROM (SELECT OBL_TAREDAT,
                        OBL_BRUTTODAT,
                        DIRECTIONID,
                        TARE,
                        BRUTTO
                   FROM WAYBILLS
                  WHERE EXTERNAL_ID = json_value ('
"devices":
"id":"d652f632-0835-871b-a140-58701f019000",
"scale_id":"88348A32BD3D149FE055000000000001"
,
"data":
"external_id":"40023"
,
"data_weight":
"weight":"20322",
"prevWeight":"1000",
"prevTransaction":"1607680754361",
"transaction":"1607680754361",
"on":"false",
"transactionDataCount":"1",
"stable":"false",
"duration":"12",
"transactionMaxWeight":"2000",
"perimetr":"true",
"driverInCar":"false"

', '$.data.external_id') AND OBL_TTN IS NULL))
SELECT CASE
           WHEN rowsel.OBL_BRUTTODAT IS NULL AND rowsel.DIRECTIONID = '1' THEN 41
           WHEN rowsel.OBL_TAREDAT IS NULL AND rowsel.DIRECTIONID = '1' THEN 21
           WHEN rowsel.OBL_TAREDAT IS NULL AND rowsel.DIRECTIONID = '-1' THEN 62
           WHEN rowsel.OBL_BRUTTODAT IS NULL AND rowsel.DIRECTIONID = '-1' THEN 61
           ELSE 0
       END
  FROM rowsel

【讨论】:

以上是关于是否可以在变量 CLOB 中的执行代码中指定另一个 CLOB (JSON) 中的值的主要内容,如果未能解决你的问题,请参考以下文章

oracle 导出超长Clob字段insert语句执行报字段过长的问题解决方案

在存储的 CLOB 中包含自动递增值

如何自动部署存在于 clob 列中的过程

将超过 32K 的字符串分配给 clob 变量时出现数字或值错误

是否可以对 influxdb 中的默认保留策略执行删除查询?

oracle如何操作clob数据类型