Postgresql

為複合類型的欄位(行數組中的一行)賦值?

  • April 14, 2020

我目前正在編寫一個與行數組一起使用的函式。我需要將值寫入數組中特定行的特定列。以下程式碼應該封裝我遇到的問題。

drop type if exists test_type;

create type test_type as (
 some_int int
);

create or replace function test()
returns void as
$$
declare
x test_type[];
y test_type;
begin
 x[1] = row(1);
 y = row(1);

 /* DOESN'T WORK */
 /* ERROR: syntax error at or near "." */
 /* x[1].some_int = 2; */

 /* HOWEVER, THIS WORKS */
 y = x[1];
 y.some_int = 2;
 x[1] = y;


 raise notice '%', x[1].some_int;
end;
$$
language plpgsql;

如您所見,引用x[1].some_int在大多數情況下是完全合法的,但不適用於賦值。變通方法實現了目標;但是,它通過賦值運算符涉及兩個額外的副本。是否有任何解釋為什麼這是一個錯誤或如何解決它並在不創建額外行副本的情況下完成此任務?

是的,數組函式庫中缺少此功能。它相當奇特,通常會使用(臨時)表而不是行數組進行操作。

也就是說,有一種方法可以使用hstore**#=**運算符進行單個賦值:

CREATE OR REPLACE FUNCTION f_test()
 RETURNS int LANGUAGE plpgsql AS
$func$
DECLARE
  x test_type[] := '{(1)}';
BEGIN
  x[1] := x[1] #= hstore '"some_int"=>"2"'; -- !!!
  RETURN x[1].some_int;
END
$func$;
SELECT f_test();
| f_test |
| -----: |
| 2 |

db<>在這裡擺弄

必須安裝附加模組 hstore。深入解釋:

引用自:https://dba.stackexchange.com/questions/264842