我正在使用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))
它不起作用。
答案 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。有必要先准备好声明。