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