#oracle #plsql #database-cursor
#Oracle #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('amp;B_HIREDATE') LOOP
dbms_output.put_line(r_emp);
end LOOP;
END;
/
Я не получаю выходных значений, даже если я изменяю свой оператор select на известное имя одного поля.
Ответ №1:
К сожалению, вы не можете распечатать всю строку из одного DBMS_OUTPUT
вызова; вам нужно будет распечатать каждый столбец, возвращаемый курсором по отдельности. PUT_LINE
ожидает VARCHAR2
аргумент или что-то еще, что может быть неявно преобразовано. Вы можете объединить несколько значений в один вызов. Однако правильное форматирование — это непросто.
Преобразование даты почти выполнено, но у вас должно быть TO_DATE
в вызове cursor, поскольку параметр cursor ожидает 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('amp;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, или есть отдельная панель для просмотра выходных данных, которую вам нужно включить для рабочего листа.