如何在plpython函数之间传递int []作为参数

时间:2015-06-25 06:47:24

标签: python sql postgresql plpython

我正在使用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使用func2的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))

它不起作用。

2 个答案:

答案 0 :(得分:0)

不知道你是否解决了这个问题,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)

答案 1 :(得分:0)

探究这个:

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数组)作为参数传递给execute。有必要先准备好声明。