Questions de base utilisant Oracle SQL et JSLJe fais actuellement des tests pour voir dans quelle mesure JMP 13 et Oracle (12c) peuvent fonctionner ensemble. Ma fin de partie consiste à importer des données Oracle à l'aide de requêtes SQL dans JMP, à exécuter une analyse sur les données, puis à renvoyer les données dans la base de données Oracle tout en supprimant la table d'origine. J'ai réussi à importer des données dans JMP, mais j'ai des problèmes pour enregistrer la table de données dans Oracle. Voici ce que j'ai jusqu'à présent et ce que je pense que la commande drop the table devrait être (actuellement commentée):
constring = ("DSN=***; UID=****; PWD=****);
dt1 = Ouvrir la base de données(constring,"select * from test1","test1");
dt1 << enregistrer la base de données(constring,"test2");
//ouvrir la base de données (constring,"Drop table test1");
Lorsque je l'exécute, la table "test1" apparaît avec les données correctes, mais les erreurs "sauvegarder la base de données" sortent avec l'erreur suivante :
Send attend un objet inscriptible dans l'accès ou l'évaluation de 'Send' , dt1 << /*###*/save database( constring, "test2" ) /*###*/
Dans le script suivant, erreur marquée par /*###*/
dt1 << /*###*/save database( constring, "test2" ) /*###*/
{}
J'utilise ce document ( https://www.jmp.com/content/dam/jmp/documents/en/white-papers/wp-jmp-odbc-102427.pdf ) comme référence principale et je pense que cela ressemble à l'exemple, mais quelque chose ne va clairement pas.
Qu'est-ce que je fais de mal avec la fonction "sauvegarder la base de données" et la commande de suppression de table fonctionnera-t-elle ?
Re : Questions de base utilisant Oracle SQL et JSLOK, voici du code que j'ai bricolé à partir d'un système de production. Les noms ont été changés pour protéger les innocents et tout ça.
dt = New Table( "Example", Add Rows( 3 ),
New Column( "ID", Numeric, "Continuous", Format( "Best", 12 ),
Set Values( [1, 2, 3] ) ),
New Column( "Zip Code", Numeric, "Continuous", Format( "Best", 12 ),
Set Values( [12345, 19117, 10111] ) ),
New Column( "Order Amount", Numeric, "Continuous", Format( "Currency", "USD", 17, 2 ),
Set Values( [56.25, 34.11, 14.72] ) )
);
// Come up with a unique temporary table name
unique_table_name = "TMP_" || right(char(today()), 5) || "_" ||
substitute(left(char(tick seconds()), 9), ".", "_");
dbc = create database connection(<INSERT your="" parameters="" here="">);
max_inserts = 200;
nr = nrows(dt);
// Use a series of INSERT ALL INTO statements, which have good performance
sql_statement = evalinsert(
"CREATE TABLE ^unique_table_name^ (
id NUMBER,
zipcode NUMBER,
ORDER_AMOUNT NUMBER)");
//show(sql_statement);
execute sql(dbc, sql_statement);
sql_statement = "INSERT ALL ";
for (i = 1, i <= nr, i++,
one_id = dt:id[i];
one_zip = dt:zip code[i];
one_amt = dt:Order Amount[i];
sql_statement = sql_statement || evalinsert(
" INTO ^unique_table_name^ (ID, ZIPCODE, ORDER_AMOUNT)
VALUES(^one_id^, ^one_zip^, ^one_amt^) ");
if (mod(i, max_inserts) == 0,
// Weird - INSERT ALL INTO requires a SELECT statement at the end - use a dummy one
sql_statement = sql_statement || " SELECT 1 FROM DUAL";
// show(sql_statement);
execute sql(dbc, sql_statement);
sql_statement = "INSERT ALL ";
);
);
// See if there's anything left to do
if (sql_statement != "INSERT ALL ",
sql_statement = sql_statement || " SELECT 1 FROM DUAL";
// show(sql_statement);
execute sql(dbc, sql_statement);
);
close database connection(dbc);
</INSERT>
Re : Questions de base utilisant Oracle SQL et JSLHum ... intéressant. Je peux réellement créer les tables en me connectant à oracle, mais j'aimerais que cela fonctionne et le DBA n'a pas été extrêmement utile jusqu'à présent. Si j'essaie simplement d'insérer les enregistrements, comment puis-je le configurer pour parcourir les enregistrements de la table JMP afin de les insérer ? Par exemple, disons que j'ai une table dans JMP avec 100 enregistrements et 3 colonnes (ID, code postal, montant de la commande). Comment puis-je prendre ce que vous venez d'écrire et insérer ces enregistrements dans la table d'Oracle ?
Re : Questions de base utilisant Oracle SQL et JSLVous avez besoin des autorisations appropriées pour pouvoir créer des tables dans ce schéma particulier. Si ce n'est pas possible, peut-être que cette approche fonctionnerait:
Demandez à votre administrateur de base de données de créer la deuxième table et de vous donner les privilèges de lecture, d'écriture et de suppression.
Utiliser SUPPRIMER DE pour supprimer des enregistrements, MISE À JOUR pour modifier des enregistrements existants, ou INSÉRER DANS pour ajouter de nouveaux enregistrements.
Si vous faites beaucoup d'INSERTS, cela peut être assez lent. Je suis tombé sur INSERT ALL qui peut considérablement accélérer le processus. J'ai découpé un grand nombre d'inserts en 200 inserts par morceau et j'ai vu de grandes diminutions dans le temps. Voici un exemple. Notez que vous avez besoin de "SELECT * FROM DUAL" à la fin pour une raison quelconque.
INSERT ALL
INTO mytable (column1, column2, column_n) VALUES (expr1, expr2, expr_n)
INTO mytable (column1, column2, column_n) VALUES (expr1, expr2, expr_n)
INTO mytable (column1, column2, column_n) VALUES (expr1, expr2, expr_n)
SELECT * FROM dual;
Re : Questions de base utilisant Oracle SQL et JSLMerci pour l'information et l'aide à tous. Il semble que je devrai parler à mon administrateur de base de données et voir s'il existe une option qui me donnera un accès en écriture sur ma connexion ODBC. Merci encore!
Re : Questions de base utilisant Oracle SQL et JSLIl est en fait très courant de ne pouvoir interroger que la base de données, mais pas d'en modifier le contenu.
Re : Questions de base utilisant Oracle SQL et JSLMalheureusement, cela n'a pas fonctionné. J'ai créé les tables que j'essaie de référencer dans mon propre schéma. Est-il possible que la connexion ODBC puisse avoir un accès en sélection, mais pas un accès en écriture ? (Désolé, je ne sais pas vraiment comment fonctionne la connexion ODBC.)
Re : Questions de base utilisant Oracle SQL et JSLVous pouvez essayer d'insérer une instruction Wait(0) après Open Database :
dt1 = Open Database(...);
Wait(0);
dt1 << Save Database(...);
Je doute que cela aide, car le show(dt1) montre qu'il sait qu'il s'agit d'une table de données.
Si vous ouvrez simplement un exemple de table de données, dites Grande classe , de manière interactive, puis, à partir du script, faites :
Current Data Table() << Save Database(...);
Est-ce que ça marche ? Cela établirait que vous avez la permission d'écrire.
Éric
Re : Questions de base utilisant Oracle SQL et JSLOups, en quelque sorte manqué ce ci-dessus. Tu l'as fait. Êtes-vous sûr d'avoir des privilèges d'écriture sur cette base de données ?Re : Questions de base utilisant Oracle SQL et JSLAvez-vous spécifié le nom du schéma avec le nom de la table à enregistrer ? Un exemple:
dt << Enregistrer la base de données("DSN=MyConnectionInfo", "SchemaName.BigClass");
Brian Corcoran
Développement JMP
Re : Questions de base utilisant Oracle SQL et JSLJe l'ai changé un peu, en essayant de mettre les points sur mes i et de croiser mes t. Voici mon code jsl et la sortie du journal :
Code JSL
constring = ("DSN=***; UID=***; PWD=***");
dt1 = Ouvrir la base de données(constring,"SELECT * FROM UID.TEST", "TEST1");
afficher(dt1);
dt1 << enregistrer la base de données (constring,"UID.TEST1");
Sortie du journal :
Informations de connexion à la base de données :
DSN=*** ; UID=*** ;
dt1 = DataTable("TEST1");
Informations de connexion à la base de données :
DSN=*** ; UID=*** ;
Inscriptible[]
Rien n'est trop petit à ce stade, si quelque chose semble louche, faites-le moi savoir. Sinon, si vous pouvez l'exécuter, je suis coincé à me demander si c'est mon ODBC d'une manière ou d'une autre.
Re : Questions de base utilisant Oracle SQL et JSLHé, Beastwood,
Eh bien, je suis perplexe, car j'ai imité exactement votre script sur JMP 13 avec Oracle et cela a bien fonctionné, y compris le DROP TABLE :
connstr = "DSN=Oracle Striper Replacement;UID=***;PWD=***;DBQ=EXADAT12C ;DBA=W;APA=T;EXC=F;FEN=T;QTO=T;FRC=10;FDL=10;LOB=T;RST=T;BTD=F;BNF=F;BAM=IfAllSuccessful;NUM=NLS;DPM=F;MTS=T;MDI=F;CSR=F;FWC=F;FBS=64000;TLO=O;MLD=0;ODA=F;";
dt1 = Open Database(
connstr,
"SELECT * FROM \!"SQBTEST\!".\!"BigTest3\!"",
);
dt1 << Save Database(connstr, "SQBTEST.BigTest4");
Open Database(
connstr,
"DROP TABLE \!"SQBTEST\!".\!"BigTest3\!""
);
La seule fois où j'ai reçu le message "Envoyer attend un objet scriptable", c'était une fois où j'avais le mauvais nom de table dans la fonction Ouvrir la base de données et donc l'ouverture a échoué.
Peut-être jeter un:
show(dt1);
entre les appels Ouvrir la base de données et Enregistrer la base de données et assurez-vous que dt1 semble correct. Cela devrait ressembler à ceci dans le journal JMP :
dt1 = DataTable("SQL Results 3");
HTH,
Éric