Postgresql

Postgres 12:插入複合類型的數組,複合類型有一個數組欄位。格式錯誤的數組文字,輸入意外結束

  • January 20, 2021

我在通過過程將一個簡單的整數數組插入到 Postgres 中的表中時遇到問題。整數數組在復合類型中聲明,我試圖通過該過程插入這些類型的數組。

只是把它放在那裡:這段程式碼在沒有數字數組的情況下工作(即,如果我只是從表、複合類型和過程中刪除變數as_ids ,程式碼會按照它應該的方式執行。出於某種原因,它只是不適用於數組)。

桌子

CREATE TABLE user_ans(
ans_id INT GENERATED ALWAYS AS IDENTITY,
fq_id INT NOT NULL,
p_id INT NOT NULL,
j_id INT NOT NULL,
u_id INT NOT NULL,
d_id INT,
ans TEXT NOT NULL,
as_ids INT[] NOT NULL,
created TIMESTAMP,
updated TIMESTAMP
);

複合型

CREATE TYPE new_ans_obj AS (
   ans TEXT, 
   as_ids INT[],
   created TIMESTAMP,
   d_id INT,
   fq_id INT,
   j_id INT,
   p_id INT,
   u_id INT
);

步驟

CREATE OR REPLACE PROCEDURE add_ans_arr (
   new_ans new_ans_obj[]
)
   LANGUAGE plpgsql
AS $$
BEGIN
   INSERT INTO user_ans(ans, as_ids, created, d_id, fq_id, j_id, p_id, u_id)
   SELECT * from unnest(new_ans);
   COMMIT;
END;$$;

嘗試

我使用的命令:

call add_ans_arr((ARRAY['(sdf,{2002,2005},2021-01-19T21:48:28.997Z,1001,7001,3,6001,1)', '(sdf,{2002,2005},2021-01-19T21:48:29.626Z,1001,7002,3,6001,1)'])::new_ans_obj[]);

輸出:

ERROR:  malformed array literal: "{2002"
LINE 1: call add_ans_arr((ARRAY['(sdf,{2002,2005},2021-01-19T21:4...
                                  ^
DETAIL:  Unexpected end of input.

我使用的命令:

call add_ans_arr((ARRAY['(sdf,(ARRAY[2002,2005])::int[],2021-01-19T21:48:28.997Z,1001,7001,3,6001,1)', '(sdf,(ARRAY[2002,2005])::int[],2021-01-19T21:48:29.626Z,1001,7002,3,6001,1)'])::new_ans_obj[]);

輸出:

ERROR:  malformed array literal: "(ARRAY[2002"
LINE 1: call add_ans_arr((ARRAY['(sdf,(ARRAY[2002,2005])::int[],2021...
                               ^
DETAIL:  Array value must start with "{" or dimension information.

發布明顯的嘗試

我還嘗試了上述兩個命令的不同變體(使用括號,將數組的大小放入等),但輸出相似。我已經閱讀了有關將數組插入 Postgres 的其他文章以及文件,似乎我使用了正確的語法(儘管可能不是)?

我在想整數數組可能與’unnest’函式衝突,所以我重寫了以下過程,但仍然出現同樣的問題:

CREATE OR REPLACE PROCEDURE add_ans_arr (
   arr new_ans_obj[]
)
   LANGUAGE plpgsql
AS $$
DECLARE
   ans_obj new_ans_obj;
BEGIN
   FOREACH ans_obj IN ARRAY arr
   LOOP
       INSERT INTO user_ans(ans, as_ids, created, d_id, fq_id, j_id, p_id, u_id)
       VALUES (ans_obj.ans, ans_obj.as_ids, ans_obj.created, ans_obj.d_id, ans_obj.fq_id, ans_obj.j_id, ans_obj.p_id, ans_obj.u_id);
   END LOOP;
   COMMIT;
END;$$;

我可以將這些對象單獨插入表中:

insert into user_ans(ans, as_ids, created, d_id, fq_id, j_id, p_id, u_id) VALUES ('lala', '{2002}', '2021-01-19T21:48:29.626Z', 1001, 7002, 3, 6001, 1);

但我真的不明白為什麼上述方法不起作用?我嘗試將單引號放入我的第一個命令中,但我只是得到一個語法錯誤。另外我也不想太亂

ARRAY['','']::ans_obj[]

結構,因為它適用於我的其他程序的其餘部分,並且此結構是由我的伺服器生成的。雖然如果這個結構有什麼可怕的錯誤,我願意改變它的伺服器端程式碼,但同樣 - 它適用於我的其餘儲存過程。

任何方向/幫助將不勝感激。

將內部數組寫在大括號中,並在數組文字周圍用雙引號轉義逗號:

SELECT ARRAY[
         '(sdf,"{2002,2005}",2021-01-19T21:48:28.997Z,1001,7001,3,6001,1)',
         '(sdf,"{2002,2005}",2021-01-19T21:48:29.626Z,1001,7002,3,6001,1)'
      ]::new_ans_obj[];

                                                                     array                                                                      
-------------------------------------------------------------------------------------------------------------------------------------------------
{"(sdf,\"{2002,2005}\",\"2021-01-19 21:48:28.997\",1001,7001,3,6001,1)","(sdf,\"{2002,2005}\",\"2021-01-19 21:48:29.626\",1001,7002,3,6001,1)"}
(1 row)

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