0

请考虑以下代码(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 程序中执行以下操作

1) SQL> set role none;

2) SELECT ON DBA_TAB_COLUMNS;

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

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

谢谢

4

1 回答 1

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;

也就是说,如果您只想要完整的年数。

于 2013-05-05T20:42:39.760 回答