2013-09-26 69 views
3

我打算通過策略更改記錄用戶標識在臨時表中。以下應該返回記錄的ID,但它確實返回空行。不知怎麼的ID丟失:S中的行數是好的,該ID在該表中,我不知道我做錯了......PL/PgSQL函數返回的是空行而不是帶ID的行

BEGIN; 
SELECT * FROM policy_change_update(ARRAY[1,2,3]); 
SELECT * FROM user_read_all_by_policy_change(); 
COMMIT; 

功能:

policy_change_provide_store:

CREATE FUNCTION policy_change_provide_store() 
    RETURNS VOID 
AS 
    $BODY$ 
    BEGIN 
    CREATE TEMPORARY TABLE policy_change (
     user_id INT4 
    ); 
    EXCEPTION WHEN duplicate_table THEN 
    RETURN; 
    END; 
    $BODY$ 
LANGUAGE plpgsql VOLATILE; 

policy_change_update

CREATE FUNCTION policy_change_update (
    IN user_ids INT4 [] 
) 
    RETURNS VOID 
AS 
    $BODY$ 
    BEGIN 
    PERFORM policy_change_provide_store(); 
    INSERT INTO policy_change 
    SELECT inserted_user_id FROM unnest(user_ids) AS inserted_user_id 
    WHERE NOT EXISTS(SELECT 1 FROM policy_change WHERE user_id = inserted_user_id); 
    END; 
    $BODY$ 
LANGUAGE plpgsql VOLATILE; 

user_read_all_by_policy_change

CREATE FUNCTION user_read_all_by_policy_change() 
    RETURNS TABLE (
    user_id INT4 
) 
AS 
    $BODY$ 
    BEGIN 
    PERFORM policy_change_provide_store(); 
    RETURN QUERY 
    SELECT user_id FROM policy_change ORDER BY user_id DESC; 
    IF NOT FOUND THEN 
     RAISE SQLSTATE 'UE404' USING MESSAGE = 'not found'; 
    END IF; 
    END; 
    $BODY$ 
LANGUAGE plpgsql VOLATILE; 

任何想法?

+1

(http://stackoverflow.com/questions/12166902/postgres-function-null-value- [相同的問題,因爲在這裏。] for-row-that-references-new)另請注意[在此處詳述的更高版本中的更改](http://stackoverflow.com/questions/7662731/set-a-default-return-value-for-a- postgres-function/7662787#7662787) –

+0

Yepp,我猜這是初學者常見的錯誤... – inf3rno

回答

2

解決辦法:

SELECT policy_change.user_id FROM policy_change ORDER BY policy_change.user_id DESC; 

代替

SELECT user_id FROM policy_change ORDER BY user_id DESC;