You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.14 05:40:19