2012-03-01 102 views
1

這可能嗎?我有一個創建表的函數。調用函數,然後在視圖中選擇一個表格

我想要一個可以調用該函數的視圖,然後在它創建的表上進行選擇。它需要是一個視圖,因爲頂部有一些使用視圖顯示其數據的php圖形。

喜歡的東西:

CREATE OR REPLACE VIEW vwi_spm_avg_enroll_rate AS 
SELECT * FROM fn_spm_avg_enroll_rate(); 
SELECT * FROM avg_enroll_rate; 

這並不工作,但我不知道是否有辦法或是否有人知道用不同的方式來做到這一點?

乾杯 編輯:CODE:

set search_path to "[study]", public; 


DROP FUNCTION fn_spm_avg_enroll_rate(); 
CREATE OR REPLACE FUNCTION fn_spm_avg_enroll_rate() 
RETURNS VOID 
SECURITY DEFINER 
AS $proc$ 
DECLARE 
    month1 text; 
    month2 text; 
    month3 text; 
    month4 text; 
    month5 text; 
    month6 text; 
    month7 text; 
    month8 text; 
    month9 text; 
    month10 text; 
    month11 text; 
    month12 text; 

    sqlStr text; 
    sqlStr2 text; 
    insertStr text; 
    r record; 

BEGIN 
    select to_char((current_date - interval '1 Month')::date,'Mon-YYYY') INTO month1; 
    select to_char((current_date - interval '2 Month')::date,'Mon-YYYY') INTO month2; 
    select to_char((current_date - interval '3 Month')::date,'Mon-YYYY') INTO month3; 
    select to_char((current_date - interval '4 Month')::date,'Mon-YYYY') INTO month4; 
    select to_char((current_date - interval '5 Month')::date,'Mon-YYYY') INTO month5; 
    select to_char((current_date - interval '6 Month')::date,'Mon-YYYY') INTO month6; 
    select to_char((current_date - interval '7 Month')::date,'Mon-YYYY') INTO month7; 
    select to_char((current_date - interval '8 Month')::date,'Mon-YYYY') INTO month8; 
    select to_char((current_date - interval '9 Month')::date,'Mon-YYYY') INTO month9; 
    select to_char((current_date - interval '10 Month')::date,'Mon-YYYY') INTO month10; 
    select to_char((current_date - interval '11 Month')::date,'Mon-YYYY') INTO month11; 
    select to_char((current_date - interval '12 Month')::date,'Mon-YYYY') INTO month12; 

    sqlStr := $$SELECT country_name, 
       SUM(CASE WHEN date_trunc('month', "C1".eldate::date) = date_trunc('month', now()) - interval '12 months' THEN 1 ELSE 0 END) AS "month12", 
       SUM(CASE WHEN date_trunc('month', "C1".eldate::date) = date_trunc('month', now()) - interval '11 months' THEN 1 ELSE 0 END) AS "month11", 
       SUM(CASE WHEN date_trunc('month', "C1".eldate::date) = date_trunc('month', now()) - interval '10 months' THEN 1 ELSE 0 END) AS "month10", 
       SUM(CASE WHEN date_trunc('month', "C1".eldate::date) = date_trunc('month', now()) - interval '9 months' THEN 1 ELSE 0 END) AS "month9", 
       SUM(CASE WHEN date_trunc('month', "C1".eldate::date) = date_trunc('month', now()) - interval '8 months' THEN 1 ELSE 0 END) AS "month8", 
       SUM(CASE WHEN date_trunc('month', "C1".eldate::date) = date_trunc('month', now()) - interval '7 months' THEN 1 ELSE 0 END) AS "month7", 
       SUM(CASE WHEN date_trunc('month', "C1".eldate::date) = date_trunc('month', now()) - interval '6 months' THEN 1 ELSE 0 END) AS "month6", 
       SUM(CASE WHEN date_trunc('month', "C1".eldate::date) = date_trunc('month', now()) - interval '5 months' THEN 1 ELSE 0 END) AS "month5", 
       SUM(CASE WHEN date_trunc('month', "C1".eldate::date) = date_trunc('month', now()) - interval '4 months' THEN 1 ELSE 0 END) AS "month4", 
       SUM(CASE WHEN date_trunc('month', "C1".eldate::date) = date_trunc('month', now()) - interval '3 months' THEN 1 ELSE 0 END) AS "month3", 
       SUM(CASE WHEN date_trunc('month', "C1".eldate::date) = date_trunc('month', now()) - interval '2 months' THEN 1 ELSE 0 END) AS "month2", 
       SUM(CASE WHEN date_trunc('month', "C1".eldate::date) = date_trunc('month', now()) - interval '1 months' THEN 1 ELSE 0 END) AS "month1" 

      FROM country AS c 
       INNER JOIN "site" AS s using (country_id) 
       INNER JOIN "subject_C1" AS "C1" ON "s"."site_id" = "C1"."site_id" 

      GROUP BY 1$$; 

