pl / sql - to_date не работает с параметром немедленного выполнения - PullRequest
1 голос
/ 04 июня 2011

Я хочу иметь возможность выполнить мой нижеприведенный процесс следующим образом:

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');

Ответы [ 2 ]

6 голосов
/ 04 июня 2011

Вы объявляете переменную, которая приводит входной параметр к дате: почему бы не использовать его?

Кроме того, 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 намного эффективнее Обратите внимание, что мы все еще должны выбрать в некоторые переменные.

1 голос
/ 04 июня 2011

Вы используете две разные записи в двух вызовах to_date. Я думаю, что один из них (второй) не так.

...