2013-06-06 29 views
2

使用動態SQL查詢下面是我的功能在我執行一個動態查詢,但我在一個單獨列了該查詢的結果,所有值以逗號分隔。返回表中的PostgreSQL

CREATE OR REPLACE FUNCTION get_weather(city text) 
RETURNS weather AS $$ 
DECLARE 
rec RECORD; 
BEGIN 
EXECUTE 'SELECT * FROM weather WHERE city = ''' || city || '''' INTO rec; 
RETURN rec; 
END; 
$$ LANGUAGE plpgsql; 

結果上面的功能:

"("San Francisco",46,50,0.25,1994-11-27)" 

需要的輸出:

enter image description here

請幫我在這,在此先感謝。

+0

請鏈接到現有技術相關的問題,當你寫一個後續。它有助於爲讀者提供有關您正在採取的行動的背景信息。在這種情況下,你真的應該已經包括*你怎麼跑了功能*和您的確切PostgreSQL的版本。 –

+0

THX ..阿努..g8問題... REQ解決這裏找到 – Niks

回答

3

你必須使用選擇

 
SELECT * FROM get_weather('Prague'); 

postgres=# SELECT * FROM weather ; 
    city │ lo │ hi │  d  
────────┼────┼────┼──────────── 
San Fr │ 46 │ 50 │ 2013-06-06 
(1 row) 

postgres=# SELECT * FROM get_weather('San Fr'); 
    city │ lo │ hi │  d  
────────┼────┼────┼──────────── 
San Fr │ 46 │ 50 │ 2013-06-06 
(1 row) 

postgres=# \sf get_weather 
CREATE OR REPLACE FUNCTION public.get_weather(city text) 
RETURNS weather 
LANGUAGE plpgsql 
AS $function$ 
DECLARE 
rec RECORD; 
BEGIN 
EXECUTE 'SELECT * FROM weather WHERE city = $1' INTO rec USING sity; 
RETURN rec; 
END; 
$function$ 

有在你的榜樣

  • 使用返回查詢一些可能的優化EXECUTE
  • 沒有使用過動態查詢 - 利用返回查詢
  • 使用SQL語言代替PL/pgSQL的一行功能
 
CREATE OR REPLACE FUNCTION get_weather(city text) 
RETURNS weather AS $$ 
SELECT * FROM weather WHERE city = $1; 
$$ LANGUAGE sql; 

注意:新建立動態查詢像你這樣的!這是SQL注入問題的示例。

改用

 
EXECUTE 'SELECT * FROM weather WHERE city = ' || quote_literal(city) INTO rec; 

或更好

 
EXECUTE 'SELECT * FROM weather WHERE city = $1' INTO rec USING city; 
+0

感謝,但還是這個返回逗號分隔值。請幫助,我是新的postgresql。 – Anvesh

+0

@Anu遺漏的一些相當重要的上下文是在上一個問題中:http://stackoverflow.com/q/16940583/398670。你會注意到我使用了format函數的'%I'格式說明符來替換標識符,並提到了'EXECUTE ... USING'。 –

+0

@Anu客戶端的代碼是什麼?也許這是一個問題。 –