EXECUTE $$DROP TABLE avg_enroll_rate CASCADE$$; 

EXECUTE $$CREATE TABLE avg_enroll_rate ("__SeriesName" VARCHAR(512), "__VectorX" VARCHAR(512), "__VectorY" INTEGER)$$; 


FOR r IN 
     EXECUTE sqlStr 
LOOP 
     --RAISE NOTICE 'Record: %', r; 
     sqlStr2 := 'INSERT INTO "avg_enroll_rate" VALUES (' || quote_literal(r.country_name) || ',' || quote_literal(month12) || ',' || r.month12 || ')'; 
     EXECUTE sqlStr2; 
     sqlStr2 := 'INSERT INTO "avg_enroll_rate" VALUES (' || quote_literal(r.country_name) || ',' || quote_literal(month11) || ',' || r.month11 || ')'; 
     EXECUTE sqlStr2; 
     sqlStr2 := 'INSERT INTO "avg_enroll_rate" VALUES (' || quote_literal(r.country_name) || ',' || quote_literal(month10) || ',' || r.month10 || ')'; 
     EXECUTE sqlStr2; 
     sqlStr2 := 'INSERT INTO "avg_enroll_rate" VALUES (' || quote_literal(r.country_name) || ',' || quote_literal(month9) || ',' || r.month9 || ')'; 
     EXECUTE sqlStr2; 
     sqlStr2 := 'INSERT INTO "avg_enroll_rate" VALUES (' || quote_literal(r.country_name) || ',' || quote_literal(month8) || ',' || r.month8 || ')'; 
     EXECUTE sqlStr2; 
     sqlStr2 := 'INSERT INTO "avg_enroll_rate" VALUES (' || quote_literal(r.country_name) || ',' || quote_literal(month7) || ',' || r.month7 || ')'; 
     EXECUTE sqlStr2; 
     sqlStr2 := 'INSERT INTO "avg_enroll_rate" VALUES (' || quote_literal(r.country_name) || ',' || quote_literal(month6) || ',' || r.month6 || ')'; 
     EXECUTE sqlStr2; 
     sqlStr2 := 'INSERT INTO "avg_enroll_rate" VALUES (' || quote_literal(r.country_name) || ',' || quote_literal(month5) || ',' || r.month5 || ')'; 
     EXECUTE sqlStr2; 
     sqlStr2 := 'INSERT INTO "avg_enroll_rate" VALUES (' || quote_literal(r.country_name) || ',' || quote_literal(month4) || ',' || r.month4 || ')'; 
     EXECUTE sqlStr2; 
     sqlStr2 := 'INSERT INTO "avg_enroll_rate" VALUES (' || quote_literal(r.country_name) || ',' || quote_literal(month3) || ',' || r.month3 || ')'; 
     EXECUTE sqlStr2; 
     sqlStr2 := 'INSERT INTO "avg_enroll_rate" VALUES (' || quote_literal(r.country_name) || ',' || quote_literal(month2) || ',' || r.month2 || ')'; 
     EXECUTE sqlStr2; 
     sqlStr2 := 'INSERT INTO "avg_enroll_rate" VALUES (' || quote_literal(r.country_name) || ',' || quote_literal(month1) || ',' || r.month1 || ')'; 
     EXECUTE sqlStr2; 


END LOOP; 

END 
$proc$ 
LANGUAGE 'PLPGSQL'; 

我是新來的sql很抱歉,如果它的垃圾代碼:(

+0

是avg_enroll_rate函數返回的表嗎?你能編輯你的問題併發布你的功能代碼嗎? – Taryn 2012-03-01 15:07:13

+0

可能我的想法太簡單了,但是如果您只需從函數調用中調用'SELECT',爲什麼會創建一個視圖來調用帶有預定義參數的函數? – Karlson 2012-03-01 15:19:28

+0

該函數比select更復雜得多。它創建一個包含動態列名稱的表格。所以創建的表總是有不同的列名。 @bluefeet是的,我不能發佈代碼那裏有敏感信息,對不起 – 2012-03-01 15:22:58

回答

0

通過看你的功能代碼,您正在返回表avg_enroll_rate而不是在該表做一個SELECT,你可以調用你的函數,它應該做同樣的事情。

CREATE OR REPLACE VIEW vwi_spm_avg_enroll_rate AS 
SELECT * 
FROM fn_spm_avg_enroll_rate(); 
-- SELECT * FROM avg_enroll_rate; this is unneeded because for function is returning the table 

釷當你從你的視圖中獲得SELECT時,你將從avg_enroll_rate表中獲得你需要的數據,因爲你通過調用函數返回了它。

+0

是的,這是正確的,但不是在一分鐘,上面的代碼返回void。我有點困惑,因爲我今天改變了桌子的佈局。在創建動態列名之前:Country | 2011年1月| 2011年2月等。 但現在日期在行中,所以表總是要用相同的列名創建。所以我只是在底部添加一個循環來返回表並從視圖中調用該函數:)謝謝 – 2012-03-01 16:18:23

相關問題