PostgreSQLの関数を使用してテーブルに複数の行を挿入したい。
これは私のテーブルです
CREATE TABLE mahasiswa
(
nim CHAR(10),
nama VACHAR(40)
CONSTRAINT pk_nim PRIMARY KEY (nim)
)
;
これが私が作成した関数です
CREATE FUNCTION insertdata(CHAR(10),varchar(40))
RETURNS VOID AS
$$
INSERT INTO mahasiswa VALUES ($1,$2);
$$
LANGUAGE 'sql';
このような関数を呼び出すと
SELECT insertdata ('1234567890','Nahrun'),
('0987654321','Hartono');
1行だけが挿入されます。
一度に複数の行を挿入するように関数を変更するにはどうすればよいですか?
あなたが持っている機能は、むしろ次のようになります。
CREATE FUNCTION insertdata(varchar(10),varchar(40))
RETURNS VOID AS
$$
INSERT INTO mahasiswa(col_name1, col_name2)
VALUES ($1,$2);
$$
LANGUAGE sql STRICT;
言語名を引用しないでください。それは識別子です。
永続化されたステートメントを含むターゲットリストを常に提供します。そうしないと、後でテーブル定義を変更した場合、関数が予期しない方法で動作する可能性があります。
char(n)
何をしているのかわからない場合は、絶対に使用しないでください。私はただ使用しますtext
。
複数の行を挿入するには、複合型の配列または同じ数の要素を持つ2つの配列を使用して、並列にネストを解除します。後者のデモンストレーション:
CREATE FUNCTION insertdata(_arr1 text[], _arr2 text[])
RETURNS VOID AS
$$
INSERT INTO mahasiswa(col_name1, col_name2)
SELECT unnest(_arr1), unnest(_arr2);
$$
LANGUAGE sql STRICT;
コール:
SELECT insertdata ('{1234567890,0987654321}', '{Nahrun,Hartono}');
間違いを防ぐために、plpgsql関数を使用して、両方の配列で要素の数が同じであることを確認したいと思います。使用array_length(arr1, 1)
...
...複数の配列を並行して受け入れるunnestの新しいバリアントを導入しました-上記のハックの癖なしで(デフォルトでは決してCROSS JOIN
)
INSERT INTO mahasiswa(col_name1, col_name2)
SELECT * FROM unnest(_arr1, _arr2); -- must be in FROM list
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加