2011-06-04 2 views
1

Я хочу быть в состоянии выполнить мои ниже прока так:PL/SQL - to_date не работает с выполнить немедленный параметр

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

кода Proc является:

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": invalid identifier.

собирает, но он выдает ошибку, когда я запускаю эту команду:

EXEC procname('29-JAN-2011'); 
+0

На какой линии? – GolezTrol

+0

Это не настоящий код, не так ли? Он не будет компилироваться. – GolezTrol

+0

любые идеи? – poots

ответ

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

+1

В качестве примечания стороны, что trunc() может избежать использования индекса над холодным. Он может рассмотреть трюк «... где холодность между: 1 и: 2 + 0.99999» с использованием вардата, вардата. – Samuel

1

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

+0

, пожалуйста, предоставьте правильный синтаксис, поскольку логика правильная. – poots

+0

Я имею в виду, что один из них - DD-MON-YYYY, а другой - DD/MON/YYYY. Вход использует тире, а не косые черты, поэтому я думаю, что второе неверно. – GolezTrol

+0

Может быть проблема с настройкой языка. Вы живете в стране, где январь не сокращен до JAN? – GolezTrol

 Смежные вопросы

  • Нет связанных вопросов^_^