Scrittura del set di risultati della tabella dati nella tabella Oracle esistente<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />CIAO,
Sono molto nuovo nello scripting JMP. Ho creato uno script per leggere da una tabella Oracle. Applica un Fit_Model ai dati (non è stato possibile replicarlo in Oracle, quindi la necessità di JMP) e desidera riscriverlo in Oracle.
Al momento sto usando dt3<
Questo crea la tabella, ma avrei davvero bisogno di poter INSERIRE IN una tabella esistente invece di creare una nuova tabella.
Qualsiasi aiuto sarebbe molto apprezzato, poiché dico che sono nuovo di zecca nello script JMP e non riesco a trovare una risposta nel manuale di JMP Script.
Grazie,
Re: Scrivere il set di risultati della tabella dati nella tabella Oracle esistenteVolevo solo aggiornare questo thread con alcune nuove informazioni.Stavo cercando di eseguire più inserimenti (~ 8000) in una tabella Oracle e ho riscontrato problemi di prestazioni durante l'inserimento di un record alla volta.Il "trucco" è usare il file INSERIRE TUTTO IN comando.Il codice seguente inserisce 200 record alla volta.
dt = tabella dati ( "Dati casuali" ) ;
stringa_dsn = "Driver={Oracle in OraClient11g64};Dbq=;UID=;PWD=;" ;
dbc = creare una connessione al database ( stringa_dsn ) ;
istruzione_sql =
"\[CREATE TABLE .FYI_RANDOM
(NUMERO DI IDENTIFICAZIONE,
RAND_INTERO NUMERO,
RAND_NUMBER NUMERO,
RAND_DATETIME DATA,
RAND_STRING VARCHAR2(80))]\" ;
eseguire sql ( dbc , istruzione_sql ) ;
// Rimuovi righe dalla tabella (per test ripetuti)
eseguire sql ( dbc , "tronca tabella .fyi_random" ) ;
t2 = Spunta i secondi () ;
max_inserts = 200 ; // Esegui 200 inserimenti alla volta
istruzione_sql = "INSERISCI TUTTO" ;
per ( io = 1 , io <= nrow ( dt ) , io ++,
idc = dt : id [ io ] ;
rand_integerc = dt : rand_intero [ io ] ;
numero_randc = dt : numero_rand [ io ] ;
rand_datetimec = formato ( dt : rand_datetime [ io ] , "m/g/aa:m:s" ) ;
rand_stringaC = dt : rand_stringa [ io ] ;
istruzione_sql = istruzione_sql || evalinsert (
" IN .FYI_RANDOM(ID, RAND_INTEGER, RAND_NUMBER, RAND_DATETIME, RAND_STRING)
VALUES(^idc^, ^rand_intero^, ^rand_numeroc^,
to_date('^rand_datetimec^', 'MM/GG/AAAA HH:MI:SS AM'),
'^rand_stringa^')
" ) ;
Se ( mod ( io , max_inserts ) == 0 ,
// Strano - INSERT ALL INTO richiede un'istruzione SELECT alla fine - usane una fittizia
istruzione_sql = istruzione_sql || "SELEZIONA 1 DA DOPPIO" ;
eseguire sql ( dbc , istruzione_sql ) ;
istruzione_sql = "INSERISCI TUTTO" ;
) ;
Se ( mod ( io , 200 ) == 0 ,
didascalia ( "Inserito" || char ( io ) || "record" ) ;
Aspettare ( 0 ) ;
) ;
) ;
// Vedi se c'è ancora qualcosa da fare
Se ( istruzione_sql != "INSERISCI TUTTO" ,
eseguire sql ( dbc , istruzione_sql ) ;
) ;
chiudere la connessione al database ( dbc ) ;
t1 = spuntare secondi () ;
stampa ( t1 - t2 ) ;
didascalia ( rimuovere ) ;
Aspettare ( 0 ) ;
IL INSERIRE TUTTO IN Il comando in realtà non è così nuovo: gli esempi che ho trovato online lo mostrano funzionante in Oracle 9. Ecco alcuni collegamenti con ulteriori informazioni:
https://www.techonthenet.com/oracle/questions/insert_rows.php
sql - Il modo migliore per inserire più righe in Oracle? - Stack Overflow
Re: Scrivere il set di risultati della tabella dati nella tabella Oracle esistenteQuesto ha funzionato!!
Grazie mille per tutto il vostro aiuto, lo apprezzo davvero
Re: Scrivere il set di risultati della tabella dati nella tabella Oracle esistenteForse le colonne della tua tabella JMP sono numeriche?Questo è quanto indicato dal messaggio di errore.Inoltre ti mancano alcune virgolette singole per alcune colonne.Prova a racchiudere ogni colonna con la funzione CHAR.Se ancora non funziona, stampa la tua variabile sql_statement.
Tabella dei dati correnti ( dt ) ;
dbc = Crea connessione al database (
"DRIVER={Oracle in instantclient11_1};DBQ=DBASE;UID=UNAME;SPWD=PWORD;"
) ;
Per ( io = 1 , io <= N righe ( dt ) , io ++,
istruzione_sql = "INSERISCI IN SCHEMA.TBL_TABLE" ||
"(COL1, COL2, COL3, COL4, COL5, COL6, COL7, COL8) " ||
"VALORI(" || "'" ||
char ( Colonna ( 1 )[ io ]) || "', '" || char ( Colonna ( 2 )[ io ]) || "', '" ||
char ( Colonna ( 3 )[ io ]) || "', '" || char ( Colonna ( 4 )[ io ]) || "', '" ||
char ( Colonna ( 5 )[ io ]) || "', '" || char ( Colonna ( 6 )[ io ]) || "', '" ||
char ( Colonna ( 7 )[ io ]) || "', '" || char ( Colonna ( 8 )[ io ]) || "') " ;
stampa ( istruzione_sql ) ;
Esegui SQL ( dbc , istruzione_sql ) ;
) ;
Chiudi connessione al database ( dbc ) ;
Re: Scrivere il set di risultati della tabella dati nella tabella Oracle esistenteCIAO,
Ho provato a lavorare con questo, ma ho ricevuto un errore che apparentemente è dovuto alla concatenazione.
Tutte le colonne nella tabella sono VARCHAR2, la concatenazione sembra a posto dal punto di vista degli sviluppatori Oracle.
Potresti per favore aiutarmi a superare il traguardo?
argomento dovrebbe essere un carattere nell'accesso o nella valutazione di 'Concat' , Bad Argument( Column( 5 ) )
Nello script seguente, errore contrassegnato da /*###*/
Tabella dati correnti ( dt );
dbc = Crea connessione al database(
"DRIVER={Oracle in instantclient11_1};DBQ=DBASE;UID=UNAME;SPWD=PWORD;"
);
For( i = 1, i <= N Righe( dt ), i++,
sql_statement = "INSERT INTO SCHEMA.TBL_TABLE " || /*####*/
"(COL1, COL2, COL3, COL4, COL5, COL6, COL7, COL8) " || /*####*/
"VALUES(" || /*####*/"'" || /*####*/Colonna( 1 ) || /*####/"', " || /*####*/
"'" || /*####*/Colonna( 2 ) || /*####/"', " || /*####*/"'" || /*####*/
Colonna( 3 ) || /*####/"', " || /*####*/Colonna( 4 ) || /*####*/", " || /*####*/
Colonna( 5 ) || /*####*/", " || /*####*/Colonna( 6 ) || /*####*/", " || /*####*/
Colonna( 7 ) || /*####*/", " || /*####*/"'" || /*####*/Colonna( 8 ) || /*####*/
"') " /*####*/;
Eseguire SQL( dbc, sql_statement );
);
Chiudi connessione al database (dbc);
Re: Scrivere il set di risultati della tabella dati nella tabella Oracle esistenteGerardo,
Ci sei quasi.Per aggiungere più record è necessario scorrere le righe nella tabella JMP ed emettere istruzioni INSERT separate.
dt = rftmdl [ 1 ][ Scatola da tavolo ( 3 )] << rendere datatable combinato ( "Tbl_Combinato" ) ;
tabella dati corrente ( dt ) ;
dbc = Crea connessione al database ( "DRIVER={Oracle in instantclient11_1};DBQ=DBNAME;UID=USER;SPWD=PASS;" ) ;
per ( io = 1 , io <= nrow ( dt ) , io ++,
istruzione_sql =
"INSERISCI IN SCHEMA.TBL_TABLE" ||
"(col1, col2, col3, col4, col5, col6, col7, col8) " ||
"VALORI(" ||
"'" || colonna ( 1 )[ io ] || "', " ||
"'" || colonna ( 2 )[ io ] || "', " ||
"'" || colonna ( 3 )[ io ] || "', " ||
colonna ( 4 )[ io ] || "," ||
colonna ( 5 )[ io ] || "," ||
colonna ( 6 )[ io ] || "," ||
colonna ( 7 )[ io ] || "," ||
"'" || colonna ( 8 )[ io ] || "') " ;
// JMP aggiungerà un commit all'istruzione insert.
Esegui SQL ( dbc , istruzione_sql ) ;
) ;
Chiudi connessione al database ( dbc ) ;
Per fare riferimento a una singola cella della tabella puoi usare una sintassi come questa:
colonna ( 1 )[ 3 ] ; // Si riferisce alla cella nella tabella dati corrente, nella prima colonna, riga 3
colonna ( dt , 5 )[ 7 ] ; // Cella nella colonna 5, riga 7 della tabella a cui fa riferimento la variabile dt
colonna ( dt , "Mondo" )[ 2 ] ; // Cella nella colonna denominata World, riga 2, nella tabella a cui fa riferimento dt.Questa è la sintassi che uso più frequentemente
: Mondo [ 2 ] ; // Cella nella colonna World, riga 2, nella tabella dati corrente.
Buona fortuna!
Peter
Re: Scrivere il set di risultati della tabella dati nella tabella Oracle esistenteGrazie mille per aver risposto.
Con i valori che inserisco come posso specificare che provengono dalla tabella dei dati?
Ho provato semplicemente a usare la colonna (1) ecc. Ma questo non funziona. Vengo da un background PL/SQL, quindi il mio cervello dice dt.column(1) ma non funziona.
Puoi per favore chiarire?
dt=rftmdl[1][Table Box(3)] << make combined datatable("Tbl_Combinied");
sql_statement =
"INSERISCI IN SCHEMA.TBL_TABLE " ||
"(col1, col2, col3, col4, col5, col6, col7, col8) " ||
"VALORI(" ||
"'" || colonna(1) || "', " ||
"'" || colonna(2)|| "', " ||
"'" || colonna(3)|| "', " ||
colonna(4)|| ", " ||
colonna(5)|| ", " ||
colonna(6)|| ", " ||
colonna(7)|| ", " ||
"'" || colonna(8) || "') ";
dbc = Crea connessione al database("DRIVER={Oracle in instantclient11_1};DBQ=DBNAME;UID=USER;SPWD=PASS;");
// JMP aggiungerà un commit all'istruzione insert.
Eseguire SQL(dbc, sql_statement);
Chiudi connessione al database (dbc);
Inoltre, se conosci collegamenti utili o guide agli script JMP, tutto l'aiuto è ben accetto.
Grazie ancora.
Re: Scrivere il set di risultati della tabella dati nella tabella Oracle esistenteSe utilizzi JMP 10, ecco come inserire un record.Si noti che DSN_STRING è la stringa di connessione al mio database.Si noti inoltre che la stringa SQL deve trovarsi su una riga continua, senza commenti.
istruzione_sql =
"INSERISCI IN mioschema.miatabella" ||
"(una_colonna, seconda_colonna, terza_colonna) " ||
"VALORI(" ||
"'" || primo_valore || "', " ||
"'" || secondo_valore || "', " ||
"'" || terzo_valore || "') " ;
dbc = Crea connessione al database ( stringa_dsn ) ;
// JMP aggiungerà un commit all'istruzione insert.
Esegui SQL ( dbc , istruzione_sql ) ;
Chiudi connessione al database ( dbc ) ;
// In JMP 8 o 9 basta usare questo:
// Apri database(dsn_string, sql_statement);