是否可以在变量 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语句执行报字段过长的问题解决方案
将超过 32K 的字符串分配给 clob 变量时出现数字或值错误