0

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

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 

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

4

1 回答 1

1

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

此外,正如 Lolo 在评论中指出的那样,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;
于 2011-11-29T18:22:57.043 回答