正如@zaratustra所說,你必須使用動態SQL。你可以做這樣的事情:
set serveroutput on
declare
counter number;
begin
for r in (
select owner, table_name
from all_tab_columns
where column_name = 'DT_UPDATE'
) loop
execute immediate 'select count(*) from "'
|| r.owner || '"."' || r.table_name
|| '" where dt_update = :dt and rownum = 1'
into counter
using date '2014-07-07';
if counter = 1 then
dbms_output.put_line(r.table_name);
end if;
end loop;
end;
/
對於每個table_name
(和owner
,爲了完整)在all_tab_columns
鑑定爲具有所謂的dt_update
列,一個新的動態選擇中產生,形式爲:
select count(*) from "<owner>"."<table_name>"
where dt_update = date '2014-07-07'
and rownum = 1;
rownum = 1
過濾器讓查詢執行一旦找到匹配的行就停止;因爲你說你想知道哪些表已被更新,而不是確定哪些行或確切地哪些行,如果一行匹配,那麼這就是你真正需要知道的。因此,對於每個表的動態查詢得到0或1
對於有至少一排匹配日期的表,這printd使用dbms_output
表名,所以你必須有一個啓用 - 與set serveroutput on
,或使用SQL Developer中的DBMS_OUTPUT面板或您最喜愛的客戶端的等效項。
如果我創建與該列一些表,但只有一個填充帶有日期我在尋找:
create table tab1 (dt_update date);
create table tab2 (dt_update date);
create table tab3 (dt_update date);
insert into tab1 values (trunc(sysdate) - 1);
insert into tab2 values (trunc(sysdate));
...然後運行我的匿名塊生產:
anonymous block completed
TAB1
明顯地使用你自己的目標日期。這假定你的日期字段不包含時間分量。如果確實如此,那麼你需要把它變成一個覆蓋整個一天的範圍。
你也可以把它變成一個流水線函數,它將日期作爲參數;這也處理日期字段與時間元素:
create or replace function get_updated_tables(p_date date)
return sys.odcivarchar2list pipelined as
counter number;
begin
for r in (
select owner, table_name
from all_tab_columns
where column_name = 'DT_UPDATE'
) loop
execute immediate 'select count(*) from "'
|| r.owner || '"."' || r.table_name
|| '" where dt_update >= :dt1 and dt_update < :dt2'
|| ' and rownum = 1'
into counter
using p_date, p_date + interval '1' day;
if counter = 1 then
pipe row (r.table_name);
end if;
end loop;
end;
/
然後你可以查詢它:
select column_value from table(get_updated_tables(date '2014-07-07'));
COLUMN_VALUE
------------------------------
TAB1
動態SQL有趣的是,當你在一個評論說,但應該只用於必要時。生成的語句在執行之前無法分析,因此在運行時可能不會識別語法或其他錯誤。另外請確保您使用綁定變量作爲值(但不包括對象名稱)以避免SQL注入。
你需要使用動態SQL,你有沒有試過? – zaratustra
當我運行SELECT TABLE_NAME FROM ALL_TAB_COLUMNS WHERE COLUMN_NAME ='DT_UPDATE'時,我得到一個名爲DT_UPDATE的列的所有表的列表。然後,我想查詢所有這些表以找到DT_UPDATE中具有特定值的那些表。 – 9erNumber16
@zartustra,我從來沒有嘗試過動態SQL,但它看起來很有趣。 – 9erNumber16