如何将日期值传递给plsql中的游标?

时间:2011-04-24 21:56:39

标签: oracle plsql database-cursor

基本上我想将日期值传递给游标,然后打印出每个找到的整行/记录。我遇到了麻烦,因为a)我不知道我的日期是否在BEGIN部分正确转换了,b)我在打印每一行时得到“错误的数字或类型的参数来调用'PUT_LINE'”。 / p>

这是我到目前为止所做的:

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语句更改为已知的单个字段名称,我也没有输出值。

1 个答案:

答案 0 :(得分:3)

不幸的是,您无法从单个DBMS_OUTPUT电话中打印出整行;你需要单独打印光标返回的每一列。 PUT_LINE expects a VARCHAR2 argument或可以隐式转换的内容。您可以将多个值连接到一个调用中。好的格式化并不容易。

日期转换几乎没问题,但是你应该在游标调用中有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中执行此操作,或者有一个单独的窗格用于查看输出,您需要为工作表启用该输出。