2011-06-22 7 views
1

適切な列を持つデータベースのすべてのテーブルに対してOracle検証関数を実行したいとします。 検証は、単に一つのテーブルに対して実行することができます:Oracleサブクエリでテーブルをループする

SELECT 
count (*) 
FROM 
Table_name t 
Where 
SDO_GEOM.VALIDATE_GEOMETRY_WITH_CONTEXT(t.Column_name, 0.005) <> 'TRUE'; 

これは、個々のテーブルのために正常に動作しますが、テストするために100の上にありますように私は、サブクエリを使用して、Oracleメタデータ表にマージしたかったので、自動化全部。私は2つの亜種を考え出しましたが、どちらもうまくいきません。サブクエリ内部から変数を渡すのが難しいためです。 私の2の試みは、以下のとおりです。

SQLエラー:ORA-00904: "TAB" "COL":無効な識別子 00904. 00000 - "%sの:無効な識別子" を返し

SELECT TABLE_NAME tab, COLUMN_NAME col, (select count(*) from tab where sdo_geom.validate_geometry(tab.col, 0.005) <> 'TRUE') 
From 
All_Tab_Columns 
where 
owner = 'WCCDATA' and DATA_TYPE = 'SDO_GEOMETRY' 

SELECT count(*) 
From 
(SELECT 
TABLE_NAME, COLUMN_NAME as col 
FROM 
All_Tab_Columns 
where 
owner = 'WCCDATA' and DATA_TYPE = 'SDO_GEOMETRY') subquery 
WHERE sdo_geom.validate_geometry(subquery.col, 0.005) <> 'TRUE'; 

返す:

ORA-06512: "MDSYS.SDO_GEOM"、行2204 00942. 00000 - "表またはビューが存在しません"

誰でも意見はありますか?ありがとう。

答えて

5

カラム値を識別子(テーブル、カラムなど)として参照することはできません。これを行うためには、あなたはおそらくこのように、動的SQLを作成して実行するには、いくつかのPL/SQLを記述する必要がありますので、それはだ前に

DECLARE 
    CURSOR cur_tables IS 
     SELECT table_name, 
        'SELECT count(*) From ' 
       || table_name 
       || ' WHERE sdo_geom.validate_geometry(' 
       || column_name 
       || ', 0.005) <> ''TRUE''' 
        AS dsql 
     FROM all_tab_columns 
     WHERE owner = 'WCCDATA' AND data_type = 'SDO_GEOMETRY'; 
    v_count NUMBER; 
BEGIN 
    FOR r_tables IN cur_tables LOOP 
     EXECUTE IMMEDIATE r_tables.dsql INTO v_count; 

     DBMS_OUTPUT.put_line(r_tables.table_name || ': ' || v_count); 
    END LOOP; 
END; 
+0

おかげアラン、私もPL/SQLを見たことがありません私にとって全く新しい。 ORA-06512:at line 15 00933. 00000 - "SQLコマンドが正常に終了しませんでした。エラーコード:ORA-00933:SQLコマンドが正しく終了しませんでした。適切に終了していない "コード"任意のアイデア? –

+0

@Jonathan:PL/SQLブロックはうまく動作するので、問合せにSQLを組み込む必要があります(15行目は 'EXECUTE IMMEDIATE'コマンドのように意味があります)。クエリを別々に実行し、生成された1つまたは2つのSQL文を実行してみてください。もう1つの可能性は、空白行がSQL Developerを投げ捨てているということです(私はそれが可能かどうかを知るためにそれに慣れていません)。 – Allan

+0

申し訳ありませんが、喜びはありません。あなたの提案では、私は 'DECLARE'で' Select'を実行しました。それは自分自身であり、それが作成する 'choose'も同様です。 PL/SQLだけを実行する方法はわかりませんが、別のマシンからSQLPlusを使用して実行する方法を(最終的に)把握しましたが、SQL Developerとまったく同じエラーが発生します(00933ライン15の06512)。空行を削除しても、効果はありません。私たちのOracleは、違いがある場合は10.2.0.4です。 –