使用 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");
卫生部,
埃里克