Oracle Apex REST数据源:在触发器中转换价格为数值并新增列
解决方案:在现有触发器中实现价格转换与计算
完全可以在现有的TR_MAINTAIN_LINES触发器内完成这两个需求,无需创建单独触发器。触发器本身的职责就是维护LINES表数据,在原有JSON提取逻辑中直接加入价格转换与计算逻辑,既高效又能避免多触发器带来的执行顺序问题。
具体实现示例
假设触发器中原本通过JSON_TABLE提取ORDERS表的LINES JSON数组并同步到LINES表,只需修改数据插入/更新的字段逻辑:
-- 触发器内处理INSERT/UPDATE的核心逻辑示例 -- 以INSERT为例,UPDATE逻辑同理 INSERT INTO LINES ( order_id, line_id, quantity, price, total_price, unit_price ) SELECT :new.order_id, j.line_id, j.quantity, j.price, -- 保留原字符串格式的价格(若不需要可删除该字段) -- 将带$符号的价格转换为数值型 TO_NUMBER(j.price, '$999,999,999.99') AS total_price, -- 计算单价,处理quantity为0的情况避免报错 TO_NUMBER(j.price, '$999,999,999.99') / NULLIF(j.quantity, 0) AS unit_price FROM JSON_TABLE( :new.lines, '$[*]' COLUMNS ( line_id NUMBER PATH '$.line_id', quantity NUMBER PATH '$.quantity', price VARCHAR2(50) PATH '$.price' ) ) j;
关键注意事项
- 除以0防护:用
NULLIF(j.quantity, 0)确保当quantity为0时,unit_price返回NULL而非触发除以0错误。 - 格式匹配:确认
TO_NUMBER的格式模型'$999,999,999.99'与API返回的price字符串格式完全匹配,若存在其他格式(如无千分位、不同小数位数)需调整格式模型。 - UPDATE逻辑复用:如果触发器包含UPDATE处理,需在更新LINES表的语句中应用相同的价格转换与计算逻辑,保持数据一致性。
内容的提问来源于stack exchange,提问作者ckp7blessed
相关产品推荐
相关产品推荐

