我正在尝试为包装奠定基础,但即使开始也遇到了麻烦.我已经成功创建了一个基本的包规范,并且只想测试包体,但是我无法编译它.规范代码是:
CREATE OR REPLACE PACKAGE synchronize_my_data
AS
PROCEDURE synchronize_data(p_run_date IN date);
END synchronize_my_data;
Run Code Online (Sandbox Code Playgroud)
这是包体代码:
CREATE OR REPLACE PACKAGE BODY synchronize_my_data
IS
PROCEDURE synchronize_data(p_run_date IN date) IS
PROCEDURE process_deletes(p_run_date IN date) IS
BEGIN
dbms_output.put_line('Run Date: ' || to_char(p_run_date, 'MM/DD/YYYY'));
END process_deletes;
BEGIN
process_deletes(p_run_date);
END synchronize_data;
END synchronize_my_data;
Run Code Online (Sandbox Code Playgroud)
我不断收到编译错误,但无法弄清楚代码有什么问题.它似乎是基本代码,我只是遗漏了一些明显的东西吗?
该代码似乎为我编译.你遇到了什么错误?
SQL> CREATE OR REPLACE PACKAGE synchronize_my_data
2 AS
3 PROCEDURE synchronize_data(p_run_date IN date);
4 END synchronize_my_data;
5 /
Package created.
SQL> CREATE OR REPLACE PACKAGE BODY synchronize_my_data
2 IS
3 PROCEDURE synchronize_data(p_run_date IN date) IS
4 PROCEDURE process_deletes(p_run_date IN date) IS
5 BEGIN
6 dbms_output.put_line('Run Date: ' || to_char(p_run_date, 'MM/DD/YYYY'));
7 END process_deletes;
8 BEGIN
9 process_deletes(p_run_date);
10 END synchronize_data;
11
12 END synchronize_my_data;
13 /
Package body created.
Run Code Online (Sandbox Code Playgroud)
从一般的风格角度来看,在包体中的另一个过程中定义过程通常没什么意义.使用包的好处之一是您可以同时拥有公共和私有过程.您可以将process_deletes过程创建为私有过程,只需在体中定义它而不在规范中定义它.
CREATE OR REPLACE PACKAGE BODY synchronize_my_data
IS
PROCEDURE process_deletes(p_run_date IN date)
IS
BEGIN
dbms_output.put_line('Run Date: ' || to_char(p_run_date, 'MM/DD/YYYY'));
END process_deletes;
PROCEDURE synchronize_data(p_run_date IN date)
IS
BEGIN
process_deletes(p_run_date);
END synchronize_data;
END synchronize_my_data;
Run Code Online (Sandbox Code Playgroud)
这不应该与你得到的任何错误有任何关系.但它应该使您的代码更容易处理.