在Oracle中,是否有其他方法可以替代游标来提高性能?

在Oracle中,是否有其他方法可以替代游标来提高性能?,oracle,oracle11g,oracle12c,Oracle,Oracle11g,Oracle12c,下面的查询截断了特定模式中的特定表。有没有更好的选项可以在没有光标的情况下执行此操作?由于模式很大,执行此查询需要几分钟时间 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 (TAB

下面的查询截断了特定模式中的特定表。有没有更好的选项可以在没有光标的情况下执行此操作?由于模式很大,执行此查询需要几分钟时间

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;
你们有没有更快的选择? 谢谢您的帮助。

您可以使用FORALL。 您还可以将要截断的表存储在单独的表中,而不查询字典表。

您可以使用FORALL。 您还可以将要截断的表存储在单独的表中,而不查询字典表。

您可以使用FORALL。 您还可以将要截断的表存储在单独的表中,而不查询字典表。

您可以使用FORALL。
您还可以将要截断的表存储在单独的表中,而不查询字典表。

您尝试过内联游标吗

 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;

这并没有去除光标,只是将其隐藏在封面下,但更具可读性。如果您发现性能问题,请尝试调整查询。

您尝试过内嵌游标吗

 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;

这并没有去除光标,只是将其隐藏在封面下,但更具可读性。如果您发现性能问题,请尝试调整查询。

您尝试过内嵌游标吗

 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;

这并没有去除光标,只是将其隐藏在封面下,但更具可读性。如果您发现性能问题,请尝试调整查询。

您尝试过内嵌游标吗

 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;

这并没有去除光标,只是将其隐藏在封面下,但更具可读性。如果您发现性能问题,请尝试调整查询。

如果有多个表,则TRUNCATE是比查询更大的问题。这是DDL,相当繁重的语句。

如果表的数量超过了几个,那么TRUNCATE比查询更重要。这是DDL,相当繁重的语句。

如果表的数量超过了几个,那么TRUNCATE比查询更重要。这是DDL,相当繁重的语句。

如果表的数量超过了几个,那么TRUNCATE比查询更重要。这是DDL,相当繁重的语句。

删除模式并重新创建?现在需要动态select语句。转到staic onedrop模式并重新创建?现在需要动态select语句。转到staic onedrop模式并重新创建?现在需要动态select语句。转到staic onedrop模式并重新创建?现在需要动态select语句。使用这种类型的游标进行staic one+1更简单、更快(因为自动批量收集),但我感觉这个过程的
SELECT
部分并不是瓶颈。如果这真的是整个查询,那么花费超过一秒钟的时间是不寻常的。+1使用这种类型的游标更简单、更快(因为自动批量收集),但我感觉这个过程的
SELECT
部分并不是瓶颈。如果这真的是整个查询,那么花费超过一秒钟的时间是不寻常的。+1使用这种类型的游标更简单、更快(因为自动批量收集),但我感觉这个过程的
SELECT
部分并不是瓶颈。如果这真的是整个查询,那么花费超过一秒钟的时间是不寻常的。+1使用这种类型的游标更简单、更快(因为自动批量收集),但我感觉这个过程的
SELECT
部分并不是瓶颈。如果这真的是整个查询,那么花费超过一秒钟的时间是不寻常的。