将大型字符串数组作为VarChar2传递到SQL中

时间:2015-04-24 15:45:08

标签: java sql

我们的应用程序大量使用SQL函数。一个这样的函数使用这种大的String变量:

public static boolean callSQL(Connection conn, String[] s)
    throws DatabaseException
{
    boolean result = false;
    String query = "begin ? := "+qualProc("callSQL")+"(?); end;";
cs.registerOutParameter(1, Types.INTEGER);
**cs.setString(2, GeneralUtils.join(s,","));**
**cs.execute();**
        if(cs.getInt(1) > 0)
            result = true;
    }catch(SQLException se){
        se.printStackTrace(); 
        throw new DatabaseException(se.getMessage());
    }finally{
        if(cs != null)
            try{ cs.close(); }catch(SQLException e){}
    }

    return result;
}

注意:qualProc是我们数据库的名称。出于安全原因,我在这里没有使用真实姓名。

应用程序本身运行顺利,但当它尝试执行SQL命令时,我们收到以下错误:

ORA-06532: Subscript outside of limit ORA-06512: at "XXXX.XX", line XXX ORA-06512: at line X

在包函数本身中,它使用如下字符串:

  FUNCTION callSQL(s_tring IN VARCHAR2)
RETURN INTEGER IS

该字符串可以(并且已经)长于VarChar2的大小限制(32768字节,根据此答案https://stackoverflow.com/a/186436/2188082)。

一个选项是将我们的数组分成可管理的块并运行SQL函数直到它处理完整个字符串,但理想情况下我们想用SQL包更改解决这个问题 - 有没有办法让SQL接受一个字符串那对于VarChar2来说太长了?

1 个答案:

答案 0 :(得分:1)

我建议您查看对5198856的响应,以便将字符串数组发送到PL / SQL。

另一方面,您可以修改参数是CLOB的PL / SQL过程,而不是VARCHAR2,其限制为32767个字符会产生CLOB类型不存在的限制。