我们的应用程序大量使用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来说太长了?
答案 0 :(得分:1)
我建议您查看对5198856的响应,以便将字符串数组发送到PL / SQL。
另一方面,您可以修改参数是CLOB的PL / SQL过程,而不是VARCHAR2,其限制为32767个字符会产生CLOB类型不存在的限制。