2012-04-20 156 views
-1

我有以下功能(返回一組自定義類型的)變量在PostgreSQL的循環

CREATE OR REPLACE FUNCTION myfunction(in_myvar integer) 
    RETURNS SETOF my_type AS 
$BODY$ 

DECLARE 
    v_data my_type%rowtype; 
    v_another_var text; 
BEGIN 
    FOR v_data IN (

     -- I want to be able to do a SELECT INTO v_another_var in each iteration 
     -- of the loop, ideally so I can use this value throughout the select 
     -- statement e.g.: 
     -- SELECT INTO v_another_var regex_replace(col3, '[^a-zA-Z0-9 ]', ''); 

     SELECT DISTINCT 
      col1 
      col2, 
      -- v_another_var AS some_column 
      -- etc. 
      -- perhaps use this v_another_var again here 
      -- as part of something else. 
      FROM mytable 
      WHERE v_another_var = 'test' + some_function() = 'something' 
        -- want to use the variable again here. 
    ) LOOP 
     RETURN NEXT v_data; 
    END LOOP; 
    RETURN; 
$BODY$ 

是否有可能分配一個變量,並用它在每個SELECT語句作爲這樣一個循環的一部分嗎?即使這是可能的話,SELECT INTO語句的工作,我把它(將COL3可以訪問?)

是否有Postgres的方式來實現這種變量使用的?

回答

3

如果要在循環的每次迭代中使用不同的值,則需要在控制循環的查詢中或在LOOP/END LOOP構造內選擇v_another_var的值。如果需要,您可以隨時添加其他查詢以在循環內分配其他值。

很難做出更具體的建議沒有更具體的例子。

1

你的問題是一團糟。其中大部分都沒有任何意義。

是否有可能分配一個變量,在每個使用它選擇 語句,這樣一個循環的一部分嗎?

  • 你只需要在你的問題一個 SELECT語句。你沒有道理。

  • 有「中的」 SELECT語句沒有循環。您可以遍歷SELECT語句產生的行。

即使這是可能的話,INSERT INTO語句的工作,我 有它(將COL3可以訪問?)

  • 它不會在所有。無論你有沒有它,也沒有你在那裏。
    • 也許你的意思是SELECT INTO?
    • 沒有FROM條款,col3是不確定的。
    • 只有一個聲明FOR循環。更多關於更進一步的下降。

而且......

  • 沒有找到for循環中選擇所需的括號。

  • regexp_replace(),不regex_replace()

  • 文字串聯在PostgreSQL的:'test' || some_function()
    'test' + some_function()

  • 您需要大約WHERE x = (a || b)

  • 語言聲明括號缺失。最後加上language plpgsql


可能是什麼問(野生猜測): 是的,你可以在FOR循環分配多個變量。 I quote the manual here:

的目標是一個記錄變量,行變量,或標量變量的逗號分隔的列表 。

儘管如此,您不能混合記錄變量和標量變量,因爲您似乎在嘗試。您必須...

a)將複合類型v_data分解爲標量變量並按順序列出它們,然後將v_another_var附加到FOR目標列表中。

或b)將文本列(而不是v_another_var)添加到複合類型my_type。但是,在這種情況下,您必須重新組織RETURN NEXT聲明。由於我只是在猜測你的問題可能是什麼,所以我不會詳細討論。

清理你的問題,並要求精確的問題,如果你想有一個確切的答案。

+0

對不起。我並沒有故意試圖讓這個問題變得複雜/混亂 - 我想我並不真正瞭解這個問題如何運作。 – 2012-04-20 21:30:36