【问题标题】: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;