2014-01-07 27 views
3

我有一个plpgslq功能,它执行一些数据处理,并且想写一个for循环,但是我的表名在设计时是不知道的。有没有什么可能的方法来实现这一目标?这里是什么,我想实现示例代码段:For循环与Postgresql 9.1中的动态表名称?

-- Function: check_data() 

-- DROP FUNCTION check_data(); 

CREATE OR REPLACE FUNCTION check_data() 
    RETURNS character varying AS 
$BODY$declare 
dyn_rec record; 
tbl_name record; 
begin 
    -- sample dynamic tables 
    tbl_name := 'cars'; 
    tbl_name := 'trucks'; 
    tbl_name := 'bicycles'; 

    for dyn_rec in select * from format($$s%$$,tbl_name) loop 
    raise notice 'item is %',dyn_rec.item_no; 
    end loop; 

    return 'Processing Ok'; 

end;$BODY$ 
    LANGUAGE plpgsql VOLATILE 
    COST 100; 
ALTER FUNCTION check_data() 
    OWNER TO postgres; 

回答

8

在PLPGSQL嵌入式SQL不能使用一个变量作为表或者列标识符如初。一个解决方案是动态SQL - 执行或用于执行语句:

DECLARE 
    tables text[] = ARRAY['table1','table2']; 
    table_name text; 
    rec record; 
BEGIN 
    FOREACH table_name IN ARRAY tables 
    LOOP 
    FOR r IN EXECUTE format('SELECT * FROM %I', table_name) 
    LOOP 
     RAISE NOTICE '%', rec; 
    END LOOP; 
    LOOP 
    END LOOP; 
END; 
+0

感谢帕维尔Stehule,“执行”这正是我需要的,现在工程确定。 – arcull

+0

arcull,或许你应该把它标记为答案。 :) – 425nesp