如何在 PL/SQL 中使用声明变量创建存储过程

问题描述 投票:0回答:1

我想使用声明变量在 PL/SQL 中创建一个存储过程。但这没有用。我怎样才能创建这个?

我的代码如下所示:

创建或替换过程 only_for_test

开始

声明 最大日期日期;

开始

选择 to_date(max(create_date)) INTO最大日期 FROM table_a,其中产品 = 'A' 且 create_date >= 日期'2023-09-01';

结束;

如果 最大日期 = to_date(系统日期) 然后 开始 过程测试; 结尾; 结束如果;

承诺;

仅结束_for_test;

-- 上面的代码显示错误: PLS-00201:必须声明标识符“MAXDATE” PL/SQL:忽略语句

请帮助我。非常感谢。

oracle stored-procedures plsql plsqldeveloper
1个回答
0
投票

这是一个范围。阅读以下代码中的注释。

首先,测试程序(避免出现不存在的错误):

SQL> CREATE PROCEDURE proc_test
  2  IS
  3  BEGIN
  4     NULL;
  5  END;
  6  /
CREATE PROCEDURE proc_test
                 *
ERROR at line 1:
ORA-00955: name is already used by an existing object

这是您的过程(稍作修改,以便它在我的架构中运行):

SQL> CREATE OR REPLACE PROCEDURE only_for_test
  2  AS
  3  BEGIN
  4     DECLARE
  5        maxdate  DATE;          --> this MAXDATE is local to its own DECLARE-BEGIN-END block
  6     BEGIN                      --> and you can use it whererver you want, but only within its block
  7        SELECT TO_DATE (MAX (hiredate))
  8          INTO maxdate
  9          FROM emp
 10         WHERE     job = 'CLERK'
 11               AND hiredate >= DATE '1980-09-01';
 12     END;
 13
 14     IF maxdate = TO_DATE (SYSDATE) --> referencing it here is out-of-scope, it doesn't exist
 15     THEN                           --> in this context
 16        BEGIN
 17           proc_test;
 18        END;
 19     END IF;
 20
 21     COMMIT;
 22  END only_for_test;
 23  /

Warning: Procedure created with compilation errors.

SQL> show err
Errors for PROCEDURE ONLY_FOR_TEST:

LINE/COL ERROR
-------- -----------------------------------------------------------------
14/4     PL/SQL: Statement ignored
14/7     PLS-00201: identifier 'MAXDATE' must be declared
SQL>

这就是有效的 - 变量在过程级别声明:

SQL> CREATE OR REPLACE PROCEDURE only_for_test
  2  AS
  3     maxdate  DATE; --> if you declare it here, on procedure level, then ...
  4  BEGIN
  5     BEGIN
  6        SELECT TO_DATE (MAX (hiredate))
  7          INTO maxdate
  8          FROM emp
  9         WHERE     job = 'CLERK'
 10               AND hiredate >= DATE '1980-09-01';
 11     END;
 12
 13     IF maxdate = TO_DATE (SYSDATE) --> ... you CAN reference it through the whole procedure
 14     THEN
 15        BEGIN
 16           proc_test;
 17        END;
 18     END IF;
 19
 20     COMMIT;
 21  END only_for_test;
 22  /

Procedure created.

SQL>
© www.soinside.com 2019 - 2024. All rights reserved.