0

我正在尝试编写函数以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类型是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)
4

2 回答 2

1

根据我对您的问题的了解,您有一个表格填写了日期名称,并且您想查询服务器当前日期的等效 day_id。
因此脚本中有多个错误,例如:
由于您想要GETSYSDATE返回DAY_ID,您需要将 return 语句声明为 Number 或 您的and语法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 显示

于 2013-07-17T15:46:11.793 回答
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. 所以这个 SQL Fiddle显示了基于该假设的函数,但可能 ID 的顺序错误。我已经将它显示为匿名块中的赋值,并从普通 SQL 中使用。

于 2013-07-17T14:46:21.340 回答