将表中的单个值分配给 ORACLE PL/SQL 中声明的变量时出错

Posted

技术标签:

【中文标题】将表中的单个值分配给 ORACLE PL/SQL 中声明的变量时出错【英文标题】:Getting an error when assigning single value from table to declared variable in ORACLE PL/SQL 【发布时间】:2021-11-11 08:23:42 【问题描述】:

我正在为 Oracle DB 10g/11g 编写程序,我需要为变量分配特定的日期值。代码如下。

DECLARE 
    date_from DATE := NULL;
DECLARE 
    d_count NUMBER := 0;
BEGIN
    SELECT COUNT(*) INTO d_count FROM TABLE_X;

    IF d_count = 0 THEN
        SELECT MIN(TRX_DATE) INTO date_from FROM TABLE_Y;
    ELSE
        SELECT MAX(TRX_DATE) INTO date_from FROM TABLE_X;
    END IF;
END;

当我运行它时,我得到了这个错误。

Error starting at line : 1 in command -
DECLARE 
    date_from DATE := NULL;
DECLARE 
    d_count NUMBER := 0;
BEGIN
    SELECT COUNT(*) INTO d_count FROM TABLE_X;

    IF d_count = 0 THEN
        SELECT MIN(TRX_DATE) INTO date_from FROM TABLE_Y;
    ELSE
        SELECT MAX(TRX_DATE) INTO date_from FROM TABLE_X;
    END IF;
END;
Error report -
ORA-06550: line 3, column 1:
PLS-00103: Encountered the symbol "DECLARE" when expecting one of the following:

    begin function pragma procedure subtype type <and identifier>
    <a double-quoted delimited-identifier> current cursor delete
    exist prior
The symbol "begin" was substituted for "DECLARE" to continue.
ORA-06550: line 13, column 4:
PLS-00103: Encountered the symbol "end-of-file" when expecting one of the following:
    
    ( begin case declare and exception exit for goto if loop mod
    null pragma raise return select update while with
    <an identifier><a double-quoted
06550. 00000 - "line %s, column %s:\n%s"
*Cause: Usuallz a PL/SQL compilation error.
*Action:

我有 T-SQL 经验,但对 OracleDB 中的 PL/SQL 非常陌生。 提前致谢。

【问题讨论】:

您在line 3, column 1 能看到什么?正确,另一个不应该存在的 declare 关键字。请检查the documentation 的语法,不需要任何问题。 谢谢您,我应该更加小心,感谢您分享文档。我刚开始在任务中使用 Oracle DB,通常我喜欢在开始新事物之前阅读文档。 【参考方案1】:

您使用了额外的声明。这应该没问题:

DECLARE 
    date_from DATE := NULL; 
    d_count NUMBER := 0;
BEGIN
    SELECT COUNT(*) INTO d_count FROM TABLE_X;

    IF d_count = 0 THEN
        SELECT MIN(TRX_DATE) INTO date_from FROM TABLE_Y;
    ELSE
        SELECT MAX(TRX_DATE) INTO date_from FROM TABLE_X;
    END IF;
END;

脚本的基本模板:

declare 
  -- Local variables here
  i integer;
begin
  --  statements here
end;

程序的基本模板:

procedure TEST(Name in out type, Name in out type, ...) is
begin
  
end TEST;

【讨论】:

感谢您的回答。尽管我的问题有点傻,但你的回答和模板对我了解脚本和程序的结构很有帮助。 是的,它与 TSQL 非常相似。如果你有机会使用 PL/SQL Developer IDE,它有非常好的现成模板部分供你使用,它也可以提高你的速度。只是一个建议。祝你在新领域一切顺利:) @nedensel 无论如何,检查文档会很好。其中的每条 SQL 语句都有一堆示例,展示了基本语法、语法元素的不同用法、性能差异。例如,PL/SQL block @Ali Fidanli 我会检查一下,再次感谢您。我也有点着急,没有正确检查一切:) @astentx 我只是在使用 T-SQL 习惯,而没有先阅读文档。但是,我一定会阅读以防止这种语法错误。【参考方案2】:

在你的情况下,只有一个DECLARE 就足够了。

此外(虽然不是错误),

声明的变量默认为NULL;您不必指定它(即DATE_FROMd_count 用于接受count 函数的结果;如果在 table_x 中找不到任何内容,则 count 无论如何都会是 0,因此您也不必指定 d_count 的初始值

所以:

DECLARE
   date_from  DATE;
   d_count    NUMBER;
BEGIN
   SELECT COUNT (*) INTO d_count FROM TABLE_X;

   IF d_count = 0 THEN
      SELECT MIN(TRX_DATE) INTO date_from FROM TABLE_Y;
   ELSE
      SELECT MAX(TRX_DATE) INTO date_from FROM TABLE_X;
   END IF;
END;

【讨论】:

旁注:SELECT MAX(TRX_DATE) INTO date_from FROM TABLE_X; 可以通过在第一条语句中添加 max(trx_date) 来避免。

以上是关于将表中的单个值分配给 ORACLE PL/SQL 中声明的变量时出错的主要内容,如果未能解决你的问题,请参考以下文章

每个将表名传递给过程的 ORACLE PL/SQL

如何在 Oracle PL/SQL 过程的开始部分之后声明游标

“如何修复 oracle pl/sql 中的触发器?

将表中的列值作为参数传递给存储过程 sql

在 Oracle PL/SQL 中,当列的其余值相等时,我可以交换表中两个不同行的同一列的值吗?

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