saya punya meja yang disebut buku
CREATE TABLE book
(
id smallint NOT NULL DEFAULT 0,
bname text,
btype text,
bprices numeric(11,2)[],
CONSTRAINT key PRIMARY KEY (id )
)
dan fungsi save_book
CREATE OR REPLACE FUNCTION save_book(thebook book)
RETURNS text AS
$BODY$
DECLARE
myoutput text :='Nothing has occured';
BEGIN
update book set
bname=thebook.bname,
btype=thebook.btype,bprices=thebook.bprices WHERE id=thebook.id;
IF FOUND THEN
myoutput:= 'Record with PK[' || thebook.id || '] successfully updated';
RETURN myoutput;
END IF;
BEGIN
INSERT INTO book values(thebook.id,thebook.bname,thebook.btype,
thebook.bprices);
myoutput:= 'Record successfully added';
END;
RETURN myoutput;
END;
$BODY$
LANGUAGE plpgsql VOLATILE
COST 100;
sekarang ketika saya memanggil fungsi
SELECT save_book('(179,the art of war,fiction,{190,220})'::book);
saya mendapatkan kesalahan
ERROR: malformed array literal: "{190"
SQL state: 22P02
Character: 18
saya tidak mengerti karena saya tidak melihat kesalahan dalam format array, ada bantuan?
ave_book((179,the art of war,fiction,'{190,220}')::book
. Baris yang dibangun tidak membutuhkan tanda kutip.ERROR: syntax error at or near "art"
ave_book((179, 'the art of war', 'fiction', '{190,220}')::book
, seperti yang dikatakan Andriy.Jawaban:
Hal semacam ini menjadi rumit. Saya sedang mengerjakan beberapa proyek terkait saat ini. Tweak dasarnya adalah PostgreSQL menggunakan format yang menggunakan tanda kutip ganda secara internal dalam representasi tuple untuk mewakili nilai literal, jadi:
harus bekerja. Intinya trik yang rapi adalah membuat csv dan menyertakan pengidentifikasi tuple atau array. Masalah besar adalah bahwa Anda harus berurusan dengan melarikan diri (menggandakan penawaran di setiap level sesuai kebutuhan). Jadi yang berikut ini persis sama:
Pendekatan kedua adalah menggunakan konstruktor baris:
Solusi pertama memiliki keuntungan yang jelas karena dapat memanfaatkan kerangka kerja pemrograman yang ada untuk pembuatan dan pelepasan CSV. Yang kedua adalah terbersih dalam SQL. Mereka dapat dicampur dan dicocokkan.
sumber
Jika Anda pernah bertanya-tanya tentang sintaks yang benar untuk tipe baris, tanyakan pada Postgres. Seharusnya tahu:
Yang akan mengembalikan representasi teks dari baris Anda dalam format yang valid:
Nilai kolom direpresentasikan sebagai daftar tanpa tanda kutip, dipisahkan oleh koma, terlampir dalam paragraf.
Kutipan ganda digunakan di sekitar nilai, jika ada ambiguitas - termasuk teks dengan spasi putih. Sementara dalam kasus khusus ini tanda kutip ganda di sekitar
"the art of war"
adalah opsional, tanda kutip ganda sekitar"{190,220}"
diperlukan untuk sebuah array.Lampirkan string dalam tanda kutip tunggal, modifikasi, dan uji:
Fungsi ditinjau
Pertimbangkan apa yang kita diskusikan dalam pertanyaan terkait sebelumnya:
Masalah dengan tipe komposit dalam fungsi UPSERT
Sebuah terpisah blok (
BEGIN .. END;
) hanya berguna jika Anda ingin menangkapEXCEPTION
sebuahINSERT
kekuatan kenaikan gaji. Karena sebuah blok dengan pengecualian membawa beberapa overhead, masuk akal untuk memiliki blok terpisah yang mungkin tidak pernah dimasukkan:Lain, sederhanakan :
Saya juga menyederhanakan
INSERT
pernyataan Anda . Aman untuk menghilangkan daftar kolom dari INSERT dalam kondisi tertentu.sumber
Sementara saya tidak melihat keuntungan nyata dari solusi Anda, maksud saya melewati baris ke fungsi alih-alih melewati nilai individual seperti pada
Bagaimanapun, solusi Anda juga berfungsi jika Anda memanggil fungsi dengan benar:
Artinya, ekspresi rekaman tidak perlu mengutip, sedangkan nilai teks dan array literal lakukan.
sumber