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

Posted

技术标签:

【中文标题】如何将日期值传递给 plsql 中的游标?【英文标题】:How do I pass a date value to a cursor in plsql? 【发布时间】:2011-04-24 21:56:38 【问题描述】:

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

【问题讨论】:

【参考方案1】:

很遗憾,您无法从单个 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 中执行此操作,或者有一个单独的窗格用于查看输出,您需要为工作表启用该窗格。

【讨论】:

以上是关于如何将日期值传递给 plsql 中的游标?的主要内容,如果未能解决你的问题,请参考以下文章

将用户定义表中的日期值传递给 SQL Server 2008 存储过程

将 Ajax 调用中的日期值传递给 MVC

如何将 vb.net 中日期的空值传递给 sql 存储过程?

如何设置默认日期参数以传递给 JavaScript 中的 ajax get 调用,在选择日期值时它应该更改

如何动态地将表名传递给 PL SQL 游标?

如何拆分传递给pl sql过程的参数值