Как мне передать значение даты курсору в plsql?

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