Comment faire un insert avec plusieurs lignes dans Informix SQL?
Je veux insérer plusieurs lignes avec une seule instruction insert.
Le code suivant insère une ligne, et fonctionne très bien:
create temp table mytmptable
(external_id char(10),
int_id integer,
cost_amount decimal(10,2)
) with no log;
insert into mytmptable values
('7662', 232, 297.26);
select * from mytmptable;
J'ai essayé de changer l'insert pour cela, mais il donne une erreur de syntaxe:
insert into mytmptable values
('7662', 232, 297.26),
('7662', 232, 297.26);
Est-il un moyen de le faire fonctionner, ou dois-je besoin d'exécuter de nombreux insère à la place?
OriginalL'auteur Highly Irregular | 2012-09-09
Vous devez vous connecter pour publier un commentaire.
Que vous l'avez trouvé, vous ne pouvez pas utiliser plusieurs listes de valeurs en une seule instruction INSERT avec Informix.
La solution la plus simple est d'utiliser plusieurs instructions INSERT, chacun avec une seule liste de valeurs.
Si vous êtes en utilisant une API comme ESQL/C et vous êtes préoccupé par la performance, alors vous pouvez créer une INSERTION du curseur et de l'utiliser à plusieurs reprises. Cela permet d'économiser jusqu'les inserts jusqu'à ce qu'un tampon est plein, ou vous rincer ou de fermer le curseur:
Les variables
v1
,v2
,v3
d'accueil sont des variables pour stocker la chaîne de caractères et de chiffres pour être inséré.(Vous pouvez éventuellement utiliser
$ FLUSH c;
dans la boucle si vous le souhaitez). Parce que cette mémoire, les valeurs, c'est assez efficace. Bien sûr, vous pouvez aussi tout simplement utiliser$ EXECUTE p USING :v1, :v2, :v3;
dans la boucle; qui renonce à la par-ligne de préparation de la déclaration, trop.Si vous n'avez pas l'esprit de l'écriture prolixe SQL, vous pouvez utiliser de l'UNION technique proposée par Matt Hamilton, mais vous aurez besoin d'une clause from dans chaque SÉLECTIONNEZ avec Informix. Vous pouvez spécifier:
FROM "informix".systables WHERE tabid = 1
, ouFROM sysmaster:"informix".sysdual
, ouDans mes bases de données, j'ai une table
dual
avec une seule ligne, ou un synonymedual
qui est un synonyme desysmaster:"informix".sysdual
. Vous pouvez vous en sortir sans le"informix".
partie de ces déclarations, si la base de données est "normale"; le nom du propriétaire est crucial si votre base de données Informix MODE ANSI base de données.OriginalL'auteur Jonathan Leffler
Vous pouvez toujours faire quelque chose comme ceci:
Assez sûr que c'est le standard SQL et travailler sur Informix (la table dérivée est nécessaire pour Informix pour accepter
UNION ALL
dansINSERT .. SELECT
consolidés).Oh wow. Ok - je vais quitter cette réponse ici dans le cas où il aide quelqu'un à l'aide d'une autre base de données Informix avec un problème similaire.
Même quand j'ai ajouté une clause from, je n'ai pu le faire fonctionner avec un select, et non pas d'un insert. C'est peut-être parce que je suis en utilisant une couche supplémentaire sur le dessus de la base Informix fonctionnalité, donc peut-être que la couche supplémentaire est la question. Il peut travailler pour les autres?
J'ai mis à jour la réponse de travailler sur Informix
OriginalL'auteur Matt Hamilton
Vous pouvez également insérer plusieurs lignes en stockant les valeurs dans un fichier externe et de l'exécution de l'instruction suivante dans dbaccess:
Cependant, les valeurs doivent être séparées par un symbole"|", ou ce que vous définissez la DBDELIMITER variable d'environnement.
Si vous utilisez le tube séparateur, les données dans votre fichier externe ressemblerait à:
NOTER que les données dans le fichier externe doit être correctement mis en forme, ou de la possibilité de conversion pour réussir à être insérée dans chaque mytmptable.colonne de type de données.
OriginalL'auteur Frank R.
Dans certaines versions de Infomix vous pouvez construire une table virtuelle à l'aide de la
TABLE
mot-clé suivi par une valeur de l'un desCOLLECTION
types de données, comme unLIST
collection. Dans votre cas, utilisez unLIST
de valeurs deUnnamed Row
type à l'aide de laROW(...)
constructeur de syntaxe.La création d'un
TABLE
deCOLLECTION
valeurhttp://www.ibm.com/support/knowledgecenter/SSGU8G_11.50.0/com.ibm.sqls.doc/ids_sqs_1375.htm
ROW(...)
de la construction de la syntaxe, pour les littéraux deUnnamed Row
type de donnéeshttp://www.ibm.com/support/knowledgecenter/SSGU8G_11.50.0/com.ibm.sqlr.doc/ids_sqr_136.htm
Exemple:
Ci-dessus, les types de données sont implicites de la valeur, mais si nécessaire, vous pouvez convertir explicitement la valeur de chaque type de données souhaité dans la ligne du constructeur, comme suit:
row(?::int, ?::text)
.OriginalL'auteur TCC