使用 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 Expects Scriptable Object in access or evaluation of 'Send', dt1 << /*###*/save database( constring, "test2" ) /*###*/
在以下腳本中,錯誤標記為 /*###*/
dt1 << /*###*/保存數據庫(constring, "test2") /*###*/
{}
我一直在使用這個文件( https://www.jmp.com/content/dam/jmp/documents/en/white-papers/wp-jmp-odbc-102427.pdf ) 作為我的主要參考,我認為它看起來與示例相同,但顯然有些地方不對勁。
“保存數據庫”功能我做錯了什麼,drop table 命令會起作用嗎?
回复:使用 oracle SQL 和 JSL 的基本問題好的,這是我從生產系統中拼湊的一些代碼。 名稱已更改以保護無辜者等等。
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>
回复:使用 oracle SQL 和 JSL 的基本問題嗯,有意思。 我實際上可以通過登錄到 oracle 創建表,但我很想讓它正常工作,但到目前為止,DBA 並沒有提供太大的幫助。 如果我只是嘗試插入記錄,我該如何設置它以遍歷 JMP 表記錄以插入它們? 例如,假設我在 JMP 中有一個表,其中包含 100 條記錄和 3 列(ID、郵政編碼、訂單金額)。 我如何獲取您剛剛編寫的內容並將這些記錄插入回 oracle 中的表中?
回复:使用 oracle SQL 和 JSL 的基本問題您需要適當的授權才能在該特定模式中創建表。 如果那不可能,也許這種方法會起作用:
讓您的 DBA 創建第二個表並為您提供讀、寫、刪除權限。
使用刪除自刪除記錄,更新修改現有記錄,或插入添加新記錄。
如果你正在做很多可能會很慢的插入。 我偶然發現了 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;
回复:使用 oracle SQL 和 JSL 的基本問題感謝您提供的信息並幫助大家。 看起來我需要和我的 DBA 談談,看看是否有一些選項可以讓我通過我的 ODBC 連接進行寫訪問。 再次感謝!
回复:使用 oracle SQL 和 JSL 的基本問題只能查詢數據庫,不能修改內容的情況其實很常見。
回复:使用 oracle SQL 和 JSL 的基本問題遺憾的是那沒有用。 我創建了我試圖在自己的架構中引用的表。 ODBC 連接是否有可能具有選擇訪問權限,但沒有寫訪問權限? (抱歉,我不太熟悉 ODBC 連接的實際工作方式。)
回复:使用 oracle SQL 和 JSL 的基本問題您可以嘗試在打開數據庫後插入 Wait(0) 語句:
dt1 = Open Database(...);
Wait(0);
dt1 << Save Database(...);
我懷疑這是否會有所幫助,因為 show(dt1) 顯示它知道它是一個數據表。
如果您只是打開一個樣本數據表,比如說大班,以交互方式,然後從腳本執行:
Current Data Table() << Save Database(...);
那樣有用嗎? 這將確定您具有寫權限。
埃里克
回复:使用 oracle SQL 和 JSL 的基本問題哎呀,不知何故錯過了上面的內容。 你做到了。 你確定你有這個數據庫的寫權限嗎?回复:使用 oracle SQL 和 JSL 的基本問題您是否使用要保存的表的名稱指定了架構名稱? 一個例子:
dt << 保存數據庫("DSN=MyConnectionInfo", "SchemaName.BigClass");
布賴恩·科科倫
JMP開發
回复:使用 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 = DataTable("測試1");
數據庫連接信息:
DSN=***; UID=***;
腳本[]
在這一點上沒有什麼是太小的,如果有什麼東西看起來可疑,請告訴我。 否則,如果你能運行它,我就會懷疑它是否是我的 ODBC。
回复:使用 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\!""
);
我唯一一次收到“Send expects scriptable object”消息是有一次,當時我在 Open Database 函數中輸入了錯誤的表名,因此打開失敗。
也許扔一個:
show(dt1);
在打開數據庫和保存數據庫調用之間,確保 dt1 看起來正確。 它在 JMP 日誌中應該看起來像這樣:
dt1 = DataTable("SQL Results 3");
衛生部,
埃里克