Oracle APEX调用POST API时遇ORA-06550错误求助
解决Oracle APEX POST API调用中的ORA-06550错误
错误原因
报错信息指向第8行v_json := :BODY;,核心问题是类型不匹配:在APEX的REST API处理上下文里,:BODY默认是VARCHAR2类型,但你声明的变量v_json是CLOB类型,导致PLS-00382表达式类型错误。
解决方案
方案1:调整变量类型(适合JSON数据长度较短的场景)
将v_json的声明从CLOB改为VARCHAR2(根据Oracle版本,可设为VARCHAR2(32767)支持更长文本):
DECLARE vCount NUMBER; v_dname VARCHAR2(100); v_loc VARCHAR2(100); v_json VARCHAR2(32767); -- 修改为VARCHAR2类型 BEGIN v_json := :BODY; APEX_JSON.parse(v_json); vCount := APEX_JSON.get_count(p_path => 'dept'); htp.prn('data count-'||vCount); IF vCount > 0 THEN FOR i IN 1 .. vCount LOOP v_dname := apex_json.get_varchar2(p_path => 'dept[%d].dname', p0 => i); v_loc := apex_json.get_varchar2(p_path => 'dept[%d].loc', p0 => i); INSERT INTO dept (DNAME, LOC) VALUES (v_dname, v_loc); END LOOP; COMMIT; END IF; END;
方案2:转换类型为CLOB(适合JSON数据较长的场景)
如果JSON内容可能超过VARCHAR2的长度限制,使用TO_CLOB()函数将:BODY转换为CLOB类型后赋值:
DECLARE vCount NUMBER; v_dname VARCHAR2(100); v_loc VARCHAR2(100); v_json CLOB; BEGIN v_json := TO_CLOB(:BODY); -- 添加TO_CLOB类型转换 APEX_JSON.parse(v_json); vCount := APEX_JSON.get_count(p_path => 'dept'); htp.prn('data count-'||vCount); IF vCount > 0 THEN FOR i IN 1 .. vCount LOOP v_dname := apex_json.get_varchar2(p_path => 'dept[%d].dname', p0 => i); v_loc := apex_json.get_varchar2(p_path => 'dept[%d].loc', p0 => i); INSERT INTO dept (DNAME, LOC) VALUES (v_dname, v_loc); END LOOP; COMMIT; END IF; END;
方案3:用SQL JSON函数简化代码(推荐)
直接通过JSON_TABLE解析JSON并插入,避免PL/SQL循环,效率更高:
DECLARE BEGIN INSERT INTO dept (DNAME, LOC) SELECT j.dname, j.loc FROM JSON_TABLE( TO_CLOB(:BODY), '$.dept[*]' COLUMNS ( dname VARCHAR2(100) PATH '$.dname', loc VARCHAR2(100) PATH '$.loc' ) ) j; COMMIT; htp.prn('插入成功,共' || SQL%ROWCOUNT || '条记录'); END;
内容的提问来源于stack exchange,提问作者Hasan Al Mamun
相关产品推荐
相关产品推荐

