2012-08-22 63 views
1

我想遍歷postgresql數據庫的列表,並在postgresql函數中對它們運行一些查詢。下面是一個代碼示例...在postgresql函數中循環訪問數據庫

CREATE OR REPLACE FUNCTION my_function() 
    RETURNS VOID AS 
    $$ 
    DECLARE 
     db VARCHAR(50); -- this declaration is where the confusion is 
    BEGIN 
     FOR db IN 
      SELECT datname FROM pg_catalog.pg_database WHERE datname ~ '^mydbname_' 
     LOOP 
      -- this is just an example 
      SELECT * FROM db; 
     END LOOP; 
    END; 
    $$ 
    LANGUAGE 'plpgsql'; 

我知道,我可以使用PostgreSQL的EXECUTE評估查詢作爲一個字符串(例如,EXECUTE 'SELECT * FROM ' || db || ';';),但我的疑問是相當漫長和複雜。

有沒有辦法在postgresql中做到這一點?是否有「數據庫」聲明類型?

回答

2

你不能在查詢中直接使用的變量作爲對象名稱(數據庫,表,列)。你將不得不使用EXECUTE。

無論如何,這不會起作用,因爲您無法執行跨數據庫查詢。要麼從客戶端執行此操作,要麼查看使用dblink。有一個SQL/MED(外部數據包裝器)的實現,但奇怪的是我不認爲有一個PostgreSQL wrapper yet

+0

你是對的 - 我想要做的是從根本上錯誤的。看起來我必須將其移植到bash腳本中。謝謝! – jonas

1

不是類型名稱的pg_database中的db名稱?

嘗試DECLARE db_name NAME;

+0

你絕對正確。 'datname'列的類型是'NAME'。 – jonas