Grundlegende Fragen mit Oracle SQL und JSLIch teste gerade, wie gut JMP 13 und Oracle (12c) zusammenarbeiten können. Mein Endspiel besteht darin, Oracle-Daten mithilfe von SQL-Abfragen in JMP zu importieren, eine Analyse der Daten durchzuführen und die Daten dann an die Oracle-Datenbank zurückzugeben, während die ursprüngliche Tabelle gelöscht wird. Ich konnte Daten erfolgreich in JMP importieren, habe jedoch Probleme beim Zurückspeichern der Datentabelle in Oracle. Hier ist, was ich bisher habe und was meiner Meinung nach der Befehl zum Löschen der Tabelle sein sollte (derzeit auskommentiert):
constring = ("DSN=***; UID=****; PWD=****);
dt1 = Open Database(constring,"select * from test1","test1");
dt1 << Datenbank speichern(constring,"test2");
//Datenbank öffnen (constring,"Drop table test1");
Wenn ich dies ausführe, wird die Tabelle „test1“ mit den richtigen Daten angezeigt, aber bei „Datenbank speichern“ wird folgender Fehler ausgegeben:
Send erwartet ein skriptfähiges Objekt beim Zugriff oder bei der Auswertung von „Send“, dt1 << /*###*/save Database( constring, „test2“ ) /*###*/
Im folgenden Skript ist der Fehler mit /*###*/ markiert.
dt1 << /*###*/Datenbank speichern( constring, "test2" ) /*###*/
{}
Ich habe dieses Dokument verwendet ( https://www.jmp.com/content/dam/jmp/documents/en/white-papers/wp-jmp-odbc-102427.pdf ) als meine primäre Referenz und ich denke, es sieht genauso aus wie das Beispiel, aber etwas stimmt eindeutig nicht.
Was mache ich mit der Funktion „Datenbank speichern“ falsch und funktioniert der Befehl „Tabelle löschen“?
Betreff: Grundlegende Fragen mit Oracle SQL und JSLOK, hier ist ein Code, den ich aus einem Produktionssystem zusammengeschustert habe. Namen wurden geändert, um die Unschuldigen zu schützen und so weiter.
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>
Betreff: Grundlegende Fragen mit Oracle SQL und JSLHmm, interessant. Ich kann die Tabellen tatsächlich erstellen, indem ich mich bei Oracle anmelde, aber ich würde das gerne zum Laufen bringen, und der DBA war bisher nicht besonders hilfreich. Wenn ich nur versuche, die Datensätze einzufügen, wie richte ich es so ein, dass die JMP-Tabellendatensätze durchlaufen werden, um sie einzufügen? Nehmen wir zum Beispiel an, dass ich in JMP eine Tabelle mit 100 Datensätzen und 3 Spalten (ID, Postleitzahl, Bestellmenge) habe. Wie nehme ich das, was Sie gerade geschrieben haben, und füge diese Datensätze wieder in die Tabelle in Oracle ein?
Betreff: Grundlegende Fragen mit Oracle SQL und JSLSie benötigen die entsprechenden Berechtigungen, um Tabellen in diesem bestimmten Schema erstellen zu können. Wenn das nicht möglich ist, würde vielleicht dieser Ansatz funktionieren:
Lassen Sie Ihren DBA die zweite Tabelle erstellen und Ihnen Lese-, Schreib- und Löschprivilegien dafür geben.
Verwenden LÖSCHEN VON Datensätze entfernen, AKTUALISIEREN um bestehende Datensätze zu ändern, oder EINFÜGEN IN um neue Datensätze hinzuzufügen.
Wenn Sie viele INSERTS ausführen, kann das ziemlich langsam sein. Ich bin über INSERT ALL gestolpert, was den Vorgang erheblich beschleunigen kann. Ich habe eine große Anzahl von Einlagen in 200 Einlagen pro Stück aufgeteilt und dabei große Zeitverkürzungen festgestellt. Hier ist ein Beispiel. Beachten Sie, dass Sie aus irgendeinem Grund am Ende „SELECT * FROM DUAL“ benötigen.
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;
Betreff: Grundlegende Fragen mit Oracle SQL und JSLVielen Dank für die Informationen und helfen Sie allen. Es sieht so aus, als müsste ich mit meinem DBA sprechen und sehen, ob es eine Option gibt, die mir Schreibzugriff über meine ODBC-Verbindung gewährt. Danke noch einmal!
Betreff: Grundlegende Fragen mit Oracle SQL und JSLTatsächlich kommt es sehr häufig vor, dass die Datenbank nur abgefragt, der Inhalt jedoch nicht geändert werden kann.
Betreff: Grundlegende Fragen mit Oracle SQL und JSLLeider hat das nicht funktioniert. Ich habe die Tabellen, auf die ich verweisen möchte, in meinem eigenen Schema erstellt. Ist es möglich, dass die ODBC-Verbindung zwar Auswahlzugriff, aber keinen Schreibzugriff hat? (Leider weiß ich nicht wirklich, wie die ODBC-Verbindung tatsächlich funktioniert.)
Betreff: Grundlegende Fragen mit Oracle SQL und JSLSie könnten versuchen, nach Open Database eine Wait(0)-Anweisung einzufügen:
dt1 = Open Database(...);
Wait(0);
dt1 << Save Database(...);
Ich habe meine Zweifel, dass dies helfen wird, da show(dt1) zeigt, dass es weiß, dass es sich um eine Datentabelle handelt.
Wenn Sie beispielsweise einfach eine Beispieldatentabelle öffnen Große Klasse , interaktiv und dann aus dem Skript heraus Folgendes tun:
Current Data Table() << Save Database(...);
Funktioniert es? Das würde beweisen, dass Sie über eine Schreibberechtigung verfügen.
Erik
Betreff: Grundlegende Fragen mit Oracle SQL und JSLHoppla, das oben habe ich irgendwie übersehen. Du machtest. Sind Sie sicher, dass Sie über Schreibrechte für diese Datenbank verfügen?Betreff: Grundlegende Fragen mit Oracle SQL und JSLHaben Sie den Schemanamen mit dem Namen der zu speichernden Tabelle angegeben? Ein Beispiel:
dt << Save Database("DSN=MyConnectionInfo", "SchemaName.BigClass");
Brian Corcoran
JMP-Entwicklung
Betreff: Grundlegende Fragen mit Oracle SQL und JSLIch habe es ein wenig abgewandelt und versucht, meine i- und t-punkte zu kreuzen. Hier ist mein JSL-Code und die Protokollausgabe:
JSL-Code
constring = ("DSN=***; UID=***; PWD=***");
dt1 = Open Database(constring,"SELECT * FROM UID.TEST", "TEST1");
show(dt1);
dt1 << Datenbank speichern(constring,"UID.TEST1");
Protokollausgabe:
Informationen zur Datenbankverbindung:
DSN=***; UID=***;
dt1 = DataTable("TEST1");
Informationen zur Datenbankverbindung:
DSN=***; UID=***;
Skriptfähig[]
An dieser Stelle ist nichts zu klein. Wenn etwas faul aussieht, lassen Sie es mich wissen. Ansonsten, wenn Sie es ausführen können, frage ich mich, ob es irgendwie mein ODBC ist.
Betreff: Grundlegende Fragen mit Oracle SQL und JSLHey, Beastwood,
Nun, ich bin verwirrt, denn ich habe Ihr Skript genau auf JMP 13 mit Oracle nachgeahmt und es hat gut funktioniert, einschließlich der 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\!""
);
Das einzige Mal, dass ich die Meldung „Sende erwartet skriptfähiges Objekt“ erhielt, war einmal, als ich in der Funktion „Datenbank öffnen“ den falschen Tabellennamen angegeben hatte und das Öffnen daher fehlschlug.
Vielleicht werfen Sie ein:
show(dt1);
zwischen den Open Database- und Save Database-Aufrufen und stellen Sie sicher, dass dt1 richtig aussieht. Im JMP-Protokoll sollte es etwa so aussehen:
dt1 = DataTable("SQL Results 3");
HTH,
Erik