2015-10-21 57 views
-1
CREATE OR REPLACE FUNCTION LOAD_TEST() RETURNS VOID AS $$ 
DECLARE 
    i RECORD; 
    cur CURSOR FOR SELECT * FROM dsms.tab; 
BEGIN 
    FOR i in cur loop 
    with load as 
     (insert into dsms.tab1(id,name) 
     values(i.id,i.regexp_split_to_table(i.name,E',')) 
     returning * 
     ); 
    end loop; 
    commit; 
END; $$ LANGUAGE plpgsql; 

我得到這個錯誤與上面的代碼 -postgres pl/pgsql錯誤:在輸入行17末尾的語法錯誤:);

 
ERROR: syntax error at end of input 
LINE 17:); 
     ^

********** Error ********** 

ERROR: syntax error at end of input SQL state: 42601 Character: 411 

任何你能幫助我嗎?我正在嘗試使用CTE函數插入一行,然後將插入的行作爲*返回,以便我可以使用該行並使用as來操作後續語句。

+1

這被標記爲重複,但重複的問題已被刪除.. – some1

回答

0

CTE需要一個主要語句,這裏缺少一個主要語句。一般形式如下:

WITH load AS (
    INSERT INTO dsms.tab1(id, name) 
    VALUES (i.id, i.regexp_split_to_table(i.name,E',')) 
    RETURNING *) 
SELECT * FROM load 
WHERE ... 

如果你想在更復雜的方式從插入的記錄使用數據,聲明dbms.tab1%rowtype類型的變量,然後做:

INSERT INTO dsms.tab1(id, name) 
VALUES (i.id, i.regexp_split_to_table(i.name,E',')) 
RETURNING * INTO my_var; 

然後你可以使用my_var在循環中的任何後續語句中。

此外,您不需要在函數結束時使用COMMIT