[英]In postgres (plpgsql), how to make a function that returns select * on a variable table_name?
基本上,至少為了概念驗證,我想要一個可以運行的函數:SELECT res('table_name'); 這將給我SELECT * FROM table_name;的結果。 我遇到的問題是架構...在我擁有的功能的聲明中:
創建或替換功能res(table_name TEXT)返回問題集
問題是我不知道如何聲明我的回報,因為它要我指定一個表或一個模式,而在函數實際運行之前,我將不會擁有它。
有任何想法嗎?
您可以執行此操作,但是如上所述,您必須在SELECT
查詢中添加列定義列表。
CREATE OR REPLACE FUNCTION res(table_name TEXT) RETURNS SETOF record AS $$
BEGIN
RETURN QUERY EXECUTE 'SELECT * FROM ' || table_name;
END;
$$ LANGUAGE plpgsql;
SELECT * FROM res('sometable') sometable (col1 INTEGER, col2 INTEGER, col3 SMALLINT, col4 TEXT);
為什么出於任何實際目的,您只想傳入表並從中選擇*? 也許是為了好玩?
如果不定義某種已知的輸出(例如jack和rudi show),就無法做到這一點。 或像depesz一樣在這里使用輸出參數http://www.depesz.com/index.php/2008/05/03/waiting-for-84-return-query-execute-and-cursor_tuple_fraction/進行操作 。
圍牆方法的一些技巧是循環發出引發通知並一次打印出結果集。 或者,您可以創建一個名為get_rows_TABLENAME的函數,該函數具有要返回的每個表的定義。 只需使用代碼即可生成過程。 但是再一次不確定從表中進行選擇*的價值,特別是在沒有約束的情況下,除了娛樂或使DBA沸騰以外,還有其他價值。
現在,在SQL Server中,您可以使存儲過程返回動態結果集。 這既是祝福,也是詛咒,因為如果不查找定義就無法確定返回的結果。 對我來說,我認為PostgreSQL的實現是實現它的更合理的方法。
即使您設法做到這一點(如果您的8.4或更高版本,請參閱rudi-moore的答案),也必須在select
顯式擴展類型-例如:
SELECT res('table_name') as foo(id int,...)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.