下面列出的代码会创建一个只包含规范的包。我一直收到错误。
错误:
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;
答案 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
中的Java
或Header
中的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
并将该变量分配给某个内容。
希望它能帮助你理解。