14

テーブルを返す Postgres 関数があります。

CREATE OR REPLACE FUNCTION testFunction() RETURNS TABLE(a int, b int) AS
$BODY$
DECLARE a int DEFAULT 0;
DECLARE b int DEFAULT 0;
BEGIN
CREATE TABLE tempTable AS SELECT a, b;
RETURN QUERY SELECT * FROM tempTable; 
DROP TABLE tempTable;
END;
$BODY$
LANGUAGE plpgsql;

この関数は、行と列の形式でデータを返しません。代わりに、次のようにデータを返します。

(0,0)

これにより、Coldfusion cfquery ブロックでデータを抽出する際に問題が発生します。この関数からテーブルが返されたときに、行と列のデータを取得するにはどうすればよいですか? つまり、PL/pgSQL 関数がデータを列として返さないのはなぜですか?

4

2 に答える 2

31

行タイプではなく個々の列を取得するには、次のように関数を呼び出します。

SELECT * FROM testfunction();

テーブルからすべての列を選択するのと同じように。
また、テスト関数の次のレビューされた形式も検討してください。

CREATE OR REPLACE FUNCTION testfunction()
  RETURNS TABLE(a int, b int)
  LANGUAGE plpgsql AS
$func$
DECLARE
   _a int := 0;
   _b int := 0;
BEGIN
   CREATE TABLE tempTable AS SELECT _a, _b;
   RETURN QUERY SELECT * FROM tempTable;
   DROP TABLE tempTable;
END
$func$;

特に:

DECLAREキーワードは一度だけ必要です。

OUTでパラメーターとして既に (暗黙的に) 宣言されているパラメーターを宣言することは避けてください。RETURNS TABLE (...)

Postgres では、引用符で囲まれていない CaMeL ケースの識別子を使用しないでください。引用符で囲まれていない識別子は小文字にキャストされますが、紛らわしいエラーが発生する可能性があります。見る:

この例の一時テーブルはまったく役に立ちません (単純化しすぎている可能性があります)。与えられた例は、次のように要約されます。

CREATE OR REPLACE FUNCTION testfunction(OUT a int, OUT b int)
  LANGUAGE plpgsql AS
$func$
BEGIN
   a := 0;
   b := 0;
END
$func$;
于 2013-02-01T23:24:40.920 に答える