如何解决无法在49型和31型之间强制转换
我在Pl / SQL 12c中将json_array_t附加到另一个json_array_t时遇到问题。我有以下代码:
v_method_resp_arr.append(JSON_OBJECT_T(JSON_OBJECT('NAME' VALUE v_method,'DETAIL' VALUE v_method_det_arr)));
v_method_resp_arr
和v_method_det_arr
是json_array_t
的地方。我收到以下错误代码:
错误:PLS-00801:内部错误[***在文件pdw4.c的第909行中插入;
无法在49型和31型之间强制转换;
另一种方法是定义一个新变量v_method_resp_obj JSON_OBJECT_T并在其中存储信息,然后将该对象附加到数组,但是我要避免使用辅助变量。
v_method_resp_obj.put('NAME',v_method); v_method_resp_obj.put('DETAIL',v_method_det_arr); v_method_resp_arr.append(v_method_resp_obj);
解决方法
OCI或XML标头中没有列出类型31和类型49,也不能在文档中找到-不得发布内部类型代码
,我不知道这在新版本中是否已更改,但是在12c上,您不能在PL / SQL中使用JSON_OBJECT。
此外,JSON_OBJECT_T“ put”是一个过程,因此如果不先将其实例化为变量,就不能用于添加键/值对。
据我所知,这留下了3种方法来满足您的需求:
- 正如您在原始帖子中已经说过的那样,创建另一个变量以用作append参数:
declare
ja json_array_t;
jo json_object_t;
v_method varchar2(15) := 'method name';
v_method_det_arr varchar2( 30 ) := 'some details here';
begin
ja := json_array_t;
jo := json_object_t;
jo.put( 'name',v_method );
jo.put( 'detail',v_method_det_arr );
ja.append( jo );
dbms_output.put_line(ja.to_string);
end;
- 使用JSON_OBJECT_T的parse构造函数构建json对象,后者将返回该对象,从而可以在不实例化新变量的情况下使用该对象:
这种方法有两个问题:这可能是性能最差,最容易出错的解决方案,因为您将必须将参数连接在一起作为JSON字符串进行解析,并以JSON_OBJECT_T的形式返回。
declare
ja json_array_t;
v_method varchar2(15) := 'method name';
v_method_det_arr varchar2( 30 ) := 'some details here';
begin
ja := json_array_t;
ja.append( json_object_t( '{name:"' || v_method || '",detail:"' || v_method_det_arr || '"}' ) );
dbms_output.put_line(ja.to_string);
end;
- 在SQL中构建JSON字符串:
declare
v_method varchar2(15) := 'method name';
v_method_det_arr varchar2( 30 ) := 'some details here';
v_json_string clob;
begin
select json_arrayagg
( json_object
( 'name' value v_method,'detail' value v_method_det_arr
)
)
into v_json_string
from dual
;
dbms_output.put_line( dbms_lob.substr( v_json_string,200,1 ) );
end;
我认为,如果您不需要进一步操作JSON数组或将其用作函数的JSON_ARRAY_T返回值,则解决方案#3是最好的,特别是如果您将遍历查询结果以生成数组。
否则,尽管较为冗长,但我认为解决方案1将是一种更具可读性和高性能的方法。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。