我正在尝试编写函数以在比较服务器上的当前日期名称和表格内容上的日期名称后返回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)
答案 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
您的select
和where
语法存在错误情况。
...
愿这个功能帮助你
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;