【问题标题】:Dynamic SQL and out field in oracle procedureoracle过程中的动态SQL和out字段
【发布时间】:2012-01-09 00:40:58
【问题描述】:

当我使用这个时出现错误:

PROCEDURE GET_BY_CRIT(vchFilter varchar2(500),
                      intCantTotal OUT INT,
                      curResult OUT sys_refcursor)
IS
BEGIN

    OPEN curResult FOR
    'SELECT COLUMN1,COLUMN2 FROM SOME_TABLE WHERE '||vchFilter

    EXECUTE IMMEDIATE 'SELECT COUNT(*) FROM SOME_TABLE WHERE '||vchFilter 
    INTO intCantTotal 
END

错误:

ORA-00936: missed expression 

但是当我单独执行每个句子时,它会正确运行。

【问题讨论】:

  • 如果您愿意分享错误描述,对某人来说可能会更容易。
  • 感谢您的建议,我添加了错误代码
  • 尝试在语句末尾添加分号。

标签: oracle stored-procedures dynamic-sql out


【解决方案1】:

您遇到的错误似乎没有意义。 Oracle 应该抛出编译错误,因为函数的参数没有长度。 vchFilter 应声明为 VARCHAR2,而不是 VARCHAR2(500)

此外,正如 Lolo 在 cmets 中指出的那样,PL/SQL 块中的语句需要以分号结束。

PROCEDURE GET_BY_CRIT(vchFilter varchar2,
                      intCantTotal OUT integer,
                      curResult OUT sys_refcursor)
IS
BEGIN
    OPEN curResult FOR
    'SELECT COLUMN1,COLUMN2 FROM SOME_TABLE WHERE '||vchFilter;

    EXECUTE IMMEDIATE 'SELECT COUNT(*) FROM SOME_TABLE WHERE '||vchFilter 
    INTO intCantTotal;
END;

另外请注意,不能保证第二个 SQL 语句将看到与第一个 SQL 语句相同的 COUNT,除非您可以保证 SOME_TABLE 不会同时被任何其他会话修改查询它。我通常对运行查询和执行单独计数的需要持谨慎态度——这通常表明存在更基本的问题。如果您需要 COUNT 与您正在运行的查询保持一致,您需要在查询中添加一个分析 COUNT 并让调用者获取该列。

PROCEDURE GET_BY_CRIT(vchFilter varchar2,
                      curResult OUT sys_refcursor)
IS
BEGIN
    OPEN curResult FOR
    'SELECT COLUMN1,COLUMN2, COUNT(*) OVER () cnt FROM SOME_TABLE WHERE '||vchFilter;
END;

【讨论】:

    猜你喜欢
    • 2017-06-19
    • 1970-01-01
    • 1970-01-01
    • 2014-04-09
    • 2020-10-08
    • 1970-01-01
    • 1970-01-01
    • 2021-04-04
    • 1970-01-01
    相关资源
    最近更新 更多