我正在开发一个将连接到Oracle或SQL Server的应用程序,并构建一个要在服务器上执行的SQL字符串。我发现当SQL字符串超过~4000个字符时,我的方法在Oracle中失败了。我的价格高于4000,但只是略高;我假设Oracle忽略了一些空白/格式化字符。
一旦我进入Oracle过程,我使用的VARCHAR2的最大长度为32,767 - 我认为应该绰绰有余,但我似乎无法将VARCHAR2传入Oracle更长的时间比~4000。
另外,我正在尝试尽可能减少Oracle和SQL Server之间的差异。
我可以采取哪些其他方法来超越Oracle和SQL Server中的4,000限制。
修改
我同意在许多情况下,长度为4,000个字符的SQL查询过多,可能可以更好地重写,或者基础数据可能会从重组中受益。通常,对某些表进行别名化就足以让事情顺利进行。但我的目标是让任何有效的SQL查询通过我的应用程序返回相同的结果,因为你通过像SQL Developer这样的强大工具....因为那是用户说的,'不要告诉我我的查询写得不好它在$工具中工作正常,但在你的工作中不起作用'
答案 0 :(得分:3)
32000 VARCHAR2仅在PL / SQL中可见(看看@ this link http://asktom.oracle.com/pls/asktom/f?p=100:11:0::::P11_QUESTION_ID:7032414607769)。
正如您所指出的,SQL VARCHAR2限制为4000个字符。由于您使用的是外部产品(即不是PL / SQL而是.net),因此限制为4000k。也就是说,如果您决定使用varchar2。
要解决此问题,您需要使用CLOB。
我假设您正在使用dbms_sql.parse来准备您的语句,这确实有一个过载需要CLOB,您应该设置:
DECLARE
sqlstr CLOB;
tCursor PLS_INTEGER;
RetVal NUMBER;
BEGIN
sqlstr := 'SELECT * FROM DUAL';
tCursor := dbms_sql.open_cursor;
dbms_sql.parse(tCursor, sqlstr, dbms_sql.NATIVE);
RetVal := dbms_sql.execute(tCursor);
dbms_sql.close_cursor(tCursor);
END;
/
答案 1 :(得分:1)
使用TEXT而不是VARCHAR类型。
答案 2 :(得分:0)
我可能会建议如果查询需要4,000个字符,那么底层数据结构或查询方法可能是真正的问题,而不是任意字符限制。
我不会要求任何人发布一个4000字符的查询,但也许你可以给我们“坚果”并讨论它?