2015-04-15 54 views
0

檢查值對於X中的所有表中,而X是甲骨文 - 遍歷表和屬性

select table_name from all_tab_cols 
where column_name = 'MY_COLUMN' 
and owner='ADMIN' 

我需要檢查,如果列MY_COLUMN具有比「Y」的其它值或「N」如果是,則打印出表名。

僞代碼:

for table in X: 
    if MY_COLUMN !='Y' or MY_COLUMN !='N': 
     print table 

如何實現在PL/SQL,使用遊標我猜?

+0

實現通過表名的循環,或實施檢查列值,或兩者兼而有之? –

+0

遍歷給定sql返回的所有表,並檢查MY_COLUMN的列值。每個表都有這一列。 – royskatt

+0

您可以使用隱式遊標使用'for'循環遍歷所有表,您可以在其中使用'INTO'子句指向的'EXECUTE IMMEDIATE'語句中的'SELECT COUNT(*)'查詢表一個整數變量。如果整數> 0,則打印表格。 –

回答

2

下面應該工作:

DECLARE 
    counter NUMBER; 
    cursor c1 is 
    select table_name from all_tab_cols 
    where column_name = 'MY_COLUMN' 
    and owner='ADMIN'; 

BEGIN 
    FOR rec IN c1 LOOP 
    DBMS_OUTPUT.PUT_LINE(rec.table_name); 
    EXECUTE IMMEDIATE 'select count(*) into :counter from '|| rec.table_name ||' where MY_COLUMN!= ''Y'' and MY_COLUMN!= ''N'' '; 
    if counter > 0 then 
     DBMS_OUTPUT.PUT_LINE(rec.table_name); 
    end if; 
    END LOOP; 
END; 

基本上我們打開包含該列的所有表的光標,做一個計數具有比Y或N個不同值的行,如果該計數> 0,打印表。

0

Wouter的版本不適合我。 不得不刪除分號(Oracle數據庫版本11.2.0.4.0)

DECLARE counter NUMBER; BEGIN select count(*) into counter from LASTID; dbms_output.put_line(counter); END; /