sql >> データベース >  >> RDS >> PostgreSQL

refcursorを消費して返すPostgreSQL関数のテスト

    Q1

    「小さなテスト」は単純なSQLにすることができます:

    BEGIN;
    SELECT get_function_that_returns_cursor('ret', 4100, 'foo', 123); -- note: 'ret'
    FETCH ALL IN ret; -- works for any rowtype
    
    COMMIT;  -- or ROLLBACK;
    

    COMMITを実行します / ROLLBACK 結果を調べました。ほとんどのクライアントは、latコマンドの結果のみを表示します。

    カーソルを返すの章の詳細 マニュアルの。

    Q2

    そして、返される行タイプがわからない場合、どうすればよいでしょうか?

    結果のみを検査したいので、レコード全体をtextにキャストできます。 。このようにして、関数の動的リターンタイプの問題を完全に回避します。

    このデモを検討してください:

    CREATE TABLE a (a_id int PRIMARY KEY, a text);
    INSERT INTO a VALUES (1, 'foo'), (2, 'bar');
    
    CREATE OR REPLACE FUNCTION reffunc(INOUT ret refcursor) AS  -- INOUT param :)
    $func$
    BEGIN
        OPEN ret FOR SELECT * FROM a;
    END
    $func$ LANGUAGE plpgsql;
    
    
    CREATE OR REPLACE FUNCTION ctest()
      RETURNS SETOF text AS
    $func$
    DECLARE
        curs1 refcursor;
        rec   record;
    BEGIN
      curs1 := reffunc('ret');   -- simple assignment
      
      LOOP
        FETCH curs1 INTO rec;
        EXIT WHEN NOT FOUND;     -- note the placement!
        RETURN NEXT rec::text;
      END LOOP;
    END
    $func$ LANGUAGE plpgsql;
    

    -> SQLfiddle



    1. 2019データベースのトレンド– SQLとNoSQL、トップデータベース、単一データベースと複数データベースの使用

    2. SQLiteOpenHelperを使用してAndroidでsqliteデータベースをアタッチする

    3. cx_Oracle:各行を辞書として受け取るにはどうすればよいですか?

    4. トランザクションログの監視