超难存储过程,谁能为我优化,立即给分,谢谢!

apboy 2003-06-30 04:00:44
create or replace procedure check_dis_cooperation
is
userida varchar2(10);
deptida varchar2(10);
headshipa char(1);
tableida char(2);
cursor user_list is select userid,deptid,headship from check_user WHERE length(deptid)=6 AND deptid!='000101' AND substr(deptid,0,4)='0001';
cursor table_list is select tableid from check_table WHERE objecttype = '1';
deptid0 varchar2(10):='000102';
deptid1 varchar2(10):='000103';
deptid2 varchar2(10):='000104';
deptid3 varchar2(10):='000105';
deptid4 varchar2(10):='000106';
deptid6 varchar2(10):='000107';
deptid7 varchar2(10):='000108';
deptid8 varchar2(10):='000109';
deptid9 varchar2(10):='000110';
deptid10 varchar2(10):='000111';
deptid11 varchar2(10):='000112';
BEGIN
OPEN user_list;
OPEN table_list;

LOOP
FETCH user_list INTO userida,deptida,headshipa;
EXIT WHEN user_list%NOTFOUND;

IF deptida = deptid1 THEN
LOOP
FETCH table_list INTO tableida;
EXIT WHEN table_list%NOTFOUND;
INSERT INTO check_dis(CHECK_MAN,CHECKED_OBJECT,CHECK_TABLE,CHECK_FLAG,CHECK_SUM)
SELECT userid,deptida,tableida,'0',null FROM hres_user WHERE deptid != deptida AND length(deptid)=6 AND substr(deptid,0,4)='0001';
INSERT INTO check_dis_tmp(CHECK_MAN,CHECKED_OBJECT,CHECK_TABLE,CHECK_FLAG,CHECK_SUM)
SELECT userid,deptida,tableida,'0',null FROM hres_user WHERE deptid != deptida AND length(deptid)=6 AND substr(deptid,0,4)='0001';
END LOOP;
ELSIF deptida = deptid2 THEN
LOOP
FETCH table_list INTO tableida;
EXIT WHEN table_list%NOTFOUND;
INSERT INTO check_dis(CHECK_MAN,CHECKED_OBJECT,CHECK_TABLE,CHECK_FLAG,CHECK_SUM)
SELECT userid,deptida,tableida,'0',null FROM hres_user WHERE deptid != deptida AND length(deptid)=6 AND substr(deptid,0,4)='0001';
INSERT INTO check_dis_tmp(CHECK_MAN,CHECKED_OBJECT,CHECK_TABLE,CHECK_FLAG,CHECK_SUM)
SELECT userid,deptida,tableida,'0',null FROM hres_user WHERE deptid != deptida AND length(deptid)=6 AND substr(deptid,0,4)='0001';
END LOOP;
ELSIF deptida = deptid3 THEN
LOOP
FETCH table_list INTO tableida;
EXIT WHEN table_list%NOTFOUND;
INSERT INTO check_dis(CHECK_MAN,CHECKED_OBJECT,CHECK_TABLE,CHECK_FLAG,CHECK_SUM)
SELECT userid,deptida,tableida,'0',null FROM hres_user WHERE deptid != deptida AND length(deptid)=6 AND substr(deptid,0,4)='0001';
INSERT INTO check_dis_tmp(CHECK_MAN,CHECKED_OBJECT,CHECK_TABLE,CHECK_FLAG,CHECK_SUM)
SELECT userid,deptida,tableida,'0',null FROM hres_user WHERE deptid != deptida AND length(deptid)=6 AND substr(deptid,0,4)='0001';
END LOOP;
ELSIF deptida = deptid4 THEN
LOOP
FETCH table_list INTO tableida;
EXIT WHEN table_list%NOTFOUND;
INSERT INTO check_dis(CHECK_MAN,CHECKED_OBJECT,CHECK_TABLE,CHECK_FLAG,CHECK_SUM)
SELECT userid,deptida,tableida,'0',null FROM hres_user WHERE deptid != deptida AND length(deptid)=6 AND substr(deptid,0,4)='0001';
INSERT INTO check_dis_tmp(CHECK_MAN,CHECKED_OBJECT,CHECK_TABLE,CHECK_FLAG,CHECK_SUM)
SELECT userid,deptida,tableida,'0',null FROM hres_user WHERE deptid != deptida AND length(deptid)=6 AND substr(deptid,0,4)='0001';
END LOOP;
ELSIF deptida = deptid5 THEN
LOOP
FETCH table_list INTO tableida;
EXIT WHEN table_list%NOTFOUND;
INSERT INTO check_dis(CHECK_MAN,CHECKED_OBJECT,CHECK_TABLE,CHECK_FLAG,CHECK_SUM)
SELECT userid,deptida,tableida,'0',null FROM hres_user WHERE deptid != deptida AND length(deptid)=6 AND substr(deptid,0,4)='0001';
INSERT INTO check_dis_tmp(CHECK_MAN,CHECKED_OBJECT,CHECK_TABLE,CHECK_FLAG,CHECK_SUM)
SELECT userid,deptida,tableida,'0',null FROM hres_user WHERE deptid != deptida AND length(deptid)=6 AND substr(deptid,0,4)='0001';
END LOOP;
ELSIF deptida = deptid6 THEN
LOOP
FETCH table_list INTO tableida;
EXIT WHEN table_list%NOTFOUND;
INSERT INTO check_dis(CHECK_MAN,CHECKED_OBJECT,CHECK_TABLE,CHECK_FLAG,CHECK_SUM)
SELECT userid,deptida,tableida,'0',null FROM hres_user WHERE deptid != deptida AND length(deptid)=6 AND substr(deptid,0,4)='0001';
INSERT INTO check_dis_tmp(CHECK_MAN,CHECKED_OBJECT,CHECK_TABLE,CHECK_FLAG,CHECK_SUM)
SELECT userid,deptida,tableida,'0',null FROM hres_user WHERE deptid != deptida AND length(deptid)=6 AND substr(deptid,0,4)='0001';
END LOOP;
ELSIF deptida = deptid7 THEN
LOOP
FETCH table_list INTO tableida;
EXIT WHEN table_list%NOTFOUND;
INSERT INTO check_dis(CHECK_MAN,CHECKED_OBJECT,CHECK_TABLE,CHECK_FLAG,CHECK_SUM)
SELECT userid,deptida,tableida,'0',null FROM hres_user WHERE deptid != deptida AND length(deptid)=6 AND substr(deptid,0,4)='0001';
INSERT INTO check_dis_tmp(CHECK_MAN,CHECKED_OBJECT,CHECK_TABLE,CHECK_FLAG,CHECK_SUM)
SELECT userid,deptida,tableida,'0',null FROM hres_user WHERE deptid != deptida AND length(deptid)=6 AND substr(deptid,0,4)='0001';
END LOOP;
ELSIF deptida = deptid8 THEN
LOOP
FETCH table_list INTO tableida;
EXIT WHEN table_list%NOTFOUND;
INSERT INTO check_dis(CHECK_MAN,CHECKED_OBJECT,CHECK_TABLE,CHECK_FLAG,CHECK_SUM)
SELECT userid,deptida,tableida,'0',null FROM hres_user WHERE deptid != deptida AND length(deptid)=6 AND substr(deptid,0,4)='0001';
INSERT INTO check_dis_tmp(CHECK_MAN,CHECKED_OBJECT,CHECK_TABLE,CHECK_FLAG,CHECK_SUM)
SELECT userid,deptida,tableida,'0',null FROM hres_user WHERE deptid != deptida AND length(deptid)=6 AND substr(deptid,0,4)='0001';
END LOOP;
ELSIF deptida = deptid9 THEN
LOOP
FETCH table_list INTO tableida;
EXIT WHEN table_list%NOTFOUND;
INSERT INTO check_dis(CHECK_MAN,CHECKED_OBJECT,CHECK_TABLE,CHECK_FLAG,CHECK_SUM)
SELECT userid,deptida,tableida,'0',null FROM hres_user WHERE deptid != deptida AND length(deptid)=6 AND substr(deptid,0,4)='0001';
INSERT INTO check_dis_tmp(CHECK_MAN,CHECKED_OBJECT,CHECK_TABLE,CHECK_FLAG,CHECK_SUM)
SELECT userid,deptida,tableida,'0',null FROM hres_user WHERE deptid != deptida AND length(deptid)=6 AND substr(deptid,0,4)='0001';
END LOOP;
ELSIF deptida = deptid10 THEN
LOOP
FETCH table_list INTO tableida;
EXIT WHEN table_list%NOTFOUND;
INSERT INTO check_dis(CHECK_MAN,CHECKED_OBJECT,CHECK_TABLE,CHECK_FLAG,CHECK_SUM)
SELECT userid,deptida,tableida,'0',null FROM hres_user WHERE deptid != deptida AND length(deptid)=6 AND substr(deptid,0,4)='0001';
INSERT INTO check_dis_tmp(CHECK_MAN,CHECKED_OBJECT,CHECK_TABLE,CHECK_FLAG,CHECK_SUM)
SELECT userid,deptida,tableida,'0',null FROM hres_user WHERE deptid != deptida AND length(deptid)=6 AND substr(deptid,0,4)='0001';
END LOOP;
ELSIF deptida = deptid11 THEN
LOOP
FETCH table_list INTO tableida;
EXIT WHEN table_list%NOTFOUND;
INSERT INTO check_dis(CHECK_MAN,CHECKED_OBJECT,CHECK_TABLE,CHECK_FLAG,CHECK_SUM)
SELECT userid,deptida,tableida,'0',null FROM hres_user WHERE deptid != deptida AND length(deptid)=6 AND substr(deptid,0,4)='0001';
INSERT INTO check_dis_tmp(CHECK_MAN,CHECKED_OBJECT,CHECK_TABLE,CHECK_FLAG,CHECK_SUM)
SELECT userid,deptida,tableida,'0',null FROM hres_user WHERE deptid != deptida AND length(deptid)=6 AND substr(deptid,0,4)='0001';
END LOOP;
END IF;

