Как передать значение даты курсору в plsql?
В основном я хотел бы передать значение даты курсору и распечатать всю строку / запись после каждого найденного. У меня проблемы, потому что а) я не знаю, правильно ли конвертируется моя дата в разделе BEGIN, и б) я получаю "неправильное число или типы аргументов при вызове" PUT_LINE "" при печати каждой строки.
Это то, что я до сих пор:
DEFINE B_HIREDATE = 11-OCT-88
DECLARE
cursor DATE_CUR (the_date DATE) is
select * from employees
where hire_date > to_date(the_date, 'dd-mon-yy')
order by hire_date;
r_emp DATE_CUR%ROWTYPE;
BEGIN
for r_emp IN DATE_CUR('&B_HIREDATE') LOOP
dbms_output.put_line(r_emp);
end LOOP;
END;
/
Я не получаю никаких выходных значений, даже если я изменяю свой оператор выбора на известное имя одного поля.
1 ответ
Вы не можете распечатать всю строку из одного DBMS_OUTPUT
звоните, к сожалению; вам нужно будет распечатать каждый столбец, возвращаемый курсором в отдельности. PUT_LINE
ожидает VARCHAR2
аргумент или что-то, что может быть неявно преобразовано. Вы можете объединить несколько значений в один вызов. Хорошее форматирование не так просто.
Преобразование даты почти в порядке, но вы должны иметь TO_DATE
в вызове курсора, так как параметр курсора ожидает DATE
; и вы должны использовать RR
вместо YY
в маске даты, или желательно использовать 4-значные годы и маску YYYY
,
SET SERVEROUTPUT ON
DEFINE B_HIREDATE = 11-OCT-1988
DECLARE
cursor DATE_CUR (the_date DATE) is
select * from employees
where hire_date > the_date
order by hire_date;
BEGIN
for r_emp IN DATE_CUR(TO_DATE('&B_HIREDATE','DD-MON-YYYY')) LOOP
dbms_output.put_line(r_emp.hire_date);
end LOOP;
END;
Вам не нужно явно объявлять r_emp
в качестве переменной с этим синтаксисом курсора (но вы бы с OPEN
/ FETCH
/ CLOSE
версия).
Если вы используете это в SQL*Plus, вам нужно добавить SET SERVEROUTPUT ON
в начале, чтобы позволить DBMS_OUTPUT
звонки для отображения. Вы также можете сделать это в SQL Developer, или есть отдельная панель для просмотра вывода, которую необходимо включить для рабочего листа.