簡體   English   中英

在postgres(plpgsql)中,如何使函數返回對變量table_name的select *?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM