2013-08-02 123 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

相关问题