Postgresql
Postgres 12:插入複合類型的數組,複合類型有一個數組欄位。格式錯誤的數組文字,輸入意外結束
我在通過過程將一個簡單的整數數組插入到 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)