兔子大神,进来看看!!!!

[复制链接]
查看11 | 回复9 | 2014-2-18 16:48:49 | 显示全部楼层 |阅读模式
我有张表...
然后里面有个字段是monthyear。。
现在就是说。。。我想做一个判断。。
比如说字段上已经有了123这数据。。就提示数据已经存在。。。
我写的函数如下。。但是失败了(编译没错,但调用的时候错了):
create or replace function data_check(p_monthyear in varchar2)
return boolean is

v_alread_in char(1);
begin
select monthyear
into v_alread_in
from actual_lease_charges
where monthyear=p_monthyear;
if v_alread_in ='01-2012' then

return true;

else

apex_util.set_session_state('LOGIN_MESSAGE','数据已经存在!');

return false;

end if;
end;

declare
data_ck varchar(1);
begin
data_ck := data_check('01-2012');
end;

这是SQL:
created table actual_lease_charges(
monthyear varchar2(10))
insert into actual_lease_charges values('01-2012');
insert into actual_lease_charges values('01-2012');
insert into actual_lease_charges values('02-2012');
insert into actual_lease_charges values('02-2012');
麻烦兔子指点。。。谢谢啊!!


回复

使用道具 举报

千问 | 2014-2-18 16:48:49 | 显示全部楼层
本帖最后由 阿吉2009 于 2012-11-14 13:34 编辑
我先试试,将v_alread_in char(1) 改为v_alread_in varchar2(10).
回复

使用道具 举报

千问 | 2014-2-18 16:48:49 | 显示全部楼层
更好的办法:将v_alread_in char(1) 改为v_alread_in actual_lease_charges.monthyear%type.
回复

使用道具 举报

千问 | 2014-2-18 16:48:49 | 显示全部楼层
阿吉2009 发表于 2012-11-14 13:33
我先试试,将v_alread_in char(1) 改为v_alread_in varchar2(10).

ORA-06550: 第 4 行, 第 12 列:
PLS-00382: 表达式类型错误
ORA-06550: 第 4 行, 第 1 列:
PL/SQL: Statement ignored
按你说的改了之后还是显示这样的错误。。。。。
回复

使用道具 举报

千问 | 2014-2-18 16:48:49 | 显示全部楼层
data_ck varchar(1) 改为data_ckBOOLEAN。


回复

使用道具 举报

千问 | 2014-2-18 16:48:49 | 显示全部楼层
阿吉2009 发表于 2012-11-14 13:52
data_ck varchar(1) 改为data_ckBOOLEAN。

create or replace function data_check(p_monthyear in varchar2)
return boolean is

v_alread_ininteger := 0 ;
begin
select 1
into v_alread_in
from actual_lease_charges
where monthyear=p_monthyear;
if v_alread_in = 1 then

return true;
dbms_output.put_line('数据已经存在!');
end if;
end;
你看我上面的代码,我的意思是。。。
先设个变量为0.
然后从数据库去检索monthyear的数据。如果已经有了。就返回值1到alread_in。。
但是调用的时候提示返回值过多。。。。怎么处理呢。。
declare
data_ck BOOLEAN;
begin
data_ck := data_check('01-2012');
end;

回复

使用道具 举报

千问 | 2014-2-18 16:48:49 | 显示全部楼层
本帖最后由 阿吉2009 于 2012-11-14 14:12 编辑
明白你的意思了。
select 1 from actual_lease_charges
where monthyear=p_monthyear;
if SQL%NOTFOUND then
return false;
else
return true;
end if;

begin
if data_check('01-2012') then
dbms_output.put_line('数据已经存在!');
end;

回复

使用道具 举报

千问 | 2014-2-18 16:48:49 | 显示全部楼层
阿吉2009 发表于 2012-11-14 14:10
明白你的意思了。
select 1 from actual_lease_charges
where monthyear=p_monthyear;

create or replace function data_check(p_monthyear in varchar2)
return boolean is

v_alread_in integer := 0;
begin
select 1 into v_alread_in from actual_lease_charges
where monthyear=p_monthyear;
if SQL%NOTFOUND then
return false;
else
return true;
end if;
end;
begin
if data_check('01-2012') then
dbms_output.put_line('数据已经存在!');
end if;
end;

晕死。。还是提示返回值过多
回复

使用道具 举报

千问 | 2014-2-18 16:48:49 | 显示全部楼层
超越神的杀戮 发表于 2012-11-14 14:21
create or replace function data_check(p_monthyear in varchar2)
return boolean is

...

笨!不要 into v_alread_in
回复

使用道具 举报

千问 | 2014-2-18 16:48:49 | 显示全部楼层
阿吉2009 发表于 2012-11-14 14:26
笨!不要 into v_alread_in

create or replace function data_check(p_monthyear in varchar2)
return boolean is

v_alread_in integer := 0;
begin
select 1 from actual_lease_charges
where monthyear=p_monthyear;
if SQL%NOTFOUND then
return false;
else
return true;
end if;
end;
你是说这样吗。。但是这个直接提示缺少into啊。。。。。。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题

0

回帖

4882万

积分

论坛元老

Rank: 8Rank: 8

积分
48824836
热门排行