我有以下查询,它截断特定架构中的特定表。没有游标,有更好的选择吗?由于架构很大,此查询需要几分钟才能执行。
DECLARE TYPE cur_typ IS REF CURSOR;
c cur_typ;
qry_str VARCHAR2(1000);
table_name VARCHAR2(50);
BEGIN
qry_str := \'SELECT TABLE_NAME FROM USER_ALL_TABLES
WHERE (TABLE_NAME like \'\'STG_%\'\'
OR TABLE_NAME like \'\'S_%\'\' )\';
OPEN c FOR qry_str;
LOOP
FETCH c INTO table_name;
EXIT WHEN c%NOTFOUND;
EXECUTE IMMEDIATE \'TRUNCATE TABLE \' || table_name;
END LOOP;
CLOSE c;
你们有没有更快的选择? 谢谢你的帮助。
答案 0 :(得分:3)
如果有多个表,则TRUNCATE比查询更重要。这是DDL,非常沉重的陈述。
答案 1 :(得分:2)
您是否尝试过内联游标?
BEGIN
FOR row in (
SELECT TABLE_NAME FROM USER_ALL_TABLES
WHERE TABLE_NAME like 'STG_%'
OR TABLE_NAME like 'S_%'
) LOOP
EXECUTE IMMEDIATE 'TRUNCATE TABLE ' || row.table_name;
END LOOP;
END;
这并没有摆脱光标,只是隐藏在封面下,但更具可读性。如果您发现性能问题,请尝试调整查询。
答案 2 :(得分:-2)
您可以使用FORALL。 您还可以将要截断的表存储在单独的表中,而不查询字典表。