2010-12-29 10 views
1

「平坦化」オブジェクトを返すストアドプロシージャを記述したいと思います。 '平坦化'することで、基本的に行のセットを選択し、行の特定のフィールドを関数から返されたデータに戻します。このpl/pgsql関数の記述方法は?

  • 私は変数temp_resultの正しいデータ型を使用しています
  • ・アム私は行にアクセス:

    次のコードは、私は私は2つの質問がある

    CREATE TABLE user (id int, school_id int, name varchar(32)); 
    
    CREATE TYPE my_type (user1_id int, user1_name varchar(32), user2_id int, user2_name varchar(32)); 
    
    CREATE OR REPLACE FUNCTION get_two_users_from_school(schoolid int) 
    RETURNS my_type AS $$ 
    DECLARE 
    result my_type 
    temp_result user 
    BEGIN 
        -- for purpose of this question assume 2 rows returned 
        SELECT id, name INTO temp_result FROM user where school_id = schoolid LIMIT 2; 
        -- Will the (pseudo)code below work?: 
        result.user1_id := temp_result[0].id ; 
        result.user1_name := temp_result[0].name ; 
        result.user2_id := temp_result[1].id ; 
        result.user2_name := temp_result[1].name ; 
        return result ; 
    END 
    $$ language plpgsql 
    

    を行うにしようとしていますかを説明します正しく(配列のインデックスを使用して)?

答えて

1

正しく(配列のインデックスを使用して)アクセスしていますか?

いいえ、あなたは素敵なマニュアルで説明されているカーソル使用して結果をループする必要があります。このような何かが動作するはず http://www.postgresql.org/docs/current/static/plpgsql-control-structures.html#PLPGSQL-RECORDS-ITERATING

を:ところで

 
DECLARE 
    temp_result RECORD; 
    row_counter integer; 
BEGIN 
    row_counter := 1; 
    FOR temp_result IN SELECT id, name FROM user where school_id = schoolid LIMIT 2 LOOP 
    IF row_counter = 1 THEN 
     result.user1_id := temp_result.id; 
     result.user1_name = temp_result.name; 
    END IF; 
    IF row_counter = 2 THEN 
     result.user2_id := temp_result.id; 
     result.user2_name = temp_result.name; 
    END IF; 
    row_counter := row_counter + 1; 
    END LOOP; 

    return result; 
END; 

:テーブルを持ちますユーザーが予約語であり、長期的にはいくつかの問題を引き起こす可能性があるため、「ユーザー」という名前は本当に良い考えではありません。

+0

テーブルの名前はここの例です。 – skyeagle

関連する問題