PL/SQL中PLJSON返回数组而非字符串问题求助(新手)
PL/SQL返回嵌套数组导致网站崩溃,需转换为字符串
我是编程新手,现在碰到PL/SQL代码返回数组而非字符串的问题,直接导致网站崩溃。附上我的代码、当前返回结果,求帮忙把结果转成字符串,谢谢各位。
我的代码
IF (sBnsStat= 'REN') THEN OPEN cPrevPermit FOR SELECT permit_no FROM buss_hist WHERE bin = m_sBin AND tax_year < sTaxYear; DECLARE oPrevPermitRow pljson_list; BEGIN LOOP FETCH cPrevPermit INTO s_PrevPermitNo ; EXIT WHEN cPrevPermit%NOTFOUND; oPrevPermitRow := pljson_list(); oPrevPermitRow.append(s_PrevPermitNo); sPrevPermitNo.append(oPrevPermitRow.to_json_value); END LOOP; END; CLOSE cPrevPermit; END if; oBusinessInfo.put('prevPermitNo',sPrevPermitNo);
当前返回结果
"prevPermitNo":[[ " "],[ " "],[ " "],["2019-00093"],["2020-00311"],["2021-00509"]
问题原因
你现在的代码每次循环都会新建一个pljson_list,把单个许可证号塞进这个小数组,再把小数组加到sPrevPermitNo里,所以最终得到嵌套数组(数组套数组),还包含数据库里的空值项,这才导致网站解析异常崩溃。
解决方案
根据需求选下面两种方案之一:
方案1:返回逗号分隔的字符串
直接用字符串拼接替代数组操作,同时过滤空值:
IF (sBnsStat= 'REN') THEN -- 提前声明sPrevPermitStr为VARCHAR2类型 sPrevPermitStr := ''; OPEN cPrevPermit FOR SELECT permit_no FROM buss_hist WHERE bin = m_sBin AND tax_year < sTaxYear; BEGIN LOOP FETCH cPrevPermit INTO s_PrevPermitNo; EXIT WHEN cPrevPermit%NOTFOUND; -- 跳过空值,避免多余逗号 IF s_PrevPermitNo IS NOT NULL AND TRIM(s_PrevPermitNo) <> '' THEN IF sPrevPermitStr <> '' THEN sPrevPermitStr := sPrevPermitStr || ', '; END IF; sPrevPermitStr := sPrevPermitStr || s_PrevPermitNo; END IF; END LOOP; END; CLOSE cPrevPermit; -- 将字符串存入JSON对象 oBusinessInfo.put('prevPermitNo', sPrevPermitStr); END if;
最终返回结果:
"prevPermitNo": "2019-00093, 2020-00311, 2021-00509"
方案2:返回一维数组(非嵌套)
如果需要数组格式但不要嵌套,去掉内层的pljson_list即可:
IF (sBnsStat= 'REN') THEN -- 确保sPrevPermitNo是pljson_list类型并初始化 sPrevPermitNo := pljson_list(); OPEN cPrevPermit FOR SELECT permit_no FROM buss_hist WHERE bin = m_sBin AND tax_year < sTaxYear; BEGIN LOOP FETCH cPrevPermit INTO s_PrevPermitNo_Temp; -- 用临时变量存单个值 EXIT WHEN cPrevPermit%NOTFOUND; -- 跳过空值 IF s_PrevPermitNo_Temp IS NOT NULL AND TRIM(s_PrevPermitNo_Temp) <> '' THEN sPrevPermitNo.append(s_PrevPermitNo_Temp); END IF; END LOOP; END; CLOSE cPrevPermit; oBusinessInfo.put('prevPermitNo', sPrevPermitNo); END if;
最终返回结果:
"prevPermitNo": ["2019-00093", "2020-00311", "2021-00509"]
内容的提问来源于stack exchange,提问作者jen
相关产品推荐
相关产品推荐

