Écriture du jeu de résultats de la table de données dans la table Oracle existante<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />Salut,
Je suis très nouveau dans les scripts JMP. J'ai créé un script pour lire à partir d'une table Oracle. Il applique un Fit_Model aux données (impossible de le répliquer dans Oracle, d'où le besoin de JMP) et souhaite le réécrire dans Oracle.
Pour le moment, j'utilise dt3<
Cela crée la table, mais j'aurais vraiment besoin de pouvoir INSÉRER DANS une table existante au lieu de créer une nouvelle table.
Toute aide serait grandement appréciée, car je dis que je suis nouveau dans le script JMP et que je ne trouve pas de réponse dans le manuel de JMP Script.
Merci,
Re : Écriture d'un ensemble de résultats de table de données dans une table Oracle existanteJe voulais juste mettre à jour ce fil avec de nouvelles informations.J'essayais de faire plusieurs insertions (~ 8000) dans une table Oracle et j'ai rencontré des problèmes de performances lors de l'insertion d'un enregistrement à la fois.Le "truc" consiste à utiliser le INSÉRER LE TOUT DANS commande.Le code ci-dessous insère 200 enregistrements à la fois.
dt = tableau de données ( "Données aléatoires" ) ;
dsn_string = "Driver={Oracle in OraClient11g64} ;Dbq= ;UID= ;PWD= ;" ;
dbc = créer une connexion à la base de données ( dsn_string ) ;
instruction_sql =
"\[CRÉER TABLE .FYI_RANDOM
(NUMÉRO D'IDENTIFICATION,
NOMBRE RAND_INTEGER,
RAND_NUMBER NOMBRE,
RAND_DATETIME DATE,
RAND_STRING VARCHAR2(80))]\" ;
exécuter sql ( dbc , instruction_sql ) ;
// Supprimer des lignes de la table (pour des tests répétés)
exécuter sql ( dbc , "tronquer la table .fyi_random" ) ;
t2 = Cochez les secondes () ;
max_inserts = 200 ; // Faire 200 insertions à la fois
instruction_sql = « TOUT INSÉRER » ;
pour ( je = 1 , je <= nrows ( dt ) , je ++,
idc = dt : identifiant [ je ] ;
rand_integerc = dt : rand_entier [ je ] ;
nombre_randc = dt : nombre_rand [ je ] ;
rand_datetimec = format ( dt : rand_datetime [ je ] , "m/j/aa:m:s" ) ;
rand_stringC = dt : chaîne_rand [ je ] ;
instruction_sql = instruction_sql || evalinsert (
" DANS .FYI_RANDOM(ID, RAND_INTEGER, RAND_NUMBER, RAND_DATETIME, RAND_STRING)
VALEURS(^idc^, ^rand_integerc^, ^rand_numberc^,
to_date('^rand_datetimec^', 'MM/DD/YYYY HH:MI:SS AM'),
'^rand_stringc^')
" ) ;
si ( mode ( je , max_inserts ) == 0 ,
// Bizarre - INSERT ALL INTO nécessite une instruction SELECT à la fin - utilisez une instruction factice
instruction_sql = instruction_sql || "SÉLECTIONNER 1 DE DOUBLE" ;
exécuter sql ( dbc , instruction_sql ) ;
instruction_sql = « TOUT INSÉRER » ;
) ;
si ( mode ( je , 200 ) == 0 ,
légende ( "Inséré" || carboniser ( je ) || "enregistrements" ) ;
attendez ( 0 ) ;
) ;
) ;
// Voir s'il reste quelque chose à faire
si ( instruction_sql != « TOUT INSÉRER » ,
exécuter sql ( dbc , instruction_sql ) ;
) ;
fermer la connexion à la base de données ( dbc ) ;
t1 = tick secondes () ;
imprimer ( t1 - t2 ) ;
légende ( retirer ) ;
attendez ( 0 ) ;
Le INSÉRER LE TOUT DANS La commande n'est en fait pas si nouvelle - les exemples que j'ai trouvés en ligne montrent qu'elle fonctionne dans Oracle 9. Voici quelques liens avec plus d'informations :
https://www.techonthenet.com/oracle/questions/insert_rows.php
sql - La meilleure façon de faire une insertion multi-lignes dans Oracle ? - Débordement de pile
Re : Écriture d'un ensemble de résultats de table de données dans une table Oracle existanteCela a fonctionné !!
Merci beaucoup pour toute votre aide, j'apprécie vraiment
Re : Écriture d'un ensemble de résultats de table de données dans une table Oracle existanteLes colonnes de votre tableau JMP sont peut-être numériques ?C'est ce qui est indiqué par le message d'erreur.Il vous manque également des guillemets simples pour certaines colonnes.Essayez d'envelopper chaque colonne avec la fonction CHAR.Si cela ne fonctionne toujours pas, imprimez votre variable sql_statement.
Tableau de données actuel ( dt ) ;
dbc = Créer une connexion à la base de données (
"DRIVER={Oracle in instantclient11_1} ;DBQ=DBASE;UID=UNAME;SPWD=PWORD ;"
) ;
Pour ( je = 1 , je <= N lignes ( dt ) , je ++,
instruction_sql = "INSERER DANS SCHEMA.TBL_TABLE " ||
"(COL1, COL2, COL3, COL4, COL5, COL6, COL7, COL8) " ||
"VALEURS(" || "'" ||
carboniser ( Colonne ( 1 )[ je ]) || "', '" || carboniser ( Colonne ( 2 )[ je ]) || "', '" ||
carboniser ( Colonne ( 3 )[ je ]) || "', '" || carboniser ( Colonne ( 4 )[ je ]) || "', '" ||
carboniser ( Colonne ( 5 )[ je ]) || "', '" || carboniser ( Colonne ( 6 )[ je ]) || "', '" ||
carboniser ( Colonne ( 7 )[ je ]) || "', '" || carboniser ( Colonne ( 8 )[ je ]) || "') " ;
imprimer ( instruction_sql ) ;
Exécuter SQL ( dbc , instruction_sql ) ;
) ;
Fermer la connexion à la base de données ( dbc ) ;
Re : Écriture d'un ensemble de résultats de table de données dans une table Oracle existanteSalut,
J'ai essayé de travailler avec cela, mais j'ai obtenu une erreur qui est apparemment due à la concaténation.
Toutes les colonnes de la table sont VARCHAR2, la concaténation semble correcte du point de vue d'un développeur Oracle.
Pourriez-vous s'il vous plaît m'aider à franchir la ligne d'arrivée ?
l'argument doit être un caractère dans l'accès ou l'évaluation de 'Concat' , Bad Argument( Column( 5 ) )
Dans le script suivant, erreur marquée par /*###*/
Table de données actuelle( dt );
dbc = Créer une connexion à la base de données(
"DRIVER={Oracle in instantclient11_1} ;DBQ=DBASE;UID=UNAME;SPWD=PWORD ;"
);
For( i = 1, i <= N Rows( dt ), i++,
sql_statement = "INSERER DANS SCHEMA.TBL_TABLE" || /*###*/
"(COL1, COL2, COL3, COL4, COL5, COL6, COL7, COL8) " || /*###*/
"VALEURS(" || /*###*/"'" || /*###*/Colonne( 1 ) || /*###*/"', " || /*###*/
"'" || /*###*/Colonne( 2 ) || /*###*/"', " || /*###*/"'" || /*###*/
Colonne( 3 ) || /*###*/"', " || /*###*/Colonne( 4 ) || /*###*/", " || /*###*/
Colonne( 5 ) || /*###*/", " || /*###*/Colonne( 6 ) || /*###*/", " || /*###*/
Colonne( 7 ) || /*###*/", " || /*###*/"'" || /*###*/Colonne( 8 ) || /*###*/
"') " /*###*/;
Exécutez SQL( dbc, sql_statement );
);
Fermer la connexion à la base de données (dbc);
Re : Écriture d'un ensemble de résultats de table de données dans une table Oracle existanteGérard,
Tu y es presque.Pour ajouter plusieurs enregistrements, vous devez effectuer une boucle sur les lignes de votre table JMP et émettre des instructions INSERT distinctes.
dt = rftmdl [ 1 ][ Boîte de table ( 3 )] << créer une table de données combinée ( "Tbl_Combiné" ) ;
tableau de données actuel ( dt ) ;
dbc = Créer une connexion à la base de données ( "DRIVER={Oracle in instantclient11_1};DBQ=DBNAME;UID=USER;SPWD=PASS;" ) ;
pour ( je = 1 , je <= nrows ( dt ) , je ++,
instruction_sql =
"INSERER DANS SCHEMA.TBL_TABLE " ||
"(col1, col2, col3, col4, col5, col6, col7, col8)" ||
"VALEURS(" ||
"'" || colonne ( 1 )[ je ] || "', " ||
"'" || colonne ( 2 )[ je ] || "', " ||
"'" || colonne ( 3 )[ je ] || "', " ||
colonne ( 4 )[ je ] || ", " ||
colonne ( 5 )[ je ] || ", " ||
colonne ( 6 )[ je ] || ", " ||
colonne ( 7 )[ je ] || ", " ||
"'" || colonne ( 8 )[ je ] || "') " ;
// JMP ajoutera un commit à l'instruction d'insertion.
Exécuter SQL ( dbc , instruction_sql ) ;
) ;
Fermer la connexion à la base de données ( dbc ) ;
Pour faire référence à une cellule de tableau individuelle, vous pouvez utiliser une syntaxe comme celle-ci :
colonne ( 1 )[ 3 ] ; // Fait référence à la cellule de la table de données actuelle, dans la première colonne, ligne 3
colonne ( dt , 5 )[ 7 ] ; // Cellule de la colonne 5, ligne 7 du tableau référencé par la variable dt
colonne ( dt , "Monde" )[ 2 ] ; // Cellule dans la colonne nommée World, ligne 2, dans la table référencée par dt.C'est la syntaxe que j'utilise le plus fréquemment
: Monde [ 2 ] ; // Cellule dans la colonne Monde, ligne 2, dans la table de données actuelle.
Bonne chance!
Pierre
Re : Écriture d'un ensemble de résultats de table de données dans une table Oracle existanteMerci beaucoup d'avoir répondu.
Avec les valeurs que j'entre, comment puis-je spécifier qu'elles proviennent de la table de données ?
J'ai essayé simplement d'utiliser la colonne (1) etc mais cela ne fonctionne pas. Je viens d'un milieu PL/SQL donc mon cerveau dit dt.column(1) mais cela ne fonctionne pas.
Pouvez-vous clarifier s'il vous plait?
dt=rftmdl[1][Table Box(3)] << make combination datatable("Tbl_Combinied");
instruction_sql =
"INSERER DANS SCHEMA.TBL_TABLE" ||
"(col1, col2, col3, col4, col5, col6, col7, col8) " ||
"VALEURS(" ||
"'" || colonne(1) || "', " ||
"'" || colonne(2)|| "', " ||
"'" || colonne(3)|| "', " ||
colonne(4)|| ", " ||
colonne(5)|| ", " ||
colonne(6)|| ", " ||
colonne(7)|| ", " ||
"'" || colonne(8) || "') " ;
dbc = Créer une connexion à la base de données("DRIVER={Oracle in instantclient11_1};DBQ=DBNAME;UID=USER;SPWD=PASS;");
// JMP ajoutera un commit à l'instruction d'insertion.
Exécutez SQL(dbc, sql_statement);
Fermer la connexion à la base de données (dbc);
De plus, si vous connaissez des liens utiles ou des guides de script JMP, toute aide est grandement acceptée.
Merci encore.
Re : Écriture d'un ensemble de résultats de table de données dans une table Oracle existanteSi vous êtes dans JMP 10, voici comment insérer un enregistrement.Notez que DSN_STRING est la chaîne de connexion à ma base de données.Notez également que la chaîne SQL doit être sur une ligne continue, sans commentaires.
instruction_sql =
"INSÉRER DANS monschéma.matable" ||
"(une_col, deuxième_col, troisième_col)" ||
"VALEURS(" ||
"'" || première_valeur || "', " ||
"'" || seconde_valeur || "', " ||
"'" || troisième_valeur || "') " ;
dbc = Créer une connexion à la base de données ( dsn_string ) ;
// JMP ajoutera un commit à l'instruction d'insertion.
Exécuter SQL ( dbc , instruction_sql ) ;
Fermer la connexion à la base de données ( dbc ) ;
// Dans JMP 8 ou 9, utilisez simplement ceci :
// Ouvrir la base de données (dsn_string, sql_statement);