2015-10-14 22 views
3

我想從具有給定LIKE名稱的每個模式的DATABASECHANGELOGLOCK表中選擇行。即... LIKE'myschemaprefix%';從每個模式中的表中選擇行

我希望除UNION以外的東西,因爲我有大量的用戶。

SELECT 'MySchema1' as SCHEMA_NAME, LOCKED, LOCKGRANTED, LOCKEDBY FROM MySchema1.DATABASECHANGELOGLOCK 
UNION 
SELECT 'MySchema2' as SCHEMA_NAME, LOCKED, LOCKGRANTED, LOCKEDBY FROM MySchema1.DATABASECHANGELOGLOCK; 

我用程序攻擊了這個問題,以捕獲我所有模式的名字。

SET serveroutput ON 
BEGIN 
    FOR item IN (
    SELECT USERNAME FROM dba_users WHERE USERNAME LIKE 'MySchemaPrefix%' 
) LOOP 

    DBMS_OUTPUT.PUT_LINE 
     (item.username||'.DATABASECHANGELOGLOCK'); 
    END LOOP; 
END; 
/

我需要的是在循環內使用輸出值來抓取任何行的地方,其中LOCKED = 1;

想法?

回答

0

這可獲取所需的數據

SET serveroutput ON 
declare 
    cur_locks sys_refcursor; -- cursor to fetch lock info 

    -- variables to store data from a row of lock info 
    v_locked number; 
    v_lock_granted varchar2(30); 
    v_locked_by varchar2(30); 

BEGIN 
    FOR item IN (
    SELECT USERNAME FROM dba_users WHERE USERNAME LIKE 'MySchemaPrefix%' 
) LOOP 

     OPEN cur_locks FOR 
     'SELECT LOCKED, LOCKGRANTED, ' || 
     ' LOCKEDBY FROM ' || item.USERNAME || '.DATABASECHANGELOGLOCK ' 
     || ' WHERE LOCKED = 1 ';  

     -- loop to fetch and print 
     LOOP 
     fetch cur_locks into 
     v_locked, v_lock_granted, v_locked_by; 
     EXIT WHEN cur_locks%NOTFOUND; 
     dbms_output.put_line(
      item.USERNAME ||','|| 
      v_locked ||','|| 
      v_lock_granted ||','|| 
      v_locked_by 
     ); 
     end loop; 

     close cur_locks; 

    --DBMS_OUTPUT.PUT_LINE 
     --(item.username||'.DATABASECHANGELOGLOCK'); 
    END LOOP; 
END; 
/
相關問題