Informix: Comment passer, d'utilisation et d'exécuter plusieurs valeurs dans un seul paramètre à une procédure stockée
Comment je Peux passer plusieurs valeurs dans un seul paramètre à une procédure stockée dans Informix?.
C'est une question fréquente, mais j'ai vu avez rien à propos de informix.
J'ai trouvé un post, mais il ne fonctionne pas pour moi, devrait être la version de la DB ou ai-je raté quelque chose?
Je suis en train d'effectuer un WHERE X IN (SELECT Y FROM TABLE(PARAM))
Edit:
Ceci est un exemple de ce que Im essayant de faire.
CREATE PROCEDURE test_hector
(
C LIST( SET (CHAR(10) NOT NULL ) NOT NULL)
)
RETURNING CHAR(10) AS C, CHAR(10) AS CVE, CHAR(50) AS DESC;
DEFINE vColumna like tclaves.columna;
DEFINE vClave like tclaves.clave;
DEFINE vdescve like tclaves.descve;
FOREACH
select columna, clave, descve
INTO vColumna, vClave,vdescve
from tclaves
where columna in (SELECT * FROM TABLE(C))
RETURN vColumna, vClave,vdescve WITH RESUME;
END FOREACH
END PROCEDURE;
Je suis en train de l'exécuter, mais je pense que je vais avoir sintax problèmes
EXECUTE PROCEDURE test_hector( '{stspols,stsrepo}');
J'obtiens le message d'erreur [Informix][Informix ODBC Driver][Informix]Invalid collection literal value.
J'ai exécuté cette fonction execute function se_release()
pour obtenir la version informix c'est ce que j'ai.
column1
Spatial DataBlade Release 8.21.FC4R1 (Build 238) Compiled on Thu Aug 26 19:42:55 CDT 2010 with: IBM Informix Dynamic Server Version 10.00.FC7 glslib-4.00.UC10
Je suis en utilisant Aqua Data Studio 8.0.22
de créer et d'exécuter la procédure. Runinng sur Windows 7 Ultimate 32-Bits
Merci à l'avance. Pour toute aide
Vous devez vous connecter pour publier un commentaire.
Définir le type de paramètre d'un type de collection: LISTE, ENSEMBLE, MULTISET (qui est ce que j'ai dit dans la réponse de la croix-référencé question).
Merci pour l'amplification de la question. Vous dites:
Cela peut être un simple problème à résoudre qu'il n'y paraît sur la surface. Le type d'entrée de la procédure est censé être une collection — en fait, une LISTE de DÉFINIR des valeurs — où chaque valeur est une chaîne de caractères. Vous pouvez écrire que:
J'ai créé moi-même un mannequin de la procédure de test de cette syntaxe:
Et la sortie de, elle a été comme prévu:
Noter que Informix prend en charge un commentaire du style a commencé par
{
et s'est terminée par la première suivantes}
. Cependant, cette observation style est supprimé lorsque le mot-clé avant de la{
est l'un des JEU de, MULTISET ou de la LISTE (et oui, c'est vraiment difficile à analyser!). Vous pouvez avoir un immense (si perverti) amusez-vous avec "où pouvez-vous ajouter le{}
dans SQL ci-dessus" sans en changer le sens. Il y a une petite chance qu'une API peut reconnaître Informix{}
commentaires, mais ne pas reconnaître la collection d'exception. Dans ce cas, vous auriez probablement obtenir à nouveau une erreur de syntaxe (car la deuxième}
n'est pas prévu si vous interpréter la première{
comme un début symbole de commentaire). Dans ce cas, utilisez l'une des mentions ci-dessous.La notation de la collection (ENSEMBLE, MULTISET, LISTE) littéraux évolué au fil du temps. Cette alternative notation fonctionne aussi (et est plus étroitement liée à ce que vous avez essayé à l'origine, et est ce qui a été documenté à l'origine):
Les cordes à l'intérieur de l'ENSEMBLE doivent être entourées de guillemets, mais l'ensemble littérale est elle-même une chaîne de caractères, de sorte que vous devez doubler les incorporés de citations. Vous pouvez aussi envie de tricher et d'utiliser les guillemets doubles et les guillemets simples:
De la discussion ci-dessous, et comme décrit dans l'alternative la réponse, le problème semble être lié à la les collections imbriquées. Un
LIST{SET{"str1", "str2"}}
est une liste ordonnée (avec une entrée dans celui-ci); que l'entrée est elle-même un ensemble de (distinctes) les chaînes de caractères, qui n'a pas d'ordre particulier. Vous pouvez utiliser une MULTISET si vous avez besoin pour être en mesure de répéter des chaînes de caractères (mais l'ordre n'est pas important). Vous utilisez une LISTE est l'ordre est important (et les doublons sont autorisés dans une liste).Il semble que si vous avez vraiment besoin de choisir le type d'argument, de sorte que c'est plus simple. Vous devriez être en mesure d'utiliser n'importe quel type de collection efficacement; je serais probablement nommer DÉFINIE de sorte que vous n'avez pas à traiter avec la répétition des chaînes dans la liste, mais MULTISET ou de la LISTE sont également des options valides. Avec une procédure renommé
test_3()
:J'ai été en mesure d'exécuter deux instructions suivantes, avec les résultats présentés:
C'était à l'aide d'un ESQL/C de l'interface. Vous devriez être en mesure d'obtenir la deuxième à travailler avec ODBC; la première peut provoquer une -201 erreur de syntaxe.
Si vous préférez LISTE, puis changement à la LISTE dans le code ci-dessus:
EXECUTE PROCEDURE test_hector(LIST{SET{'stspols','stsrepo'}});
jette[Informix][Informix ODBC Driver][Informix]A syntax error has occurred.
. Wriitten comme ceEXECUTE PROCEDURE test_hector('LIST{SET{''stspols'',''stsrepo''}}');
jette ` [Informix][Pilote Informix ODBC][Informix]Pas encore mis en œuvre. sqlerrm(=tout, !=tout, tout =ou !=toutes les Collections) " et de cette façon 'EXÉCUTER la PROCÉDURE test_hector('LIST{SET{"stspols","stsrepo"}}'); " lance[Informix][Informix ODBC Driver][Informix]Not implemented yet. sqlerrm(=any, !=any, =all, or !=all for Collections)
🙁{
comme le début du commentaire. Le second échec ressemble à la syntaxe obtenu grâce, mais quelque chose n'allait pas la traiter. À ce stade, je ne suis pas sûr de savoir si c'est un ODBC problème ou un problème de serveur. Je soupçonne que j'avais besoin de mettre à jour ma mère pour votre procédure stockée, donc il tente d'accéder aux données à partir de la liste des ensembles de chaînes de caractères, et de voir ce qui se passe. Avez-vous essayé mon super-simple procédure? Il l'a fait jeter des erreurs?where columna in (SELECT * FROM TABLE(C))
, merci encore pour votre aide précieuse!where columna in (SELECT * FROM TABLE(C))
SELECT * FROM TABLE(LIST{SET{'stspols','stsrepo'}})
et il retourneunnamed_col_1 (null)
:/SELECT * FROM TABLE(LIST{'stspols','stsrepo'})
unnamed_col_1 stspols stsrepo
, devrais-je essayer une autre façon de passer plusieurs valeurs du paramètre ou de les déclarer de manière différente ou quelque chose?List and List{SET
Je l'ai essayé dans un autre chemin et trouvé une solution.
J'ai modifié la procédure d'accepter un paramètre comme un
List
, pas unList{SET...
Et de l'exécution de cette manière.
Ou de cette façon
Et cela a fonctionné comme un charme.