Oracle中的函数有新增语句执行报错!!! 谁能帮我!!!

salut 2011-07-24 12:45:00
我在Oracle中下了一个function,操作时先按一个条件检查,然后根据不同的检查结果新增进库里一条数据,函数如下:

CREATE OR REPLACE FUNCTION FFCS_SMS_CHECK_FUC(v_stype IN VARCHAR,v_phone IN VARCHAR,v_ip IN VARCHAR)
RETURN VARCHAR IS
PRAGMA AUTONOMOUS_TRANSACTION;
v_times INTEGER;
v_minute INTEGER;
v_i INTEGER; --查到的次数
v_str VARCHAR(64);
v_sid NUMBER;
v_result VARCHAR(64);
v_state VARCHAR(2);
BEGIN
v_times := 8; --8次
v_minute := 5; --5分钟
select SEQ_SMS_CHECK.nextval into v_sid FROM DUAL; --ID
SELECT (SELECT COUNT(*) FROM ffcs_sms_check a
WHERE a.phone = v_phone AND a.ip = v_ip AND a.stype = v_stype
AND a.sendtime > SYSDATE -(v_minute/1440)) INTO v_i FROM dual;
v_str := '您在'||v_minute||'分钟内发送了'||v_i||'次短信验证码';
IF(v_i>=v_times) THEN
BEGIN
v_result := '[失败]:'||v_str;
v_state := '1';
INSERT INTO ffcs_sms_check(sid,stype,phone,sendtime,state,ip,remark)
VALUES(v_sid,v_stype,v_phone,Sysdate,v_state,v_ip,v_result);
END;
ELSE
BEGIN
v_result := '[成功]:'||v_str;
v_state := '0';
INSERT INTO ffcs_sms_check(sid,stype,phone,sendtime,state,ip,remark)
VALUES(v_sid,v_stype,v_phone,Sysdate,v_state,v_ip,v_result);
END;
END IF;
RETURN v_result;
END FFCS_SMS_CHECK_FUC;


结果我执行的时候老是给我回滚了,我看网上说查询中不能有DML语句,按网上的加了语句PRAGMA AUTONOMOUS_TRANSACTION;
但是还是不能执行SELECT FFCS_SMS_CHECK_FUC('登录','18911112222','192.168.1.1') FROM dual;
我的是哪里出错了?请大侠指点!不胜感激!
...全文
950 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
秋雨飘落 2011-07-24
  • 打赏
  • 举报
回复

CREATE OR REPLACE FUNCTION FFCS_SMS_CHECK_FUC(v_stype IN VARCHAR,v_phone IN VARCHAR,v_ip IN VARCHAR)
RETURN VARCHAR IS
PRAGMA AUTONOMOUS_TRANSACTION;
v_times INTEGER;
v_minute INTEGER;
v_i INTEGER; --查到的次数
v_str VARCHAR(64);
v_sid NUMBER;
v_result VARCHAR(64);
v_state VARCHAR(2);
BEGIN
v_times := 8; --8次
v_minute := 5; --5分钟
select SEQ_SMS_CHECK.nextval into v_sid FROM DUAL; --ID
SELECT (SELECT COUNT(*) FROM ffcs_sms_check a
WHERE a.phone = v_phone AND a.ip = v_ip AND a.stype = v_stype
AND a.sendtime > SYSDATE -(v_minute/1440)) INTO v_i FROM dual;
v_str := '您在'||v_minute||'分钟内发送了'||v_i||'次短信验证码';
IF(v_i>=v_times) THEN
BEGIN
v_result := '[失败]:'||v_str;
v_state := '1';
INSERT INTO ffcs_sms_check(sid,stype,phone,sendtime,state,ip,remark)
VALUES(v_sid,v_stype,v_phone,Sysdate,v_state,v_ip,v_result);
commit;
END;
ELSE
BEGIN
v_result := '[成功]:'||v_str;
v_state := '0';
INSERT INTO ffcs_sms_check(sid,stype,phone,sendtime,state,ip,remark)
VALUES(v_sid,v_stype,v_phone,Sysdate,v_state,v_ip,v_result);
commit;
END;
END IF;

RETURN v_result;
END FFCS_SMS_CHECK_FUC;

SQL> select FFCS_SMS_CHECK_FUC('1','2','3') from dual;

FFCS_SMS_CHECK_FUC('1','2','3'
--------------------------------------------------------------------------------
[成功]:您在5分钟内发送了0次短信验证码

SQL>



--------增加了两处COMMIT;

17,377

社区成员

发帖
与我相关
我的任务
社区描述
Oracle 基础和管理
社区管理员
  • 基础和管理社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