Oracle SQL と JSL を使用した基本的な質問現在、JMP 13 と Oracle (12c) がどの程度連携できるかを確認するためにいくつかのテストを行っています。 私の最終的な目標は、SQL クエリを使用して Oracle データを JMP にインポートし、データの分析を実行して、元のテーブルを削除しながらデータを Oracle データベースに戻すことです。 データを JMP に正常に取り込むことができましたが、データ テーブルを oracle に保存する際に問題が発生しました。 これまでのところ、テーブルの削除コマンドはこうあるべきだと私が考えているものは次のとおりです(現在はコメントアウトされています)。
constring = ("DSN=***; UID=****; PWD=****);
dt1 = データベースを開く(constring,"select * from test1","test1");
dt1 << データベースを保存(constring,"test2");
//データベースをオープンします (constring,"Drop table test1");
これを実行すると、「test1」テーブルが正しいデータとともにポップアップ表示されますが、「データベースの保存」では次のエラーが発生します。
Send は、 'Send' のアクセスまたは評価でスクリプト可能オブジェクトを期待します、 dt1 << /*###*/save database( constring, "test2" ) /*###*/
次のスクリプトでは、/*###*/ でマークされたエラーが発生します。
dt1 << /*###*/save database( constring, "test2" ) /*###*/
{}
私はこのドキュメントを使用しています ( https://www.jmp.com/content/dam/jmp/documents/en/white-papers/wp-jmp-odbc-102427.pdf )を主な参考資料として使用しており、例と同じように見えると思いますが、明らかに何かが異なります。
「データベースの保存」機能の何が間違っているのでしょうか?また、drop table コマンドは機能しますか?
Re: Oracle SQL と JSL を使用した基本的な質問OK、実稼働システムから集めたコードをいくつか示します。 罪のない人々やその他すべてのものを守るために名前が変更されました。
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: Oracle SQL と JSL を使用した基本的な質問うーん、興味深いですね。 実際には oracle にログインすることでテーブルを作成できますが、これをうまく機能させたいのですが、これまで DBA はあまり役に立ちませんでした。 レコードを挿入しようとする場合、JMP テーブルのレコードを反復処理して挿入するように設定するにはどうすればよいですか? たとえば、JMP に 100 レコードと 3 つの列 (ID、郵便番号、注文金額) を持つテーブルがあるとします。 先ほど書いた内容を取得して、それらのレコードを Oracle のテーブルに挿入するにはどうすればよいですか?
Re: Oracle SQL と JSL を使用した基本的な質問特定のスキーマでテーブルを作成できるようにするには、適切な権限が必要です。 それが不可能な場合は、次のアプローチが機能する可能性があります。
DBA に 2 番目のテーブルを作成してもらい、そのテーブルに対する読み取り、書き込み、削除特権を付与してもらいます。
使用から削除記録を削除するには、アップデート既存のレコードを変更する、またはに挿入新しいレコードを追加します。
大量の INSERTS を実行すると、かなり遅くなる可能性があります。 プロセスを大幅に高速化できる INSERT ALL を見つけました。 多数の挿入をチャンクあたり 200 個の挿入に分割したところ、時間が大幅に短縮されました。 ここに例を示します。 何らかの理由で最後に「SELECT * FROM DUAL」が必要になることに注意してください。
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: Oracle SQL と JSL を使用した基本的な質問情報をありがとう、そしてみんなを助けてください。 DBA に相談して、ODBC 接続経由で書き込みアクセスを許可するオプションがあるかどうかを確認する必要があるようです。 再度、感謝します!
Re: Oracle SQL と JSL を使用した基本的な質問実際には、データベースに対してクエリのみが可能で、内容を変更できないことは非常に一般的です。
Re: Oracle SQL と JSL を使用した基本的な質問残念ながらそれはうまくいきませんでした。 参照しようとしているテーブルを独自のスキーマで作成しました。 ODBC 接続で選択アクセスはできるが、書き込みアクセスはできない可能性はありますか? (申し訳ありませんが、ODBC 接続が実際にどのように機能するかはよくわかりません。)
Re: Oracle SQL と JSL を使用した基本的な質問Open Database の後に Wait(0) ステートメントを挿入してみてください。
dt1 = Open Database(...);
Wait(0);
dt1 << Save Database(...);
show(dt1) はそれがデータテーブルであることを認識していることを示しているため、これが役立つかどうかは疑問です。
単純にサンプル データ テーブルを開いた場合は、次のようにします。ビッグクラスを対話的に実行し、スクリプトから次の操作を実行します。
Current Data Table() << Save Database(...);
それは動作しますか? これにより、書き込み権限があることが確認されます。
エリック
Re: Oracle SQL と JSL を使用した基本的な質問おっと、どういうわけか上記のことを見逃していました。 そうしましたね。 このデータベースへの書き込み権限を持っていますか?Re: Oracle SQL と JSL を使用した基本的な質問保存するテーブルの名前とともにスキーマ名を指定しましたか? 例:
dt << Save Database("DSN=MyConnectionInfo", "SchemaName.BigClass");
ブライアン・コーコラン
JMP開発
Re: Oracle SQL と JSL を使用した基本的な質問私はそれを少し変えて、i に点を付け、t を横切るようにしてみました。 これが私のjslコードとログ出力です。
JSLコード
constring = ("DSN=***; UID=***; PWD=***");
dt1 = データベースを開く(constring,"SELECT * FROM UID.TEST", "TEST1");
ショー(dt1);
dt1 << データベースを保存(constring,"UID.TEST1");
ログ出力:
データベース接続情報:
DSN=***; UID=***;
dt1 = データテーブル("TEST1");
データベース接続情報:
DSN=***; UID=***;
スクリプト可能[]
現時点では小さすぎることはありません。何か怪しいと思われる場合はお知らせください。 それ以外の場合、実行できる場合は、それが私の ODBC であるのではないかと考えてしまいます。
Re: Oracle SQL と JSL を使用した基本的な質問おい、獣木よ、
そうですね、私は困惑しています。なぜなら、Oracle を使用して JMP 13 であなたのスクリプトを正確に模倣したところ、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\!""
);
「送信はスクリプト可能なオブジェクトを期待しています」というメッセージが表示されたのは、データベースを開く関数で間違ったテーブル名を使用したためにオープンに失敗したときの 1 回だけです。
おそらく次をスローします:
show(dt1);
Open Database 呼び出しと Save Database 呼び出しの間に、dt1 が正しく表示されていることを確認します。 JMP ログには次のように表示されるはずです。
dt1 = DataTable("SQL Results 3");
HTH、
エリック