运行不出结果 是不是进了死循环什么的啊 求高手解决

jjyv70 2011-10-13 03:48:58
create or replace procedure llx_22 is
v_bir date;
v_id employ.id%TYPE;
CURSOR c_emp
IS SELECT s_fun12(idcard),id
FROM employ;
BEGIN
OPEN c_emp;
FETCH c_emp INTO v_bir,v_id;
WHILE c_emp %FOUND LOOP
BEGIN
UPDATE employ
SET birthday = v_bir
WHERE id = v_id;
EXCEPTION
WHEN NO_DATA_FOUND THEN
DBMS_OUTPUT.PUT_LINE('找不到ID‘|| v_id||’');
FETCH c_emp INTO v_bir,v_id;
END;
END LOOP;
CLOSE c_emp;
END;


create function s_fun12(card varchar2) return
date is idate date;
begin
IF length(card)=18 THEN
select to_Date('19'||substr(card,7,8),'yyyy-mm-dd') into idate from dual;
ELSIF length(card)=15 THEN
select to_Date(substr(card,7,6),'yyyy-mm-dd') into idate from dual;
ELSE
DBMS_OUTPUT.PUT_LINE('身份证号错误');
END IF;
return idate;
END;


运行不出结果 是不是进了死循环什么的啊 求高手解决 表里面有 id name idcard date
...全文
76 13 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
xiaobn_cn 2011-10-13
  • 打赏
  • 举报
回复
异常处旦不需要紧接在SQL的下面写的,当SQL出现异常时会自动跳转到所在代码段的异常位理位置的。
jjyv70 2011-10-13
  • 打赏
  • 举报
回复
就是异常处理 按你说的 提到前面去就好了 谢谢了啊~~~
xiaobn_cn 2011-10-13
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 jjyv70 的回复:]
已经运行成功了 谢谢~~~
那这里 能不能添加一个异常啊?
[/Quote]
哪里?添加一个什么异常?
jjyv70 2011-10-13
  • 打赏
  • 举报
回复
谢谢 搞定了~
jjyv70 2011-10-13
  • 打赏
  • 举报
回复
已经运行成功了 谢谢~~~
那这里 能不能添加一个异常啊?
xiaobn_cn 2011-10-13
  • 打赏
  • 举报
回复
EXCEPTION
WHEN NO_DATA_FOUND THEN
DBMS_OUTPUT.PUT_LINE('找不到ID‘|| v_id||’');
FETCH c_emp INTO v_bir,v_id;
END;
END LOOP;

改下
FETCH c_emp INTO v_bir,v_id;
EXCEPTION
WHEN NO_DATA_FOUND THEN
DBMS_OUTPUT.PUT_LINE('找不到ID‘|| v_id||’');
END;
END LOOP;
jjyv70 2011-10-13
  • 打赏
  • 举报
回复
缺失关键字.... 这个能循环改吗...
nvhaixx 2011-10-13
  • 打赏
  • 举报
回复
EXCEPTION
WHEN NO_DATA_FOUND THEN
DBMS_OUTPUT.PUT_LINE('找不到ID‘|| v_id||’');
这句话可能是进入了死循环,没看出那边有给 NO_DATA_FOUND 在哪边定义和赋值,而且一般而言不会把exception放在循环里面吧!
xiaobn_cn 2011-10-13
  • 打赏
  • 举报
回复
你可以执行下面的SQL看下表中是不是存在非法数据,如果存在会报错的。

select to_date((case length(idcard) 
when 18 then substr(idcard,7,8)
when 15 then '19'||substr(idcard,7,6)
else null),'yyyymmdd') from employ;
xiaobn_cn 2011-10-13
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 jjyv70 的回复:]
要用存储过程写...... 而且把‘19’ 改到15位身份证那去还是运行不出来啊
[/Quote]

那就把我写的那条SQL外面包一层存储过程好了.
jjyv70 2011-10-13
  • 打赏
  • 举报
回复
要用存储过程写...... 而且把‘19’ 改到15位身份证那去还是运行不出来啊
xiaobn_cn 2011-10-13
  • 打赏
  • 举报
回复
还有,你这个需求没有必要写成存储过程,使用1条SQL应当就能搞定。
 UPDATE employ  
SET birthday =
to_date((case length(idcard)
when 18 then substr(idcard,7,8)
when 15 then '19'||substr(idcard,7,6)
else null),'yyyymmdd');
xiaobn_cn 2011-10-13
  • 打赏
  • 举报
回复
身份证处理函数把18位和15位弄反了吧?18位的不用加19,15位的才要加。

17,382

社区成员

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

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