La fonction dont vous disposez devrait plutôt être :
CREATE FUNCTION insertdata(varchar(10),varchar(40))
RETURNS VOID AS
$$
INSERT INTO mahasiswa(col_name1, col_name2)
VALUES ($1,$2);
$$
LANGUAGE sql STRICT;
-
Ne citez pas le nom de la langue. C'est un identifiant.
-
Fournissez toujours une liste cible avec des instructions persistantes. Sinon, si vous modifiez ultérieurement la définition de la table, la fonction peut se comporter de manière inattendue.
-
Ne jamais utiliser
char(n)
, sauf si vous savez ce que vous faites. J'utiliserais simplementtext
.
Pour insérer plusieurs lignes , vous pouvez prendre un tableau de type composite ou deux tableaux avec le même nombre d'éléments à désimbriquer en parallèle. Démonstration de ce dernier :
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;
Appel :
SELECT insertdata ('{1234567890,0987654321}', '{Nahrun,Hartono}');
Je préfère utiliser une fonction plpgsql et vérifier que le nombre d'éléments est le même dans les deux tableaux pour éviter les erreurs. Utilisez array_length(arr1, 1)
...
Postgres 9.4 ou version ultérieure...
... a introduit une nouvelle variante de désimbrication qui accepte plusieurs tableaux en parallèle - sans les bizarreries du hack ci-dessus (ne prend jamais par défaut un CROSS JOIN
)
INSERT INTO mahasiswa(col_name1, col_name2)
SELECT * FROM unnest(_arr1, _arr2); -- must be in FROM list