Oracle Can';我不明白为什么这个包代码会抛出pls-00201标识符';数据类型';必须声明为错误。请张贴,如果你能找到这个问题
您已经将包体从代码模板更改为使用实际有效的数据类型替换占位符,如Oracle Can';我不明白为什么这个包代码会抛出pls-00201标识符';数据类型';必须声明为错误。请张贴,如果你能找到这个问题,oracle,package,Oracle,Package,您已经将包体从代码模板更改为使用实际有效的数据类型替换占位符,如datatype,并且您已经替换了函数名。包名本身没有什么帮助,但是如果其他人已经从模板创建了一个包名,并且保留了原来的名称,那么这才是真正的问题 您没有做的是更改软件包规格以匹配对主体的更改: CREATE OR REPLACE PACKAGE useful_pk IS -- -- To modify this template, edit file PKGSPEC.TXT in TEMPLATE -- directory o
datatype
,并且您已经替换了函数名。包名本身没有什么帮助,但是如果其他人已经从模板创建了一个包名,并且保留了原来的名称,那么这才是真正的问题
您没有做的是更改软件包规格以匹配对主体的更改:
CREATE OR REPLACE PACKAGE useful_pk
IS
--
-- To modify this template, edit file PKGSPEC.TXT in TEMPLATE
-- directory of SQL Navigator
--
-- Purpose: Briefly explain the functionality of the package
--
-- MODIFICATION HISTORY
-- Person Date Comments
-- --------- ------ ------------------------------------------
-- Enter package declarations as shown below
variable_name datatype;
PROCEDURE procedure_name
( param1 IN datatype DEFAULT default_value,
param2 IN OUT datatype);
FUNCTION function_name
( param1 IN datatype DEFAULT default_value,
param2 IN OUT datatype)
RETURN datatype;
END; -- Package spec
/
CREATE OR REPLACE PACKAGE BODY "USEFUL_PK" AS
/******************************************************************************
NAME: WW_JMESA.useful_pk
PURPOSE:
REVISIONS:
Ver Date Author Description
--------- ---------- --------------- ------------------------------------
1.0 2/10/2009 1. Created this package body.
******************************************************************************/
/*****************************************************************************/
function fn_end_month(in_month in varchar2,in_year varchar2 ) return date
is
tmp_date date;
wrong_date EXCEPTION;
PRAGMA EXCEPTION_INIT(wrong_date,-01847);
PRAGMA EXCEPTION_INIT(wrong_date,-01839);
begin
if nvl(substr(in_month,1,2),'00') ='00' or nvl(substr(in_year,1,4),'0000')='0000' then
return null;
else
tmp_date:= to_date(substr(in_month,1,2)||'/'||substr(in_month,3,2) ||'/'||substr(in_year,1,4) ,'mm/dd/yyyy');
return tmp_date;
end if;
EXCEPTION
WHEN wrong_date THEN
tmp_date:= last_day(to_date(substr(in_month,1,2)||'/01/'||substr(in_year,1,4),'mm/dd/yyyy')) ;
return tmp_date;
WHEN OTHERS
THEN
RETURN tmp_date;
end fn_end_month;
function fn_end_month(in_month in varchar2 ) return date
is
tmp_date date;
wrong_date EXCEPTION;
PRAGMA EXCEPTION_INIT(wrong_date,-01847);
PRAGMA EXCEPTION_INIT(wrong_date,-01839);
begin
if nvl(substr(in_month,1,4),'0000') ='0000' or nvl(substr(in_month,5,2),'00')='00' then
return null;
else
tmp_date:= to_date(substr(in_month,5,2)||'/'||substr(in_month,7,2) ||'/'||substr(in_month,1,4) ,'mm/dd/yyyy');
return tmp_date;
end if;
EXCEPTION
WHEN wrong_date THEN
tmp_date:= last_day(to_date(substr(in_month,5,2)||'/01/'||substr(in_month,1,4),'mm/dd/yyyy')) ;
return tmp_date;
WHEN OTHERS
THEN
RETURN tmp_date;
end fn_end_month;
END useful_pk;
/
必须在规范中声明重载的fn_end_month
函数的两个版本,才能从包外调用它们。您不希望将过程和函数保留在模板中,部分原因是它们没有有效的数据类型,但主要原因是如果它们在规范中,那么它们也必须在主体中
您的pragmas不会完全达到您可能期望的效果;: 如果两个EXCEPTION_INIT pragma将不同的错误代码分配给同一个用户定义的异常,则后面的pragma将覆盖前面的pragma 因此第二个pragma优先,并且ORA-01847不会被
错误的\u日期
异常处理程序捕获。要捕获这两个异常,您需要定义两个异常并为每个异常添加pragma,这样每个异常都会得到不同的错误代码
用
捕获所有其他异常,然后捕获其他异常,这也是一个非常糟糕的主意。您只会看到返回的空值(因为引发异常的语句不会设置tmp\u date
),没有说明提供的值无效的原因。什么是“数据类型”?它不是Oracle类型,因此编译器给出了错误。如果您缺少定义“datatype”的另一个包的执行权限,请在中搜索datatypecode@kevinsky,答案是正确的,但我很确定OP只是试图编译一个模板文件,而没有更改函数/过程名称。@ruudvan完全正确,我觉得奥卡姆的剃须刀在这里起了作用
CREATE OR REPLACE PACKAGE useful_pk
IS
--
-- To modify this template, edit file PKGSPEC.TXT in TEMPLATE
-- directory of SQL Navigator
--
-- Purpose: Briefly explain the functionality of the package
--
-- MODIFICATION HISTORY
-- Person Date Comments
-- --------- ------ ------------------------------------------
function fn_end_month(in_month in varchar2,in_year varchar2 ) return date;
function fn_end_month(in_month in varchar2 ) return date;
END; -- Package spec
/