PLV8
ストアド プロシージャからテーブルを返そうとしています。
入力引数の認識に失敗します。つまり$1
、関数が with の場合 RETURNS TABLE(...)
です。
関数がスカラーを返す場合に機能します。
psql# CREATE OR REPLACE function foo(integer)
RETURNS integer
LANGUAGE plv8
AS $$
var a=$1;
return a;
$$;
CREATE FUNCTION
psql# SELECT * FROM foo(10);
foo
-----
10
(1 row)
function の場合にも機能しますRETURNS SETOF
。
(ケース 1 ) カスタム データ型の場合:
psql# CREATE TYPE myrow as (bar int);
CREATE TYPE
psql# CREATE OR REPLACE function foo(integer)
RETURNS SETOF myrow
LANGUAGE plv8
AS $$
var a=$1;
return {"bar": a};
// Or alternatively:
// return plv8.execute('SELECT ' + a +' AS bar');
$$;
CREATE FUNCTION
psql# SELECT * FROM foo(10);
bar
-----
10
(1 row)
(ケース 2 ) ありSETOF record
:
psql# CREATE OR REPLACE function foo(integer)
RETURNS SETOF record
LANGUAGE plv8
AS $$
var a=$1;
return {"bar": a};
// Or alternatively:
// return plv8.execute('SELECT ' + a +' AS bar');
$$;
CREATE FUNCTION
psql# SELECT * FROM foo(10) AS xxx(bar int);
bar
-----
10
(1 row)
しかし、それは動作しないようですRETURNS TABLE
:
psql# CREATE OR REPLACE FUNCTION foo(integer)
RETURNS TABLE(bar int)
LANGUAGE plv8
AS $$
var a=$1;
return {"bar": a};
// Doesn't matter cause it doesn't make it here,
// but alternative 'return' also fails with same error:
// return plv8.execute('SELECT ' + a + ' AS bar');
$$;
CREATE FUNCTION
psql# SELECT * FROM foo(10);
ERROR: ReferenceError: $1 is not defined
DETAIL: foo() LINE 2: var a=$1;
なぜ窒息しているの$1
ですか?
私は Postgres 9.4.0 と Plv8 1.4.4 を使用しています。