创建一个只有规格的包?

时间:2015-10-29 21:32:45

标签: sql oracle plsql compiler-errors package

下面列出的代码会创建一个只包含规范的包。我一直收到错误。

错误:

Error: PL/SQL: Compilation unit analysis terminated
Error(1,14): PLS-00201: identifier 'TAXRATE_PKG' must be declared                        
Error(1,14): PLS-00304: cannot compile body of 'TAXRATE_PKG' without its specification

代码:

CREATE OR REPLACE PACKAGE BODY TAXRATE_PKG IS 

    PROCEDURE state_tax_pf(
                    p_state IN VARCHAR2,
                    pv_tax_nc OUT NUMBER, 
                    pv_tax_tx OUT NUMBER, 
                    pv_tax_tn OUT NUMBER) 
    IS 
        lv_state NUMBER; 
    BEGIN 
       IF p_state = 'NC' THEN 
           pv_tax_nc := 0.35; 
       ELSIF p_state = 'TX' THEN 
           Pv_tax_tx := 0.05; 
       ELSIF p_state = 'TN' THEN 
           pv_tax_tn := 0.02; 
       END IF; 

       RETURN lv_state; 

    END; 
END;

2 个答案:

答案 0 :(得分:2)

  

下面列出的代码创建了一个只包含规范的包

但您的代码显示您正在创建包BODY

CREATE OR REPLACE PACKAGE 
    BODY TAXRATE_PKG IS  -- your code doesnt follow what you are trying to do

    PROCEDURE state_tax_pf(
                    p_state IN VARCHAR2,
                    pv_tax_nc OUT NUMBER, 
                    pv_tax_tx OUT NUMBER, 
                    pv_tax_tn OUT NUMBER) 
    IS 
        lv_state NUMBER; 
    BEGIN 
       IF p_state = 'NC' THEN 
           pv_tax_nc := 0.35; 
       ELSIF p_state = 'TX' THEN 
           Pv_tax_tx := 0.05; 
       ELSIF p_state = 'TN' THEN 
           pv_tax_tn := 0.02; 
       END IF; 

       RETURN lv_state; 

    END; 
END;

包装规格

  •   

    仅包含您的PROCEDURES / FUNCTIONS的第一行

  •   

    它以CREATE OR REPLACE PACKAGE开头并且不包含单词" BODY"因为它的规格而不是包装的BODY。

PACKAGE BODY

  •   

    包含从单词" PROCEDURE"开始的过程/函数的 BODY 。直至程序的END声明。

如果要创建仅包含规格的包。你应该这样写:

CREATE OR REPLACE PACKAGE 
     TAXRATE_PKG IS

PROCEDURE state_tax_pf(
                    p_state IN VARCHAR2,
                    pv_tax_nc OUT NUMBER, 
                    pv_tax_tx OUT NUMBER, 
                    pv_tax_tn OUT NUMBER) ;

END TAXRATE_PKG;

只是为了警告你,你有一个程序,但你正在返回一个值。这将返回一个错误。您应该确保要在包中插入的代码能够避免出现太多错误。

答案 1 :(得分:1)

您的代码存在一些问题。首先,您的错误是因为您正在创建PACKAGE,而在Oracle中,您必须首先创建规范。它就像Interface中的JavaHeader中的C文件。因此,为了您的代码摆脱了您必须做的错误:

-- This is the specification
CREATE OR REPLACE PACKAGE TAXRATE_PKG IS
    PROCEDURE state_tax_pf( p_state IN VARCHAR2,
                            pv_tax_nc OUT NUMBER, 
                            pv_tax_tx OUT NUMBER, 
                            pv_tax_tn OUT NUMBER);
END TAXRATE_PKG;

--This is the definition
CREATE OR REPLACE PACKAGE BODY TAXRATE_PKG IS 
    PROCEDURE state_tax_pf(
                    p_state IN VARCHAR2,
                    pv_tax_nc OUT NUMBER, 
                    pv_tax_tx OUT NUMBER, 
                    pv_tax_tn OUT NUMBER) 
    IS 
        lv_state NUMBER; 
    BEGIN 
       IF p_state = 'NC' THEN 
           pv_tax_nc := 0.35; 
       ELSIF p_state = 'TX' THEN 
           Pv_tax_tx := 0.05; 
       ELSIF p_state = 'TN' THEN 
           pv_tax_tn := 0.02; 
       END IF; 

       RETURN lv_state; 

    END; 
END TAXRATE_PKG;

您的代码中存在的其他问题更像是逻辑问题

您定义了一个procedure但是您返回了一个值RETURN lv_state;,并且您甚至没有为它分配任何没有意义的值。不需要返回语句或该变量,因为您根本不使用它。

另一个问题是您创建了三个OUT参数(除非使用此参数的代码测试任何其他值为null)未分配(因为您的if)你只需要一个,然后让我们说pv_tax OUT NUMBER

我看到的另一个问题是,如果您需要RETURN lv_state;某些内容,则必须将procedure更改为function并将该变量分配给某个内容。

希望它能帮助你理解。