PL / SQL过程未正常运行

时间:2013-05-05 20:39:50

标签: oracle plsql oracle11g

请考虑以下代码(query.sql):

create or replace function age (dateOfBirth date)
return number
is

mAge number(5,2);

begin
   mAge:=(sysdate-dateOfBirth)/365.25;
   return mAge;
end;



SQL> @query.sql
13
14
15  /

Warning: Function created with compilation errors.

当我点击显示错误时,我得到以下内容:

代码:

SQL> show error
Errors for FUNCTION AGE:

LINE/COL ERROR
-------- -----------------------------------------------------------------
5/8      PL/SQL: Item ignored
5/15     PLS-00325: non-integral numeric literal 5.2 is inappropriate in
     this context

8/8      PL/SQL: Statement ignored
8/8      PLS-00320: the declaration of the type of this expression is
     incomplete or malformed

9/5      PL/SQL: Statement ignored
9/12     PLS-00320: the declaration of the type of this expression is
     incomplete or malformed

LINE/COL ERROR
-------- -----------------------------------------------------------------

我尝试从Oracle Procedure

执行以下操作
1) SQL> set role none;

2) SELECT ON DBA_TAB_COLUMNS;

但上面的第二个查询是抛出错误:缺少表达式。

请让我知道上述所有内容有什么问题。

由于

1 个答案:

答案 0 :(得分:2)

你错过了一个BEGIN,你的NUMBER变量应该用逗号而不是句号声明。

create or replace function age (
  pDateOfBirth date ) return number is

   l_age number(5,2);

begin    
   l_age := ( sysdate - pDateOfBirth ) / 365.25;
   return l_age;
end;
/

您现在已编辑问题以包含BEGIN,但您尚未修复变量声明。正如您的错误消息所示:

  

PLS-00325:非整数数字文字5.2在此上下文中不合适

就个人而言,我认为你的计算年龄不正确。一年有365或366天。我会这样做,它使用内部Oracle日期函数:

function get_age (pDOB date) return number is
   /* Return the the number of full years between 
      the date given and sysdate.
      */    
begin    
   return floor(months_between(sysdate, pDOB)/12);    
end;

即如果你只需要整年的数量。