как передать массив в функции postgresql


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;

0

вы должны использовать формат для динамического sql. (обновлено, чтобы отразить комментарий ОП)

Тип (обязательно)

Тип преобразования формата, используемого для вывода выходного документа формата. Поддерживаются следующие типы:

  • s форматирует значение аргумента как простую строку. Нулевое значение рассматривается как пустая строка.

  • Я рассматриваю значение аргумента как идентификатор 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)
PostgreSQL, функция,

postgresql,function,

0

Ответов: 2


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;

0

вы должны использовать формат для динамического sql. (обновлено, чтобы отразить комментарий ОП)

Тип (обязательно)

Тип преобразования формата, используемого для вывода выходного документа формата. Поддерживаются следующие типы:

  • s форматирует значение аргумента как простую строку. Нулевое значение рассматривается как пустая строка.

  • Я рассматриваю значение аргумента как идентификатор 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)
PostgreSQL, функция,
Похожие вопросы