Comment exécuter plusieurs requêtes SQL en parallèle, attendre la fin et obtenir la liste des tables de donnéesSalut,
J'aimerais avoir une fonction qui (i) exécute plusieurs requêtes SQL en arrière-plan (instructions de connexion et SQL à partir de listes de chaînes de longueurs arbitraires), (ii) attend que toutes les requêtes soient terminées et (iii) renvoie une liste de tables de données. . Veuillez trouver mon code ci-dessous. Je ne sais pas comment rassembler correctement les tableaux de données.
Merci d'avance.
Run_SQL_Queries = Fonction({o_connections, o_sqls},
i_dts = Liste();
Pour(i_counter = 1, i_counter <= N Items(o_connections), i_counter++,
i_dt = Vide();
i_connection = o_connections[i_counter];
i_sql = o_sqls[i_counter];
requête = Nouvelle requête SQL (
Connexion(i_connexion),
SQL personnalisé (i_sql)
) << Exécuter en arrière-plan(OnRunComplete(i_dt = queryResult));
Insérer dans (i_dts, i_dt);
);
Retour(i_dts);
);
Automatisation et scriptsAccès aux donnéesRe : Comment exécuter plusieurs requêtes SQL en parallèle, attendre la fin et obtenir la liste des tables de donnéesJe ne sais pas si vous pouvez créer une telle fonction dans JMP. Vous devrez peut-être utiliser << OnRunComplete dans votre << Run Background et effectuer tout ce que vous faites, une fois que toutes les requêtes sont prêtes, en utilisant cela.
Re : Comment exécuter plusieurs requêtes SQL en parallèle, attendre la fin et obtenir la liste des tables de donnéesMalheureusement, JMP ne fournit qu'un seul thread d'exécution pour JSL.Pour mon entreprise, je contourne cette limitation et fais exactement ce que vous voulez faire en utilisant une session Python persistante.Je lance la session Python depuis JMP, qui a un hook lorsque le tampon STDOUT n'est pas vide, et en Python, je démarre un serveur localhost et j'attends les commandes.Ensuite, dans JMP, je peux me connecter au serveur localhost et envoyer des messages.Python effectuera ensuite, en parallèle, les tâches assignées (qu'il s'agisse de SQL, de transferts de fichiers ou de tout ce qui est nécessaire) et disposera d'instructions d'impression spéciales une fois terminées, fermant ainsi la boucle et permettant à JMP de savoir quand les requêtes sont terminées.
Pour SQL, Python enregistre les résultats dans un fichier temporaire, puis JMP peut simplement lire le fichier.
C'est un petit détour, mais pas beaucoup plus difficile que si JMP fournissait un moyen d'exécution simultanée ou asynchrone.
Cela fonctionne plutôt bien et le ralentissement dû à l'IPC n'est pas perceptible.
Re : Comment exécuter plusieurs requêtes SQL en parallèle, attendre la fin et obtenir la liste des tables de donnéesJe fais quelque chose de similaire depuis un moment.J'exécute plusieurs requêtes simultanément, puis j'effectue des opérations sur les tables.J'ai adapté ma solution à votre application.Ce n'est pas joli, mais j'ai essayé de nombreuses autres méthodes dans JMP, et rien d'autre n'a accompli ce que je voulais.
Names Default To Here( 1 );
o_connections = {....Connection List....};
o_sqls = {....Query List....};
::i_dts = {};
Run_SQL_Queries = Function( {o_connection, o_sql, i_counter},
{Default Local},
Eval(
Eval Expr(
Expr(
Parse( "::i_dt" || Char( i_counter ) || " = Empty()" )
);
New SQL Query( Connection( o_connection ), Custom SQL( o_sql ) ) << Run Background(
OnRunComplete(
Expr(
Parse( "::i_dt" || Char( i_counter ) || " = QueryResult;" )
);
Insert Into( ::i_dts, QueryResult )
;
)
);
)
)
);
For( i=1, i<=N Items(o_connections), i++, Run_SQL_Queries( o_connections[i], o_sqls[i], i ) );
For( i = 1, i <= N Items( o_connections ), i++,
Eval( Parse( "While(!Is Scriptable(::i_dt" || Char( i ) || "), Wait(.5))" ) )
);
Show( ::i_dt1, ::i_dt2, ::i_dts );