3

基本的に、日付の値をカーソルに渡し、見つかった行/レコード全体を出力したいと思います。a) BEGIN セクションで日付が適切に変換されているかどうかわからない、および b) 各行を印刷するときに「'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;
/

select ステートメントを既知の単一フィールド名に変更しても、出力値が得られません。

4

1 に答える 1

4

DBMS_OUTPUT残念ながら、1 回の呼び出しで行全体を出力することはできません。カーソルによって返された各列を個別に印刷する必要があります。PUT_LINE 暗黙VARCHAR2的に変換できる引数または何かが必要です。複数の値を 1 つの呼び出しに連結できます。ただし、適切な書式設定は簡単ではありません。

日付の変換はほぼ問題ありませんがTO_DATE、カーソル パラメーターにはDATE;が必要なため、カーソル呼び出しに を含める必要があります。RR日付マスクの代わりに使用するYYか、できれば4桁の年と mask を使用する必要があります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//バージョンではそうします) FETCHCLOSE

これを SQL*Plus で実行している場合はSET SERVEROUTPUT ON、最初に追加して、DBMS_OUTPUT呼び出しを表示できるようにする必要があります。SQL Developerでもこれを行うことができます。または、出力を表示するための別のペインがあり、ワークシートに対して有効にする必要があります。

于 2011-04-24T22:36:47.407 に答える