Preguntas básicas usando Oracle SQL y JSLActualmente estoy haciendo algunas pruebas para ver qué tan bien JMP 13 y Oracle (12c) pueden funcionar juntos. Mi juego final es importar datos de Oracle mediante consultas SQL en JMP, ejecutar un análisis de los datos y luego devolver los datos a la base de datos de Oracle mientras se elimina la tabla original. Pude traer datos a JMP con éxito, pero tengo problemas para guardar la tabla de datos en Oracle. Esto es lo que tengo hasta ahora y lo que creo que debería ser el comando soltar la tabla (actualmente comentado):
constring = ("DSN=***; UID=****; PWD=****);
dt1 = Abrir base de datos(constring,"select * from test1","test1");
dt1 << guardar base de datos(constring,"test2");
//abrir base de datos (constring,"Drop table test1");
Cuando ejecuto esto, aparece la tabla "test1" con los datos correctos, pero el error "guardar base de datos" muestra el siguiente error:
Send Expects Scriptable Object en acceso o evaluación de 'Send', dt1 << /*###*/save database( constring, "test2") /*###*/
En el siguiente script, error marcado por /*###*/
dt1 << /*###*/guardar base de datos( constring, "test2") /*###*/
{}
He estado usando este documento ( https://www.jmp.com/content/dam/jmp/documents/en/white-papers/wp-jmp-odbc-102427.pdf ) como mi referencia principal y creo que se ve igual que el ejemplo, pero algo está claramente mal.
¿Qué estoy haciendo mal con la función "guardar base de datos" y funcionará el comando soltar tabla?
Re: Preguntas básicas usando Oracle SQL y JSLBien, aquí hay un código que improvisé a partir de un sistema de producción. Se han cambiado los nombres para proteger a los inocentes y todo eso.
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: Preguntas básicas usando Oracle SQL y JSLMmm interesante. De hecho, puedo crear las tablas iniciando sesión en Oracle, pero me encantaría que esto funcione y el DBA no ha sido de gran ayuda hasta ahora. Si solo intento insertar los registros, ¿cómo lo configuro para iterar a través de los registros de la tabla JMP para insertarlos? Por ejemplo, digamos que tengo una tabla en JMP con 100 registros y 3 columnas (ID, código postal, monto del pedido). ¿Cómo tomo lo que acaba de escribir e inserto esos registros nuevamente en la tabla en Oracle?
Re: Preguntas básicas usando Oracle SQL y JSLNecesita las concesiones adecuadas para poder crear tablas en ese esquema particular. Si eso no es posible, tal vez este enfoque funcione:
Haga que su DBA cree la segunda tabla y le dé privilegios de lectura, escritura y eliminación.
Usar ELIMINAR DE para eliminar registros, ACTUALIZAR para modificar registros existentes, o INSERTAR EN para agregar nuevos registros.
Si está haciendo muchos INSERTOS, eso puede ser bastante lento. Me topé con INSERTAR TODO, que puede acelerar enormemente el proceso. Dividí una gran cantidad de inserciones en 200 inserciones por porción y vi grandes disminuciones en el tiempo. Aquí hay un ejemplo. Tenga en cuenta que necesita "SELECCIONAR * DE DUAL" al final por alguna razón.
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: Preguntas básicas usando Oracle SQL y JSLGracias por la información y ayudar a todos. Parece que tendré que hablar con mi DBA y ver si hay alguna opción que me dé acceso de escritura a través de mi conexión ODBC. ¡Gracias de nuevo!
Re: Preguntas básicas usando Oracle SQL y JSLEn realidad, es muy común solo poder consultar la base de datos, pero no modificar los contenidos.
Re: Preguntas básicas usando Oracle SQL y JSLLamentablemente eso no funcionó. Creé las tablas a las que intento hacer referencia en mi propio esquema. ¿Es posible que la conexión ODBC pueda tener acceso de selección, pero no acceso de escritura? (Lo siento, no estoy muy familiarizado con el funcionamiento real de la conexión ODBC).
Re: Preguntas básicas usando Oracle SQL y JSLPodría intentar insertar una instrucción Wait(0) después de Open Database:
dt1 = Open Database(...);
Wait(0);
dt1 << Save Database(...);
Tengo mis dudas de que esto ayude, porque show(dt1) muestra que sabe que es una tabla de datos.
Si simplemente abre una tabla de datos de muestra, digamos clase grande , de forma interactiva y luego, desde el script, haz lo siguiente:
Current Data Table() << Save Database(...);
¿Eso funciona? Eso establecería que tienes permiso de escritura.
eric
Re: Preguntas básicas usando Oracle SQL y JSLVaya, de alguna manera me perdí eso de arriba. Lo hiciste. ¿Está seguro de que tiene privilegios de escritura en esta base de datos?Re: Preguntas básicas usando Oracle SQL y JSL¿Especificó el nombre del esquema con el nombre de la tabla para guardar? Un ejemplo:
dt << Guardar base de datos("DSN=MyConnectionInfo", "SchemaName.BigClass");
Brian Corcorán
Desarrollo JMP
Re: Preguntas básicas usando Oracle SQL y JSLLo cambié un poco, tratando de puntear mis i y cruzar mis t. Aquí está mi código jsl y la salida del registro:
Código JSL
constring = ("DSN=***; UID=***; PWD=***");
dt1 = Abrir base de datos(constring,"SELECT * FROM UID.TEST", "TEST1");
mostrar (dt1);
dt1 << guardar base de datos(constring,"UID.TEST1");
Salida de registro:
Información de conexión de la base de datos:
DSN=***; UID=***;
dt1 = TablaDeDatos("PRUEBA1");
Información de conexión de la base de datos:
DSN=***; UID=***;
Scriptable[]
Nada es demasiado pequeño en este punto, si algo parece sospechoso, házmelo saber. De lo contrario, si puede ejecutarlo, me pregunto si es mi ODBC de alguna manera.
Re: Preguntas básicas usando Oracle SQL y JSLOye, madera bestia,
Bueno, estoy desconcertado, porque imité tu secuencia de comandos exactamente en JMP 13 con Oracle y funcionó bien, incluida 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 única vez que recibí el mensaje "Enviar espera un objeto programable" fue una vez que tenía el nombre de tabla incorrecto en la función Abrir base de datos y, por lo tanto, la apertura falló.
Tal vez lanzar un:
show(dt1);
entre las llamadas Abrir base de datos y Guardar base de datos y asegúrese de que dt1 se vea bien. Debería verse así en el registro de JMP:
dt1 = DataTable("SQL Results 3");
HH,
eric