Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Oracle Can';我不明白为什么这个包代码会抛出pls-00201标识符';数据类型';必须声明为错误。请张贴,如果你能找到这个问题_Oracle_Package - Fatal编程技术网

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
/