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

func1使用 c 参数调用func2,即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 回答