我的下面的语句为什么不能建立function?真的搞不懂,请教各位大虾/
CREATE OR REPLACE FUNCTION GETWEEK (sdivd integer,sdyear integer) return integer
is
--declare
--sdivd number;
--sdyear number;
v_week integer;
begin
--sdivd:=108069;
--sdyear:=107;
select (case when TO_NUMBER(SUBSTR(TO_CHAR(CDDFYJ),1,3))=sdyear and TO_NUMBER(SUBSTR(TO_CHAR(CDDFYJ),1,3))=TO_NUMBER(SUBSTR(TO_CHAR(sdivd),1,3))
and to_number(substr(to_char((TO_NUMBER(SUBSTR(TO_CHAR(sdivd),4,3))-TO_NUMBER(SUBSTR(TO_CHAR(CDDFYJ),4,3)))/7),instr(to_char((TO_NUMBER(SUBSTR(TO_CHAR(sdivd),4,3))-TO_NUMBER(SUBSTR(TO_CHAR(CDDFYJ),4,3)))/7),'.'),3))>0.849
then ceil((TO_NUMBER(SUBSTR(TO_CHAR(sdivd),4,3))-TO_NUMBER(SUBSTR(TO_CHAR(CDDFYJ),4,3)))/7)
when TO_NUMBER(SUBSTR(TO_CHAR(CDDFYJ),1,3))=sdyear and TO_NUMBER(SUBSTR(TO_CHAR(CDDFYJ),1,3))=TO_NUMBER(SUBSTR(TO_CHAR(sdivd),1,3))
and to_number(substr(to_char((TO_NUMBER(SUBSTR(TO_CHAR(sdivd),4,3))-TO_NUMBER(SUBSTR(TO_CHAR(CDDFYJ),4,3)))/7),instr(to_char((TO_NUMBER(SUBSTR(TO_CHAR(sdivd),4,3))-TO_NUMBER(SUBSTR(TO_CHAR(CDDFYJ),4,3)))/7),'.'),3))<0.849
then floor((TO_NUMBER(SUBSTR(TO_CHAR(sdivd),4,3))-TO_NUMBER(SUBSTR(TO_CHAR(CDDFYJ),4,3)))/7)
when TO_NUMBER(SUBSTR(TO_CHAR(CDDFYJ),1,3))=sdyear and TO_NUMBER(SUBSTR(TO_CHAR(CDDFYJ),1,3))<> TO_NUMBER(SUBSTR(TO_CHAR(sdivd),1,3))
and to_number(substr(to_char((TO_NUMBER(SUBSTR(TO_CHAR(sdivd),4,3))-TO_NUMBER(SUBSTR(TO_CHAR(CDDFYJ),4,3))+364)/7),instr(to_char((TO_NUMBER(SUBSTR(TO_CHAR(sdivd),4,3))-TO_NUMBER(SUBSTR(TO_CHAR(CDDFYJ),4,3))+364)/7),'.'),3))>0.701
then ceil((TO_NUMBER(SUBSTR(TO_CHAR(sdivd),4,3))-TO_NUMBER(SUBSTR(TO_CHAR(CDDFYJ),4,3))+364)/7)
when TO_NUMBER(SUBSTR(TO_CHAR(CDDFYJ),1,3))=sdyear and TO_NUMBER(SUBSTR(TO_CHAR(CDDFYJ),1,3))<> TO_NUMBER(SUBSTR(TO_CHAR(sdivd),1,3))
and to_number(substr(to_char((TO_NUMBER(SUBSTR(TO_CHAR(sdivd),4,3))-TO_NUMBER(SUBSTR(TO_CHAR(CDDFYJ),4,3))+364)/7),instr(to_char((TO_NUMBER(SUBSTR(TO_CHAR(sdivd),4,3))-TO_NUMBER(SUBSTR(TO_CHAR(CDDFYJ),4,3))+364)/7),'.'),3))<0.701
then floor((TO_NUMBER(SUBSTR(TO_CHAR(sdivd),4,3))-TO_NUMBER(SUBSTR(TO_CHAR(CDDFYJ),4,3))+364)/7)
else
0 end ) into v_week from testdta.f0008b where cddtpn='A' and TO_NUMBER(SUBSTR(TO_CHAR(CDDFYJ),1,3))=sdyear;
--dbms_output.put_line(v_week);
return v_week;
end GETWEEK;
但我这样执行又可以,真是搞不懂啊,declare
sdivd number;
sdyear number;
v_week integer;
begin
sdivd:=108069;
sdyear:=107;
select (case when TO_NUMBER(SUBSTR(TO_CHAR(CDDFYJ),1,3))=sdyear and TO_NUMBER(SUBSTR(TO_CHAR(CDDFYJ),1,3))=TO_NUMBER(SUBSTR(TO_CHAR(sdivd),1,3))
and to_number(substr(to_char((TO_NUMBER(SUBSTR(TO_CHAR(sdivd),4,3))-TO_NUMBER(SUBSTR(TO_CHAR(CDDFYJ),4,3)))/7),instr(to_char((TO_NUMBER(SUBSTR(TO_CHAR(sdivd),4,3))-TO_NUMBER(SUBSTR(TO_CHAR(CDDFYJ),4,3)))/7),'.'),3))>0.849
then ceil((TO_NUMBER(SUBSTR(TO_CHAR(sdivd),4,3))-TO_NUMBER(SUBSTR(TO_CHAR(CDDFYJ),4,3)))/7)
when TO_NUMBER(SUBSTR(TO_CHAR(CDDFYJ),1,3))=sdyear and TO_NUMBER(SUBSTR(TO_CHAR(CDDFYJ),1,3))=TO_NUMBER(SUBSTR(TO_CHAR(sdivd),1,3))
and to_number(substr(to_char((TO_NUMBER(SUBSTR(TO_CHAR(sdivd),4,3))-TO_NUMBER(SUBSTR(TO_CHAR(CDDFYJ),4,3)))/7),instr(to_char((TO_NUMBER(SUBSTR(TO_CHAR(sdivd),4,3))-TO_NUMBER(SUBSTR(TO_CHAR(CDDFYJ),4,3)))/7),'.'),3))<0.849
then floor((TO_NUMBER(SUBSTR(TO_CHAR(sdivd),4,3))-TO_NUMBER(SUBSTR(TO_CHAR(CDDFYJ),4,3)))/7)
when TO_NUMBER(SUBSTR(TO_CHAR(CDDFYJ),1,3))=sdyear and TO_NUMBER(SUBSTR(TO_CHAR(CDDFYJ),1,3))<> TO_NUMBER(SUBSTR(TO_CHAR(sdivd),1,3))
and to_number(substr(to_char((TO_NUMBER(SUBSTR(TO_CHAR(sdivd),4,3))-TO_NUMBER(SUBSTR(TO_CHAR(CDDFYJ),4,3))+364)/7),instr(to_char((TO_NUMBER(SUBSTR(TO_CHAR(sdivd),4,3))-TO_NUMBER(SUBSTR(TO_CHAR(CDDFYJ),4,3))+364)/7),'.'),3))>0.701
then ceil((TO_NUMBER(SUBSTR(TO_CHAR(sdivd),4,3))-TO_NUMBER(SUBSTR(TO_CHAR(CDDFYJ),4,3))+364)/7)
when TO_NUMBER(SUBSTR(TO_CHAR(CDDFYJ),1,3))=sdyear and TO_NUMBER(SUBSTR(TO_CHAR(CDDFYJ),1,3))<> TO_NUMBER(SUBSTR(TO_CHAR(sdivd),1,3))
and to_number(substr(to_char((TO_NUMBER(SUBSTR(TO_CHAR(sdivd),4,3))-TO_NUMBER(SUBSTR(TO_CHAR(CDDFYJ),4,3))+364)/7),instr(to_char((TO_NUMBER(SUBSTR(TO_CHAR(sdivd),4,3))-TO_NUMBER(SUBSTR(TO_CHAR(CDDFYJ),4,3))+364)/7),'.'),3))<0.701
then floor((TO_NUMBER(SUBSTR(TO_CHAR(sdivd),4,3))-TO_NUMBER(SUBSTR(TO_CHAR(CDDFYJ),4,3))+364)/7)
else
0 end ) into v_week from testdta.f0008b where cddtpn='A' and TO_NUMBER(SUBSTR(TO_CHAR(CDDFYJ),1,3))=sdyear;
dbms_output.put_line(v_week);
--return v_week;
end GETWEEK;
CREATE OR REPLACE FUNCTION GETWEEK (sdivd integer,sdyear integer) return integer
is
--declare
--sdivd number;
--sdyear number;
v_week integer;
begin
--sdivd:=108069;
--sdyear:=107;
select (case when TO_NUMBER(SUBSTR(TO_CHAR(CDDFYJ),1,3))=sdyear and TO_NUMBER(SUBSTR(TO_CHAR(CDDFYJ),1,3))=TO_NUMBER(SUBSTR(TO_CHAR(sdivd),1,3))
and to_number(substr(to_char((TO_NUMBER(SUBSTR(TO_CHAR(sdivd),4,3))-TO_NUMBER(SUBSTR(TO_CHAR(CDDFYJ),4,3)))/7),instr(to_char((TO_NUMBER(SUBSTR(TO_CHAR(sdivd),4,3))-TO_NUMBER(SUBSTR(TO_CHAR(CDDFYJ),4,3)))/7),'.'),3))>0.849
then ceil((TO_NUMBER(SUBSTR(TO_CHAR(sdivd),4,3))-TO_NUMBER(SUBSTR(TO_CHAR(CDDFYJ),4,3)))/7)
when TO_NUMBER(SUBSTR(TO_CHAR(CDDFYJ),1,3))=sdyear and TO_NUMBER(SUBSTR(TO_CHAR(CDDFYJ),1,3))=TO_NUMBER(SUBSTR(TO_CHAR(sdivd),1,3))
and to_number(substr(to_char((TO_NUMBER(SUBSTR(TO_CHAR(sdivd),4,3))-TO_NUMBER(SUBSTR(TO_CHAR(CDDFYJ),4,3)))/7),instr(to_char((TO_NUMBER(SUBSTR(TO_CHAR(sdivd),4,3))-TO_NUMBER(SUBSTR(TO_CHAR(CDDFYJ),4,3)))/7),'.'),3))<0.849
then floor((TO_NUMBER(SUBSTR(TO_CHAR(sdivd),4,3))-TO_NUMBER(SUBSTR(TO_CHAR(CDDFYJ),4,3)))/7)
when TO_NUMBER(SUBSTR(TO_CHAR(CDDFYJ),1,3))=sdyear and TO_NUMBER(SUBSTR(TO_CHAR(CDDFYJ),1,3))<> TO_NUMBER(SUBSTR(TO_CHAR(sdivd),1,3))
and to_number(substr(to_char((TO_NUMBER(SUBSTR(TO_CHAR(sdivd),4,3))-TO_NUMBER(SUBSTR(TO_CHAR(CDDFYJ),4,3))+364)/7),instr(to_char((TO_NUMBER(SUBSTR(TO_CHAR(sdivd),4,3))-TO_NUMBER(SUBSTR(TO_CHAR(CDDFYJ),4,3))+364)/7),'.'),3))>0.701
then ceil((TO_NUMBER(SUBSTR(TO_CHAR(sdivd),4,3))-TO_NUMBER(SUBSTR(TO_CHAR(CDDFYJ),4,3))+364)/7)
when TO_NUMBER(SUBSTR(TO_CHAR(CDDFYJ),1,3))=sdyear and TO_NUMBER(SUBSTR(TO_CHAR(CDDFYJ),1,3))<> TO_NUMBER(SUBSTR(TO_CHAR(sdivd),1,3))
and to_number(substr(to_char((TO_NUMBER(SUBSTR(TO_CHAR(sdivd),4,3))-TO_NUMBER(SUBSTR(TO_CHAR(CDDFYJ),4,3))+364)/7),instr(to_char((TO_NUMBER(SUBSTR(TO_CHAR(sdivd),4,3))-TO_NUMBER(SUBSTR(TO_CHAR(CDDFYJ),4,3))+364)/7),'.'),3))<0.701
then floor((TO_NUMBER(SUBSTR(TO_CHAR(sdivd),4,3))-TO_NUMBER(SUBSTR(TO_CHAR(CDDFYJ),4,3))+364)/7)
else
0 end ) into v_week from testdta.f0008b where cddtpn='A' and TO_NUMBER(SUBSTR(TO_CHAR(CDDFYJ),1,3))=sdyear;
--dbms_output.put_line(v_week);
return v_week;
end GETWEEK;
但我这样执行又可以,真是搞不懂啊,declare
sdivd number;
sdyear number;
v_week integer;
begin
sdivd:=108069;
sdyear:=107;
select (case when TO_NUMBER(SUBSTR(TO_CHAR(CDDFYJ),1,3))=sdyear and TO_NUMBER(SUBSTR(TO_CHAR(CDDFYJ),1,3))=TO_NUMBER(SUBSTR(TO_CHAR(sdivd),1,3))
and to_number(substr(to_char((TO_NUMBER(SUBSTR(TO_CHAR(sdivd),4,3))-TO_NUMBER(SUBSTR(TO_CHAR(CDDFYJ),4,3)))/7),instr(to_char((TO_NUMBER(SUBSTR(TO_CHAR(sdivd),4,3))-TO_NUMBER(SUBSTR(TO_CHAR(CDDFYJ),4,3)))/7),'.'),3))>0.849
then ceil((TO_NUMBER(SUBSTR(TO_CHAR(sdivd),4,3))-TO_NUMBER(SUBSTR(TO_CHAR(CDDFYJ),4,3)))/7)
when TO_NUMBER(SUBSTR(TO_CHAR(CDDFYJ),1,3))=sdyear and TO_NUMBER(SUBSTR(TO_CHAR(CDDFYJ),1,3))=TO_NUMBER(SUBSTR(TO_CHAR(sdivd),1,3))
and to_number(substr(to_char((TO_NUMBER(SUBSTR(TO_CHAR(sdivd),4,3))-TO_NUMBER(SUBSTR(TO_CHAR(CDDFYJ),4,3)))/7),instr(to_char((TO_NUMBER(SUBSTR(TO_CHAR(sdivd),4,3))-TO_NUMBER(SUBSTR(TO_CHAR(CDDFYJ),4,3)))/7),'.'),3))<0.849
then floor((TO_NUMBER(SUBSTR(TO_CHAR(sdivd),4,3))-TO_NUMBER(SUBSTR(TO_CHAR(CDDFYJ),4,3)))/7)
when TO_NUMBER(SUBSTR(TO_CHAR(CDDFYJ),1,3))=sdyear and TO_NUMBER(SUBSTR(TO_CHAR(CDDFYJ),1,3))<> TO_NUMBER(SUBSTR(TO_CHAR(sdivd),1,3))
and to_number(substr(to_char((TO_NUMBER(SUBSTR(TO_CHAR(sdivd),4,3))-TO_NUMBER(SUBSTR(TO_CHAR(CDDFYJ),4,3))+364)/7),instr(to_char((TO_NUMBER(SUBSTR(TO_CHAR(sdivd),4,3))-TO_NUMBER(SUBSTR(TO_CHAR(CDDFYJ),4,3))+364)/7),'.'),3))>0.701
then ceil((TO_NUMBER(SUBSTR(TO_CHAR(sdivd),4,3))-TO_NUMBER(SUBSTR(TO_CHAR(CDDFYJ),4,3))+364)/7)
when TO_NUMBER(SUBSTR(TO_CHAR(CDDFYJ),1,3))=sdyear and TO_NUMBER(SUBSTR(TO_CHAR(CDDFYJ),1,3))<> TO_NUMBER(SUBSTR(TO_CHAR(sdivd),1,3))
and to_number(substr(to_char((TO_NUMBER(SUBSTR(TO_CHAR(sdivd),4,3))-TO_NUMBER(SUBSTR(TO_CHAR(CDDFYJ),4,3))+364)/7),instr(to_char((TO_NUMBER(SUBSTR(TO_CHAR(sdivd),4,3))-TO_NUMBER(SUBSTR(TO_CHAR(CDDFYJ),4,3))+364)/7),'.'),3))<0.701
then floor((TO_NUMBER(SUBSTR(TO_CHAR(sdivd),4,3))-TO_NUMBER(SUBSTR(TO_CHAR(CDDFYJ),4,3))+364)/7)
else
0 end ) into v_week from testdta.f0008b where cddtpn='A' and TO_NUMBER(SUBSTR(TO_CHAR(CDDFYJ),1,3))=sdyear;
dbms_output.put_line(v_week);
--return v_week;
end GETWEEK;
我的下面的语句为什么不能建立function?真的搞不懂,请教各位大虾/
CREATE OR REPLACE FUNCTION GETWEEK (sdivd integer,sdyear integer) return integer
is
--declare
--sdivd number;
--sdyear number;
v_week integer;
begin
--sdivd:=108069;
--sdyear:=107;
select (case when TO_NUMBER(SUBSTR(TO_CHAR(CDDFYJ),1,3))=sdyear and TO_NUMBER(SUBSTR(TO_CHAR(CDDFYJ),1,3))=TO_NUMBER(SUBSTR(TO_CHAR(sdivd),1,3))
and to_number(substr(to_char((TO_NUMBER(SUBSTR(TO_CHAR(sdivd),4,3))-TO_NUMBER(SUBSTR(TO_CHAR(CDDFYJ),4,3)))/7),instr(to_char((TO_NUMBER(SUBSTR(TO_CHAR(sdivd),4,3))-TO_NUMBER(SUBSTR(TO_CHAR(CDDFYJ),4,3)))/7),'.'),3))>0.849
then ceil((TO_NUMBER(SUBSTR(TO_CHAR(sdivd),4,3))-TO_NUMBER(SUBSTR(TO_CHAR(CDDFYJ),4,3)))/7)
when TO_NUMBER(SUBSTR(TO_CHAR(CDDFYJ),1,3))=sdyear and TO_NUMBER(SUBSTR(TO_CHAR(CDDFYJ),1,3))=TO_NUMBER(SUBSTR(TO_CHAR(sdivd),1,3))
and to_number(substr(to_char((TO_NUMBER(SUBSTR(TO_CHAR(sdivd),4,3))-TO_NUMBER(SUBSTR(TO_CHAR(CDDFYJ),4,3)))/7),instr(to_char((TO_NUMBER(SUBSTR(TO_CHAR(sdivd),4,3))-TO_NUMBER(SUBSTR(TO_CHAR(CDDFYJ),4,3)))/7),'.'),3))<0.849
then floor((TO_NUMBER(SUBSTR(TO_CHAR(sdivd),4,3))-TO_NUMBER(SUBSTR(TO_CHAR(CDDFYJ),4,3)))/7)
when TO_NUMBER(SUBSTR(TO_CHAR(CDDFYJ),1,3))=sdyear and TO_NUMBER(SUBSTR(TO_CHAR(CDDFYJ),1,3))<> TO_NUMBER(SUBSTR(TO_CHAR(sdivd),1,3))
and to_number(substr(to_char((TO_NUMBER(SUBSTR(TO_CHAR(sdivd),4,3))-TO_NUMBER(SUBSTR(TO_CHAR(CDDFYJ),4,3))+364)/7),instr(to_char((TO_NUMBER(SUBSTR(TO_CHAR(sdivd),4,3))-TO_NUMBER(SUBSTR(TO_CHAR(CDDFYJ),4,3))+364)/7),'.'),3))>0.701
then ceil((TO_NUMBER(SUBSTR(TO_CHAR(sdivd),4,3))-TO_NUMBER(SUBSTR(TO_CHAR(CDDFYJ),4,3))+364)/7)
when TO_NUMBER(SUBSTR(TO_CHAR(CDDFYJ),1,3))=sdyear and TO_NUMBER(SUBSTR(TO_CHAR(CDDFYJ),1,3))<> TO_NUMBER(SUBSTR(TO_CHAR(sdivd),1,3))
and to_number(substr(to_char((TO_NUMBER(SUBSTR(TO_CHAR(sdivd),4,3))-TO_NUMBER(SUBSTR(TO_CHAR(CDDFYJ),4,3))+364)/7),instr(to_char((TO_NUMBER(SUBSTR(TO_CHAR(sdivd),4,3))-TO_NUMBER(SUBSTR(TO_CHAR(CDDFYJ),4,3))+364)/7),'.'),3))<0.701
then floor((TO_NUMBER(SUBSTR(TO_CHAR(sdivd),4,3))-TO_NUMBER(SUBSTR(TO_CHAR(CDDFYJ),4,3))+364)/7)
else
0 end ) into v_week from testdta.f0008b where cddtpn='A' and TO_NUMBER(SUBSTR(TO_CHAR(CDDFYJ),1,3))=sdyear;
--dbms_output.put_line(v_week);
return v_week;
end GETWEEK;
但我这样执行又可以,真是搞不懂啊,declare
sdivd number;
sdyear number;
v_week integer;
begin
sdivd:=108069;
sdyear:=107;
select (case when TO_NUMBER(SUBSTR(TO_CHAR(CDDFYJ),1,3))=sdyear and TO_NUMBER(SUBSTR(TO_CHAR(CDDFYJ),1,3))=TO_NUMBER(SUBSTR(TO_CHAR(sdivd),1,3))
and to_number(substr(to_char((TO_NUMBER(SUBSTR(TO_CHAR(sdivd),4,3))-TO_NUMBER(SUBSTR(TO_CHAR(CDDFYJ),4,3)))/7),instr(to_char((TO_NUMBER(SUBSTR(TO_CHAR(sdivd),4,3))-TO_NUMBER(SUBSTR(TO_CHAR(CDDFYJ),4,3)))/7),'.'),3))>0.849
then ceil((TO_NUMBER(SUBSTR(TO_CHAR(sdivd),4,3))-TO_NUMBER(SUBSTR(TO_CHAR(CDDFYJ),4,3)))/7)
when TO_NUMBER(SUBSTR(TO_CHAR(CDDFYJ),1,3))=sdyear and TO_NUMBER(SUBSTR(TO_CHAR(CDDFYJ),1,3))=TO_NUMBER(SUBSTR(TO_CHAR(sdivd),1,3))
and to_number(substr(to_char((TO_NUMBER(SUBSTR(TO_CHAR(sdivd),4,3))-TO_NUMBER(SUBSTR(TO_CHAR(CDDFYJ),4,3)))/7),instr(to_char((TO_NUMBER(SUBSTR(TO_CHAR(sdivd),4,3))-TO_NUMBER(SUBSTR(TO_CHAR(CDDFYJ),4,3)))/7),'.'),3))<0.849
then floor((TO_NUMBER(SUBSTR(TO_CHAR(sdivd),4,3))-TO_NUMBER(SUBSTR(TO_CHAR(CDDFYJ),4,3)))/7)
when TO_NUMBER(SUBSTR(TO_CHAR(CDDFYJ),1,3))=sdyear and TO_NUMBER(SUBSTR(TO_CHAR(CDDFYJ),1,3))<> TO_NUMBER(SUBSTR(TO_CHAR(sdivd),1,3))
and to_number(substr(to_char((TO_NUMBER(SUBSTR(TO_CHAR(sdivd),4,3))-TO_NUMBER(SUBSTR(TO_CHAR(CDDFYJ),4,3))+364)/7),instr(to_char((TO_NUMBER(SUBSTR(TO_CHAR(sdivd),4,3))-TO_NUMBER(SUBSTR(TO_CHAR(CDDFYJ),4,3))+364)/7),'.'),3))>0.701
then ceil((TO_NUMBER(SUBSTR(TO_CHAR(sdivd),4,3))-TO_NUMBER(SUBSTR(TO_CHAR(CDDFYJ),4,3))+364)/7)
when TO_NUMBER(SUBSTR(TO_CHAR(CDDFYJ),1,3))=sdyear and TO_NUMBER(SUBSTR(TO_CHAR(CDDFYJ),1,3))<> TO_NUMBER(SUBSTR(TO_CHAR(sdivd),1,3))
and to_number(substr(to_char((TO_NUMBER(SUBSTR(TO_CHAR(sdivd),4,3))-TO_NUMBER(SUBSTR(TO_CHAR(CDDFYJ),4,3))+364)/7),instr(to_char((TO_NUMBER(SUBSTR(TO_CHAR(sdivd),4,3))-TO_NUMBER(SUBSTR(TO_CHAR(CDDFYJ),4,3))+364)/7),'.'),3))<0.701
then floor((TO_NUMBER(SUBSTR(TO_CHAR(sdivd),4,3))-TO_NUMBER(SUBSTR(TO_CHAR(CDDFYJ),4,3))+364)/7)
else
0 end ) into v_week from testdta.f0008b where cddtpn='A' and TO_NUMBER(SUBSTR(TO_CHAR(CDDFYJ),1,3))=sdyear;
dbms_output.put_line(v_week);
end ;
2: 这个sql会不会返回多个值?
3: 可能是数据精度的问题?能否把sql运行的结果贴上来?
但我再编辑的时候好象提示是没有testdta.f0008b这个表,我这个表确实是有的
并且这样可以执行的.
declare
sdivd number;
sdyear number;
v_week integer;
begin
sdivd:=108069;
sdyear:=107;
select (case when TO_NUMBER(SUBSTR(TO_CHAR(CDDFYJ),1,3))=sdyear and TO_NUMBER(SUBSTR(TO_CHAR(CDDFYJ),1,3))=TO_NUMBER(SUBSTR(TO_CHAR(sdivd),1,3))
and to_number(substr(to_char((TO_NUMBER(SUBSTR(TO_CHAR(sdivd),4,3))-TO_NUMBER(SUBSTR(TO_CHAR(CDDFYJ),4,3)))/7),instr(to_char((TO_NUMBER(SUBSTR(TO_CHAR(sdivd),4,3))-TO_NUMBER(SUBSTR(TO_CHAR(CDDFYJ),4,3)))/7),'.'),3))>0.849
then ceil((TO_NUMBER(SUBSTR(TO_CHAR(sdivd),4,3))-TO_NUMBER(SUBSTR(TO_CHAR(CDDFYJ),4,3)))/7)
when TO_NUMBER(SUBSTR(TO_CHAR(CDDFYJ),1,3))=sdyear and TO_NUMBER(SUBSTR(TO_CHAR(CDDFYJ),1,3))=TO_NUMBER(SUBSTR(TO_CHAR(sdivd),1,3))
and to_number(substr(to_char((TO_NUMBER(SUBSTR(TO_CHAR(sdivd),4,3))-TO_NUMBER(SUBSTR(TO_CHAR(CDDFYJ),4,3)))/7),instr(to_char((TO_NUMBER(SUBSTR(TO_CHAR(sdivd),4,3))-TO_NUMBER(SUBSTR(TO_CHAR(CDDFYJ),4,3)))/7),'.'),3))<0.849
then floor((TO_NUMBER(SUBSTR(TO_CHAR(sdivd),4,3))-TO_NUMBER(SUBSTR(TO_CHAR(CDDFYJ),4,3)))/7)
when TO_NUMBER(SUBSTR(TO_CHAR(CDDFYJ),1,3))=sdyear and TO_NUMBER(SUBSTR(TO_CHAR(CDDFYJ),1,3))<> TO_NUMBER(SUBSTR(TO_CHAR(sdivd),1,3))
and to_number(substr(to_char((TO_NUMBER(SUBSTR(TO_CHAR(sdivd),4,3))-TO_NUMBER(SUBSTR(TO_CHAR(CDDFYJ),4,3))+364)/7),instr(to_char((TO_NUMBER(SUBSTR(TO_CHAR(sdivd),4,3))-TO_NUMBER(SUBSTR(TO_CHAR(CDDFYJ),4,3))+364)/7),'.'),3))>0.701
then ceil((TO_NUMBER(SUBSTR(TO_CHAR(sdivd),4,3))-TO_NUMBER(SUBSTR(TO_CHAR(CDDFYJ),4,3))+364)/7)
when TO_NUMBER(SUBSTR(TO_CHAR(CDDFYJ),1,3))=sdyear and TO_NUMBER(SUBSTR(TO_CHAR(CDDFYJ),1,3))<> TO_NUMBER(SUBSTR(TO_CHAR(sdivd),1,3))
and to_number(substr(to_char((TO_NUMBER(SUBSTR(TO_CHAR(sdivd),4,3))-TO_NUMBER(SUBSTR(TO_CHAR(CDDFYJ),4,3))+364)/7),instr(to_char((TO_NUMBER(SUBSTR(TO_CHAR(sdivd),4,3))-TO_NUMBER(SUBSTR(TO_CHAR(CDDFYJ),4,3))+364)/7),'.'),3))<0.701
then floor((TO_NUMBER(SUBSTR(TO_CHAR(sdivd),4,3))-TO_NUMBER(SUBSTR(TO_CHAR(CDDFYJ),4,3))+364)/7)
else
0 end ) into v_week from testdta.f0008b where cddtpn='A' and TO_NUMBER(SUBSTR(TO_CHAR(CDDFYJ),1,3))=sdyear;
dbms_output.put_line(v_week);
end ;
如果是没有这个表,上面的语句就没法运行的.
use sys to do:SQL> grant select on testdta.f0008b to yourUser;
要显式地授权,亦即是执行grant ....语句,因为过程function里不会继承角色中的权限的.
把6楼的yourUser改为你的用户名,执行后再试试FUNCTION.
按道理是的.
确定当前用户是否有访问testdta这个用户的表f0008b 权限