Как передать значение даты курсору в 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, или есть отдельная панель для просмотра вывода, которую необходимо включить для рабочего листа.

Другие вопросы по тегам