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

标签 oracle plsql database-cursor

基本上我想将日期值传递给游标,并在找到每个日期后打印出整行/记录。我遇到问题是因为 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 语句更改为已知的单个字段名称,我也没有得到任何输出值。

最佳答案

不幸的是,您无法通过单个 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/关闭 版本)。

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

关于oracle - 如何将日期值传递给 plsql 中的游标?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5773494/

相关文章:

sql - 与删除和重新创建索引相比,禁用和重新启用索引有什么区别?

java - 没有小时、分钟、秒的 Oracle current_date 或 sysdate

oracle - JDBC 连接失败并出现 ORA-12516

for-loop - PL/SQL 中 If 条件中的字符串比较

sql-server - TSQL 更改游标定义

oracle - 从外部表 : ORA-29913: error in executing ODCIEXTTABLEOPEN callout 中选择时出现 sqlplus 错误

oracle - 从存储过程中检索参数?

java - getInt 方法未从数据库表返回值

postgresql - Postgres - 临时文件大小超过 temp_file_limit

Android如何查询android中巨大的数据库(光标大小限制为1MB)