【问题标题】:Create a package with only specification?创建一个只有规范的包?
【发布时间】:2016-01-30 05:31:58
【问题描述】:

下面列出的代码创建了一个只有一个规范的包。我不断收到错误消息。

错误:

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;

【问题讨论】:

  • 你需要先创建包。 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;CREATE OR REPLACE PACKAGE TAXRATE_PKG IS FUNCTION get_state_tax(p_state IN VARCHAR2) RETURN NUMBER); END TAXRATE_PKG; 视情况而定。 (未经测试,手边没有 Oracle DB,可能还有其他语法错误。
  • @ShannonSeverance 我要创建一个仅包含规范的包。
  • 从您的 create 语句中删除单词 bodycreate package BODY 创建正文,而不是规范。
  • 请不要以使现有答案无效的方式编辑问题。你完全改变了你问的问题,并且无论如何又问了新的问题,所以我已经回滚到以前的版本。

标签: sql oracle plsql compiler-errors package


【解决方案1】:

您的代码存在一些问题。首先,您的错误是因为您正在创建 PACKAGE,而在 Oracle 中,您必须先创建规范。它就像Java 中的InterfaceC 中的Header 文件。因此,对于您的代码,您必须摆脱该错误:

-- 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;,您甚至没有为它分配任何没有意义的值。不需要那个 return 语句或那个变量,因为你根本没有使用它。

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

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

希望能帮助你理解。

【讨论】:

    【解决方案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”一词,因为它是规范而不是包的主体。

    当一个包体

    • 包含从单词“PROCEDURE”到过程的END语句的过程/函数的BODY

    如果你想创建一个只有规范的包。你应该这样写:

    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;
    

    警告你,你有一个过程,但你正在返回一个值。这将返回一个错误。您应该确保您在包中插入的代码有效,以避免出现太多错误。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-09-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-09
      • 2015-04-08
      • 2022-06-11
      • 1970-01-01
      相关资源
      最近更新 更多