【问题标题】:PL/SQL Error assign sysdate value to variable (date) using select into clausePL/SQL 错误使用 select into 子句将 sysdate 值分配给变量(日期)
【发布时间】:2014-05-10 17:04:17
【问题描述】:

我正在编写一个 PL/SQL 过程来生成报告。

这是我测试并遇到编译错误的脚本的一部分。

我相信这不是 select into 子句的语法,但我不知道为日期变量赋值时的确切问题...

以前有人遇到过这个错误吗?

DECLARE
  v_bc_mth DATE;
BEGIN
  SELECT TRUNC(ADD_MONTHS(SYSDATE, -1)) INTO v_bc_mth FROM dual; --what's wrong with the clause
  SELECT * FROM bc WHERE v_bc_mth BETWEEN bc_start_date AND bc_end_date;
END;

PLS-00428:此 SELECT 语句中应有一个 INTO 子句 06550. 00000 - “第 %s 行,第 %s 列:\n%s” *原因:通常是 PL/SQL 编译错误。

【问题讨论】:

  • 你确定错误不在下一行吗?

标签: sql database oracle plsql


【解决方案1】:

SELECT 语句都需要 INTO 子句。

但是,您真的需要使用 PL/SQL 吗?

您可以在 SQL 中完成所有操作,避免上下文切换:

  SELECT *
    FROM bc 
   WHERE TRUNC(ADD_MONTHS(SYSDATE, -1)) BETWEEN bc_start_date AND bc_end_date;

或者,你可以重写你所拥有的,这样在你的 PL/SQL 块中只有一次切换到 SQL:

DECLARE
  TYPE bc_tabtype IS TABLE OF bc%ROWTYPE
       INDEX BY pls_integer;
  --
  bc_tab bc_tabtype;
BEGIN
  SELECT *
    BULK COLLECT INTO bc_tab
    FROM bc 
   WHERE TRUNC(ADD_MONTHS(SYSDATE, -1)) BETWEEN bc_start_date AND bc_end_date;

  -- Do what you want with the results you now have in the Associative Array bc_tab
END;

您可能需要查找关联数组和 BULK COLLECT 等来了解它们。

Oracle 副总裁 Tom Kyte 简洁地说:

在开发数据库时,我有一个非常简单的口头禅 软件,这些年来我已经写过很多次了:

You should do it in a single SQL statement if at all possible.

If you cannot do it in a single SQL statement, do it in PL/SQL.

If you cannot do it in PL/SQL, try a Java stored procedure.

If you cannot do it in Java, do it in a C external procedure.

If you cannot do it in a C external procedure, you might want to seriously think about why it is you need to do it.

编辑: 根据您的评论,试试这个:

DECLARE
  v_bc_mth DATE := TRUNC(ADD_MONTHS(SYSDATE, -1));
  --
  TYPE bc_tabtype IS TABLE OF bc%ROWTYPE
       INDEX BY pls_integer;
  --
  bc_tab bc_tabtype;
BEGIN
  SELECT * 
    BULK COLLECT INTO bc_tab
    FROM bc 
   WHERE v_bc_mth BETWEEN bc_start_date AND bc_end_date;
END;

【讨论】:

    猜你喜欢
    • 2011-12-10
    • 1970-01-01
    • 2015-08-26
    • 2022-01-19
    • 2022-12-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多