【问题标题】:Long Queries in Oracle and SQL ServerOracle 和 SQL Server 中的长查询
【发布时间】:2011-09-05 17:29:00
【问题描述】:

我正在开发一个应用程序,该应用程序将连接到 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 等强大工具获得的结果相同的结果......因为这就是用户所说的,'不要告诉我我的查询写得不好,它在 $tool 中可以正常工作,但在你的中不起作用'

【问题讨论】:

  • 仅供参考,当您提到 Microsoft 的产品时,我建议您使用术语“SQL Server”。 “MS SQL”不是产品名称,也容易与“My SQL”混淆。
  • @John - 谢谢。以后我会牢记这一点。
  • “建立一个要在服务器上执行的SQL字符串”:你的意思是动态的未参数化的SQL?

标签: .net sql sql-server oracle


【解决方案1】:

使用 TEXT 代替 VARCHAR 类型。

【讨论】:

    【解决方案2】:

    32000 VARCHAR2 仅在 PL/SQL 中可见(查看@此链接 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;
    /
    

    【讨论】:

      【解决方案3】:

      我可能会恭敬地建议,如果查询需要 4,000 个字符,那么底层数据结构或查询方法可能才是真正的问题,而不是任意字符限制。

      我不会要求任何人发布 4,000 个字符的查询,但也许你可以给我们一些“坚果”并讨论一下?

      【讨论】:

      • 我正在尝试开发一个类似于 SQL Developer 的工具。它内置了一些业务逻辑,使新手用户可以轻松使用;但是我们的高级用户希望完全控制他们的 SQL。他们正在构建“有效”并在 Oracle 或 SQL Server 中正确执行的 SQL 字符串;但无法通过我的应用程序执行。我会说,其中许多查询都很丑陋,可以用更少的字符来完成 - 但我的目标是让任何查询都像输入 SQL Dev 这样的工具一样工作。
      • 啊。我没有意识到你在做什么。 FWIW-哈里森听起来他知道他在说什么。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-04-02
      • 1970-01-01
      • 1970-01-01
      • 2016-07-29
      • 1970-01-01
      • 2014-03-31
      • 2014-05-30
      相关资源
      最近更新 更多