基本上我想将日期值传递给游标,然后打印出每个找到的整行/记录。我遇到了麻烦,因为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语句更改为已知的单个字段名称,我也没有输出值。
答案 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中执行此操作,或者有一个单独的窗格用于查看输出,您需要为工作表启用该输出。