2011-04-24 106 views
3

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

这是我到目前为止有:

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语句已知的单场名称。

回答

3

不幸的是,您不能从单个DBMS_OUTPUT调用中打印出整行;您需要分别打印由光标返回的每列。 PUT_LINEexpects 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中执行此操作,或者有一个单独的窗格用于查看输出,您需要为工作表启用该窗口。

相关问题