我在表中的日期和服务器中的sysdate之间的比较

时间:2013-07-17 13:22:33

标签: function plsql oracle10g

我正在尝试编写函数以在比较服务器上的当前日期名称和表格内容上的日期名称后返回day_id

**我的代码是

 create or replace 
 FUNCTION GETSYSDATE
 return char 
 is
 v_day char(20) ;
 v_day_id days.day_id%type ;
 v_day_name days.day_name%type ;
 begin
 select day_id, to_char(sysdate, 'day', 'nls_date_language=arabic'), day_name
 into v_day_id,v_day,v_day_name
 from days
 where v_day_name = v_day ;
 return v_day_id ;
 end;

但遗憾的是,它没有找到数据!

注意! :day_name的dataType为varchar (20 byte)

**the error
 Connecting to the database admin.
 ORA-01403: no data found
 ORA-06512: at "ADMIN.GETSYSDATE", line 9
 ORA-06512: at line 5
 Process exited.
 Disconnecting from the database admin.

** my table 
 DAY_ID NUMBER
 DAY_NAME   VARCHAR2(20 BYTE)

2 个答案:

答案 0 :(得分:1)

您的过滤器正在使用尚未初始化的局部变量;事实上,你正试图设置它们并使用它们同时进行过滤,这没有多大意义。

where v_day_name = v_day

...永远不会匹配你桌子上的任何记录。

我认为这可以满足您的需求:

create or replace function getsysdate return days.day_id%type is
  v_day_id days.day_id%type;
begin
  select day_id
  into v_day_id
  from days
  where day_name = to_char(sysdate, 'day', 'nls_date_language=arabic');
  return v_day_id;
end;
/

我不知道您的days表格是如何填充的,但我猜测day_id是1-7而day_name是相应的日期,而且使用简单的TO_CHAR,您无法轻松获得该区域。所以this SQL Fiddle显示了基于该假设的函数,但可能是ID错误的顺序。我已将它显示为匿名块中的赋值,并使用纯SQL。

答案 1 :(得分:1)

根据我对您的问题的理解,您有一个填充表格的日期名称,并且您想要查询服务器当前日期的等效day_id。
所以脚本中有多个错误,如:
如您所希望GETSYSDATE返回DAY_ID,您需要将return语句声明为Number或DAYS.DAY_ID%TYPE
您的selectwhere语法存在错误情况。 ... 愿这个功能帮助你

CREATE Function GETSYSDATE RETURN number
 is
 v_day_id days.DAY_ID%TYPE;
 begin
   select day_id
   into v_day_id
   from days
   where DAY_NAME = to_char(sysdate, 'day', 'nls_date_language=arabic') ;
   return v_day_id ;
   exception when no_data_found then
  return -1;
 end;

Sqlfiddle show