Oracle和SQL Server中的长查询

时间:2011-05-31 18:42:23

标签: .net sql sql-server oracle

我正在开发一个将连接到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这样的强大工具....因为那是用户说的,'不要告诉我我的查询写得不好它在$工具中​​工作正常,但在你的工作中不起作用'

3 个答案:

答案 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字符的查询,但也许你可以给我们“坚果”并讨论它?