2012-12-07 54 views
4

我想为包打下基础,但即使入门也遇到困难。我已经成功创建了一个基本的包规范,并且只想测试包体,但是我无法编译它。该规范的代码是:创建Oracle包体

CREATE OR REPLACE PACKAGE synchronize_my_data 
AS 
    PROCEDURE synchronize_data(p_run_date IN date); 
END synchronize_my_data; 

,这里是包体代码:

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; 

我不断收到一个编译错误,但无法弄清楚什么是错的代码。它看起来像基本代码,我只是错过了一些明显的东西?

+3

你错过了告诉我们编译错误的可能吗? –

+1

这里工作没有任何改变。也许你没有权利执行dbms_output? –

+0

我的不好,我应该发布编译错误。我认为ammoQ钉了它,我没有权利执行ebms_output;我以dba身份登录,运行它,并执行得很好。感谢您的答案和编码建议。 – user1408057

回答

7

该代码似乎为我编译。你遇到了什么错误?

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. 

从一般的文体角度来看,在包体中的另一个过程中定义一个过程通常是没有意义的。使用软件包的好处之一是您可以同时拥有公共和私人程序。您可以创建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; 

这不应该与你得到的任何错误有任何关系。但它应该让你的代码更容易处理。

+0

另一个过程中的过程可以看到外部过程的局部变量,有时可以方便地使用这些局部变量以避免使用大量参数的过程。 –

+0

@ammoQ - 的确如此,这就是为什么我说“一般”而不是“总是”。如果你有太多的局部变量将它们传递给另一个过程是过度的,并且你的过程做得太多,以至于你觉得有必要将某些事情分解到一个单独的过程中,但是,100次中有99次,我建议你需要重新考虑体系结构,并将其分解为多个参数相对较少的私有过程。 –

+1

“在包体中的另一个过程中定义一个过程通常是没有意义的”完全不同意。我使用包内的私有过程来保存通用代码,这些代码由多个子例程调用。我使用一个过程来组织我的代码。理想的是拥有一个完整可见的可执行内核,但对于只能通过大量模块化才能实现的“主”程序单元,如果一个子程序只能由一个程序单元调用,在该单位的声明部分。 – APC