2013-08-02 178 views
0

我想將我的應用程序代碼中的以下兩個sql語句合併到postgresql中的某個函數中,但我遇到了一些麻煩。 這裏有兩個SQL查詢我想結合:如何將兩個sql語句合併爲一個函數

UPDATE userrange f 
SET UsedYesNo = true, user_id=user_id, updateddatetime=now() 
WHERE f.uservalue IN(
    SELECT a.uservalue FROM userrange a WHERE UsedYesNo=false Order By id ASC Limit 1) 
    RETURNING a.uservalue; 

從上面的語句結果在此查詢中使用:

INSERT INTO widget 
    VALUES(DEFAULT, uservalue, 'test','123456778',1,"testservername", now(), Null) 

到目前爲止,我已經建立了功能,只是做的第一update語句,就像這樣:

CREATE or REPlACE FUNCTION create_widget(IN user_id integer, IN password character varying DEFAULT NULL::character varying) 
    RETURNS TABLE(uservalue integer) AS 
$BODY$ 
BEGIN 

    RETURN QUERY 
UPDATE userrange f SET UsedYesNo = true, user_id=user_id, updateddatetime=now() 
    WHERE f.uservalue IN(
    SELECT a.uservalue FROM userrange a WHERE UsedYesNo=false Order By id ASC Limit 1) 
    RETURNING a.uservalue; 

END; 
$BODY$ 
    LANGUAGE plpgsql VOLATILE 

它編譯,但是當我執行它,它失敗,出現錯誤:

ERROR: missing FROM-clause entry for table "a" LINE 4: RETURNING a.uservalue 

我只是用googling這個錯誤來看看我怎麼修復它......但我可以在DECLARE部分中創建一個名爲uservalue的變量 並在輔助查詢中使用它嗎?或者我可以將sql組合成一個

謝謝。

回答

1

如果您可以放棄該功能並且擁有PostgreSQL 9.2+,則可以執行更新並插入到單個查詢中。如果需要的話,將它移植到一個函數應該很簡單。

WITH f AS (
    UPDATE userrange f 
    SET UsedYesNo = true, user_id=user_id, updateddatetime=now() 
    WHERE UsedYesNo IS FALSE 
    RETURNING f.uservalue) 
INSERT INTO widget (<column list>) 
SELECT f.uservalue, 'test','123456778',1,"testservername", now(), NULL 
FROM f; 

- [編輯:附加功能] - 注意:下面的功能是未測試的

CREATE OR REPLACE FUNCTION create_widget(IN p_user_id INTEGER, IN p_password VARCHAR DEFAULT NULL::VARCHAR) 
RETURNS TABLE(uservalue integer) AS 
$BODY$ 
BEGIN 
    RETURN QUERY 
     WITH f AS (
      UPDATE userrange f 
      SET UsedYesNo = true, 
       user_id = p_user_id, 
       updateddatetime = now() 
      WHERE UsedYesNo IS FALSE 
      RETURNING f.uservalue) 
     INSERT INTO widget (<column_list>) 
     /* Omit the DEFAULT, by not including it in the column list above, 
     * the DEFAULT already defined on the column will be used. 
     */ 
     SELECT f.uservalue, 'test','123456778',1,"testservername", now(), NULL 
     FROM f; 
END; 
$BODY$ 
LANGUAGE plpgsql VOLATILE; 
+2

的關鍵詞'DEFAULT'可以在'VALUES'表達式中使用,但不能在一個'SELECT'語句。 –

+0

謝謝,我錯過了。我已更新我的回覆以反映這一變化。 – bma

相關問題