我想使用声明变量在 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:忽略语句
请帮助我。非常感谢。
这是一个范围。阅读以下代码中的注释。
首先,测试程序(避免出现不存在的错误):
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>