表中我的一天与服务器中的 sysdate 之间的比较
Posted
技术标签:
【中文标题】表中我的一天与服务器中的 sysdate 之间的比较【英文标题】:Comparison between my day in table and the sysdate in server 【发布时间】:2013-07-17 13:22:32 【问题描述】:我正在尝试编写函数以在比较服务器上的当前日期名称和我的表格内容上的日期名称后返回 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)
【问题讨论】:
【参考方案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 中使用。
【讨论】:
【参考方案2】:根据我对您的问题的了解,您有一个填满日期名称的表格,并且您想查询服务器当前日期的等效 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;
Sqlfiddle show.
【讨论】:
以上是关于表中我的一天与服务器中的 sysdate 之间的比较的主要内容,如果未能解决你的问题,请参考以下文章