1

我希望能够像这样执行我的以下过程:

exec procname('29-JAN-2011');

过程代码是:

PROCEDURE procname(pardate VARCHAR2) IS

  vardate DATE := to_date(pardate, 'DD-MON-YYYY');
  SQLS VARCHAR2(4000);

BEGIN    

  SQLS := 'SELECT cola, colb
             FROM tablea 
            WHERE TRUNC(coldate) = TRUNC(TO_DATE('''||pardate||''',''DD/MON/YYYY''))';

  EXECUTE IMMEDIATE SQLS;

END;

它不断抛出错误:

ORA-00904: "JAN": 无效标识符。

它可以编译,但是当我运行此命令时会引发错误:

EXEC procname('29-JAN-2011');
4

2 回答 2

6

您声明了一个将输入参数转换为日期的变量:为什么不使用它?

此外,应用于日期的 TRUNC() 删除了时间元素。您在这里不需要它,因为您传递的值没有时间。

所以,你的代码应该是:

PROCEDURE procname(pardate VARCHAR2) IS

  vardate DATE := to_date(pardate, 'DD-MON-YYYY');
  SQLS VARCHAR2(4000)  := 'select cola, colb FROM tablea 
           WHERE TRUNC(coldate) = :1';

   l_a tablea.cola%type;
   l_b tablea.colb%type;
BEGIN    
  EXECUTE IMMEDIATE SQLS 
      into l_a, l_b
      using vardate;
END;  

使用绑定变量指定动态 SQL 语句并使用 USING 语法执行它的效率要高得多。请注意,我们仍然必须选择一些变量。

于 2011-06-04T02:52:59.873 回答
1

您在对 的两次调用中使用了两种不同的表示法to_date。我认为其中一个(第二个)是错误的。

于 2011-06-04T02:38:45.720 回答