必要なのは、データ ディクショナリに問い合わせて、特定の列を持つすべてのテーブルを検索し、クエリを生成して、それらの列に特定の値を持つ行を持つテーブルを見つけるものです。これを行うための Oracle 組み込みはありません。
これを行う通常のアプローチは、動的 SQL です。あなたは、データベースにオブジェクトを作成する権限がないと言いました。それでは、匿名ブロックを実行してください。
このコードは、SQL*Plus またはその他の IDE で実行できます。SERVEROUTPUT が有効になっていることを確認してください。
rownum = 1
アセンブルされたステートメントでの使用に注意してください。これにより、複数のレコードが条件に一致する場合にブロックが TOO_MANY_ROWS 例外をスローするのを防ぎます。投稿された質問では、プログラムが 1 つ以上の行の存在をアサートする必要があるだけなので、これは許容されます。実際の要件が異なる場合は、明らかにコードを修正する必要があります。たとえば、一致したレコードの数を表示する必要がある場合はcount(*)
、数値変数を選択し、それに応じて DBMS_OUTPUT ステートメントを変更します。
declare
v char(1);
begin
for r in ( select table_name from all_tab_columns
where owner = 'PRODUCT_BIS'
and column_name = 'TYPECD'
intersect
select table_name from all_tab_columns
where owner = 'PRODUCT_BIS'
and column_name = 'DESCRIPTION' )
loop
begin
execute immediate
'select null from '||r.table_name
||' where typecd=''11'' and description = ''nokia'' and rownum = 1'
into v;
dbms_output.put_line ( 'those values exist in '||r.table_name);
exception
when no_data_found then
dbms_output.put_line ( 'no occurrence of those values in '||r.table_name);
end;
end loop;
end;
このソリューションでは、ハードコードされた値が使用されます。これは 1 回限りの要件であり、問題ではないと思います。ただし、スキーマ、列名、および値のさまざまな順列に対して繰り返し実行するスクリプトの場合は、置換変数を使用するスクリプトとしてこれを書き直す必要があります。