PLSQL存储过程生成JSON格式错误,如何修正receivablesInvoiceLines结构?
修正PL/SQL存储过程中receivablesInvoiceLines的JSON结构生成逻辑
问题根源是当前代码循环时将每个字段单独封装为JSON对象并添加到数组,导致receivablesInvoiceLines数组包含多个零散的单字段对象,而非每个元素都是聚合所有目标字段的完整对象。以下是修正逻辑:
错误代码示例(问题场景)
通常错误写法是循环中逐个append单字段JSON对象:
-- 错误:数组元素为单字段JSON对象 FOR rec IN cur_invoice_lines LOOP l_children.append(JSON_OBJECT('LineNumber' VALUE rec.line_num)); l_children.append(JSON_OBJECT('ItemNumber' VALUE rec.item_code)); l_children.append(JSON_OBJECT('Description' VALUE rec.item_desc)); l_children.append(JSON_OBJECT('Quantity' VALUE rec.qty)); l_children.append(JSON_OBJECT('UnitSellingPrice' VALUE rec.unit_price)); END LOOP;
修正后的代码实现
方式1:使用JSON_OBJECT直接构建完整行对象
循环处理每条发票明细时,先构建包含所有目标字段的单个JSON对象,再将该对象添加到数组:
-- 正确:数组元素为聚合所有字段的完整JSON对象 FOR rec IN cur_invoice_lines LOOP -- 构建单条明细的完整JSON对象 l_line_json := JSON_OBJECT( 'LineNumber' VALUE rec.line_num, 'ItemNumber' VALUE rec.item_code, 'Description' VALUE rec.item_desc, 'Quantity' VALUE rec.qty, 'UnitSellingPrice' VALUE rec.unit_price ); -- 将完整对象添加到数组 l_children.append(l_line_json); END LOOP;
方式2:使用JSON_OBJECT_T API(Oracle 12c+)
若使用Oracle原生JSON对象类型操作,逻辑如下:
DECLARE l_lines_arr JSON_ARRAY_T := JSON_ARRAY_T(); l_line_obj JSON_OBJECT_T; BEGIN FOR rec IN ( SELECT line_num, item_code, item_desc, qty, unit_price FROM your_invoice_lines_table ) LOOP -- 初始化单行JSON对象 l_line_obj := JSON_OBJECT_T(); -- 为对象添加所有字段 l_line_obj.put('LineNumber', rec.line_num); l_line_obj.put('ItemNumber', rec.item_code); l_line_obj.put('Description', rec.item_desc); l_line_obj.put('Quantity', rec.qty); l_line_obj.put('UnitSellingPrice', rec.unit_price); -- 将完整对象追加到数组 l_lines_arr.append(l_line_obj); END LOOP; -- 将生成的数组嵌入到主JSON结构中 l_main_json.put('receivablesInvoiceLines', l_lines_arr); END;
核心要点
- 每条发票明细对应一个独立的JSON对象,所有目标字段都封装在该对象内
- 循环内仅执行一次
append操作,确保数组的每个元素都是包含LineNumber、ItemNumber、Description、Quantity、UnitSellingPrice的完整结构
内容的提问来源于stack exchange,提问作者virtual transfer
相关产品推荐
相关产品推荐

