哪位高手帮忙优化一下存储过程
下面是我写的一个存储过程,第一次写存储过程,运行速度很慢,哪位高手帮忙给提点意见,这个过程该怎么优化,或者哪里需要优化.
谢谢各位了!
CREATE OR REPLACE PROCEDURE test_sjjc(
lctable IN VARCHAR,
lctabzj IN NUMBER ,
lczj IN YWSLLCSLB.ZJ%TYPE
)
IS
str_zj VARCHAR2 (200); --sql语句的主键值变量
str_up VARCHAR2 (2000); --sql语句的临时变量
str_p VARCHAR2 (2000); --sql语句的临时变量
wj VARCHAR2 (200); --sql语句中外键的临时变量
zjm VARCHAR2 (200); --sql语句中的主键名
checkid NUMBER := 0; --判断第一个循环是否执行
TYPE sel IS REF CURSOR; --声明一个游标
sel_zzj sel; --定义一个游标
BEGIN
FOR i_table IN ((SELECT t1.table_name tname
FROM user_constraints t1,user_cons_columns t2
WHERE t1.r_constraint_name = t2.constraint_name
AND t2.table_name = lctable
INTERSECT
SELECT DISTINCT(BYWM) tablename
FROM SJJC_ZDJCTABLE,
(SELECT ywlcdm
FROM YWSSLB
WHERE ZJ = lczj) ywlcdm_t
WHERE LCDM = ywlcdm_t.ywlcdm)
MINUS
SELECT DISTINCT bywm
FROM sjjc_output s
WHERE s.lcslzj = lczj)
LOOP
checkid := checkid + 1;
--检索出表的主键
SELECT col.column_name cname
INTO zjm
FROM user_constraints con,
user_cons_columns col
WHERE con.constraint_name = col.constraint_name
AND con.constraint_type = 'P'
AND con.table_name = i_table.tname;
--检索出表的外键名
SELECT r.column_name
INTO wj
FROM user_cons_columns col,
(SELECT coln.table_name, coln.column_name, conn.r_constraint_name
FROM user_constraints conn, user_cons_columns coln
WHERE conn.constraint_name = coln.constraint_name
AND coln.table_name = i_table.tname) r
WHERE r.r_constraint_name = col.constraint_name
AND col.table_name = lctable;
str_p :=
' SELECT ' || zjm ||
' FROM ' || i_table.tname ||
' WHERE ' || wj || ' = '|| lctabzj;
str_up :=
str_p ||
' UNION ALL ' ||
' SELECT DISTINCT(0) ' || zjm ||
' FROM dual ' ||
' WHERE NOT EXISTS(' || str_p || ')';
OPEN sel_zzj FOR str_up;
LOOP
--得到和流程相关的表的主键值
FETCH sel_zzj INTO str_zj;
EXIT WHEN sel_zzj%NOTFOUND;
--执行检查模块
TEST_SJJC_GYTDSYQDJ_CRDJ(i_table.tname, str_zj, lczj);
IF str_zj != 0 AND str_zj IS NOT NULL
THEN
test_sjjc(i_table.tname, str_zj,lczj);
END IF;
END LOOP;
CLOSE sel_zzj;
END LOOP;
COMMIT;
EXCEPTION
WHEN OTHERS THEN
ROLLBACK;
END test_sjjc