我试图在pg函数中传递一个文本数组但是我遇到了不同的错误,请帮助我如何传递一个数组,它有不同的数据类型作为文本和整数....我的代码在这里
CREATE or replace FUNCTION get_data(text[])
RETURNS TABLE(sheet_no text,type text,road_name text,lon text,lat text)
AS $$
DECLARE
sql text;
BEGIN
sql ='set session "myapp.user" ='||$1;
execute sql;
update tbl_encroachment
set landuse = $2
where tbl_encroachment.unique_land_parcel_no = $3
and tbl_encroachment.parcel_sub_division = $4;
RETURN QUERY
select foo.sheet_no,foo.type,foo.road_name,foo.lon,foo.lat
from tbl_encroachment as foo
where foo.unique_land_parcel_no = $3
and foo.parcel_sub_division = $4;
RETURN;
end
$$ LANGUAGE plpgsql;
--execute query
select sheet_no,type,road_name,lon,lat from get_data('{7,hasilpur,7-35-251-0001_1-1-9-SUK_001,9}'::text[])
答案 0 :(得分:1)
您无法访问此类数组元素。 $1
代表整个数组,因此您需要执行$1[1], $1[2], $1[3]
而不是$1, $2, $3
所以试试这个:
CREATE or replace FUNCTION get_data(text[])
RETURNS TABLE(sheet_no text,type text,road_name text,lon text,lat text)
AS $$
DECLARE
sql text;
BEGIN
sql ='set session "myapp.user" ='||$1[1];
execute sql;
update tbl_encroachment
set landuse = $1[2]
where tbl_encroachment.unique_land_parcel_no = $1[3]
and tbl_encroachment.parcel_sub_division = $1[4];
RETURN QUERY
select foo.sheet_no,foo.type,foo.road_name,foo.lon,foo.lat
from tbl_encroachment as foo
where foo.unique_land_parcel_no = $1[3]
and foo.parcel_sub_division = $1[4];
RETURN;
end
$$ LANGUAGE plpgsql;
答案 1 :(得分:0)
你应该使用format来动态sql。 (已更新以反映OP评论)
键入(必填)
用于生成格式说明符的格式转换类型 输出。支持以下类型:
将参数值格式化为简单字符串。空值被视为空字符串。
我将参数值视为SQL标识符,必要时对其进行双引号。该值为null是错误的(相当于 quote_ident)。
L引用参数值作为SQL文字。空值显示为字符串NULL,不带引号(相当于 quote_nullable)。
更改
sql ='set session "myapp.user" ='||$1;
execute sql;
到
sql =format('set session "myapp.user" = %L',$1);
execute sql;
这里的工作示例:
t=# SELECT current_setting('myapp.user');
ERROR: unrecognized configuration parameter "myapp.user"
Time: 0.305 ms
t=# do
t-# $$
t$# begin
t$# execute format ('set session "myapp.user" = %L','try it');
t$# end;
t$# $$
t-# ;
DO
Time: 0.337 ms
t=# SELECT current_setting('myapp.user');
current_setting
-----------------
try it
(1 row)