2

私は PostgreSQL と plpython 関数を使用しています。

私は機能を持っていますfunc1:

CREATE OR REPLACE FUNCTION func1(a integer, b timestamp with time zone, c integer[])
  RETURNS SETOF x AS
$BODY$

parts=plpy.execute("SELECT * FROM func2(%s)"%c)

$BODY$
LANGUAGE plpythonu VOLATILE

func1func2である c 引数で呼び出しますinteger[]

CREATE OR REPLACE FUNCTION func2(v_c integer[])
RETURNS SETOF y AS
$BODY$
    .
    .
    .
$BODY$
LANGUAGE plpythonu VOLATILE

SQLクエリから実行する場合

select *
from func1(3,'14-Feb-2012','{-2,30747,30906}')

次のエラーが表示されます。

ERROR:  spiexceptions.SyntaxError: syntax error at or near "["
LINE 1: SELECT * FROM func2([-2, 30747, 30906])

を渡すと何かが機能しintger[]ません。私も試しました:

plpy.execute("SELECT * FROM func2(%s)"%str(c))

それもうまくいきません。

4

2 に答える 2

1

これを調べます:

create or replace function func1(t text[]) returns integer as $$
    p = plpy.prepare("select func2($1) v", ["text[]",])
    r = plpy.execute(p, [t,]) 
    return r[0]["v"]
$$ language 'plpythonu';

create or replace function func2(t text[]) returns integer as $$
    return len(t)
$$ language 'plpythonu';

select func1('{"a", "b"}'::text[]);
> 2

最良の方法は、実行時にリスト (postgres 配列) をパラメーターとして渡すことだと思います。まず、ステートメントを準備する必要があります。

于 2016-01-13T11:32:52.057 に答える
-1

これを解決したかどうかわかりません。問題は、plpy が python を sql 型に自動的にフォーマットしないことです。私が行うことは、func2 への呼び出しをフォーマットすることです。

それ以外の:

parts = plpy.execute("SELECT * FROM func2(%s)"%c)

試す:

c = [-2, 30747, 30906]
c = '{' + ','.join(str(i) for i in c) + '}'
q = "SELECT * FROM func2('{}')".format(c)
plpy.notice(q)
parts = plpy.execute(q)
于 2015-12-22T10:28:32.663 に答える