Oracle

返回 Oracle 查詢的輸出

  • May 9, 2016

如何更改下面的查詢以在 SQL Developer 中查看 my_sql 的結果(現在我只看到查詢,而不是結果)?

DECLARE
   my_sql VARCHAR(1000);
BEGIN
   FOR t IN (SELECT  t.table_name, t.owner FROM  all_tables t where owner = 'O' )
   LOOP
       my_sql := 'select max(DATE) from ' || t.owner || '.' || t.table_name ;
       dbms_output.put_line('executing: ' || my_sql);
       EXECUTE IMMEDIATE my_sql;
   END LOOP;
EXCEPTION
   WHEN OTHERS THEN
   dbms_output.put_line('ERROR!! -- '  || SQLCODE || '-- ' || sqlerrm || ' --' );
END;

我想從所有表(所有表都有這些相同的列)中獲取一個值(在本例中為最大值)。

您沒有看到任何結果的原因是 FOR 循環沒有返回任何行,因為沒有名為“O”的所有者。要為不是您可以使用的登錄使用者的使用者選擇所有表;

FOR t IN (SELECT  t.table_name, t.owner FROM  all_tables t where owner <> USER)

但是,您幾乎會立即失敗,因為 MAX(DATE) 表明每個表都有一個名為 DATE 的列。這不是真的。

看起來您可能想要一個特定使用者列表(不是 SYS 或 SYSTEM 或任何其他“系統”帳戶)的所有表的列表,其中包含添加或創建行的最新日期或涉及日期的其他內容。為此,架構的每個表都必須具有您要檢查的列。

DECLARE
my_sql VARCHAR(1000);
BEGIN
   FOR t IN (SELECT  t.table_name, t.owner FROM  all_tables t where owner IN ('SCHEMA1', 'SCHEMA2','SCHEMA3')
   LOOP
       my_sql := 'SELECT MAX(update_date) FROM ' || t.owner || '.' || t.table_name ;
       dbms_output.put_line('executing: ' || my_sql);
       EXECUTE IMMEDIATE my_sql;
   END LOOP;
EXCEPTION
   WHEN OTHERS THEN
   dbms_output.put_line('ERROR!! -- '  || SQLCODE || '-- ' || sqlerrm || ' --' );
END;

SCHEMA1 / 2 / 3 是您知道的擁有您感興趣的表的使用者,它假定每個表都有一個“update_date”列。

引用自:https://dba.stackexchange.com/questions/137986