END LOOP;
COMMIT;
CLOSE table_list;
CLOSE user_list;

END;
/
上面存储过程如果多了判断,编译不通过,有哪位兄弟能帮我优化,或者写成程序块或者两个存储过程,一个调用一个?谢谢
...全文
36 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
scorcer 2003-06-30
  • 打赏
  • 举报
回复
create or replace procedure check_dis_cooperation(dept in varchar2)
is
userida varchar2(10);
deptida varchar2(10);
headshipa char(1);
tableida char(2);
cursor user_list is select userid,deptid,headship from check_user WHERE length(deptid)=6 AND deptid!='000101' AND substr(deptid,0,4)='0001';
cursor table_list is select tableid from check_table WHERE objecttype = '1';

BEGIN
OPEN user_list;
OPEN table_list;

LOOP
FETCH user_list INTO userida,deptida,headshipa;
EXIT WHEN user_list%NOTFOUND;

IF deptida = dept THEN
LOOP
FETCH table_list INTO tableida;
EXIT WHEN table_list%NOTFOUND;
INSERT INTO check_dis(CHECK_MAN,CHECKED_OBJECT,CHECK_TABLE,CHECK_FLAG,CHECK_SUM)
SELECT userid,deptida,tableida,'0',null FROM hres_user WHERE deptid != deptida AND length(deptid)=6 AND substr(deptid,0,4)='0001';
INSERT INTO check_dis_tmp(CHECK_MAN,CHECKED_OBJECT,CHECK_TABLE,CHECK_FLAG,CHECK_SUM)
SELECT userid,deptida,tableida,'0',null FROM hres_user WHERE deptid != deptida AND length(deptid)=6 AND substr(deptid,0,4)='0001';
END LOOP;
END IF;

END LOOP;
COMMIT;
CLOSE table_list;
CLOSE user_list;

end check_dis_cooperation;


create or replace procedure test as
v_dept varchar2(20);
v_num number;
v_st varchar2(20);
begin
v_num:=1;
v_st:='000101';
loop
exit when v_num>11;
v_st:=lpad(v_st + 1,6,0);
check_dis_cooperation(v_st);
v_num:=v_num + 1;
end loop;
end;
shuipipi 2003-06-30
  • 打赏
  • 举报
回复
WK,这么一大堆,建议泥最好先简单说明一下泥的实现目的,不然怎么让人看下去?

17,086

社区成员

发帖
与我相关
我的任务
社区描述
Oracle开发相关技术讨论
社区管理员
  • 开发
  • Lucifer三思而后行
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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