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不幸的是,您无法从一次通话中打印出整行;您需要单独打印光标返回的每一列。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//版本)FETCHCLOSE

如果您在 SQL*Plus 中运行它,您需要SET SERVEROUTPUT ON在开始时添加以允许DBMS_OUTPUT显示调用。您也可以在 SQL Developer 中执行此操作,或者有一个单独的窗格用于查看输出,您需要为工作表启用该窗格。

于 2011-04-24T22:36:47.407 回答