Oracle SQL 및 JSL을 사용한 기본 질문저는 현재 JMP 13과 Oracle(12c)이 얼마나 잘 작동하는지 확인하기 위해 일부 테스트를 수행하고 있습니다. 최종 목표는 SQL 쿼리를 사용하여 Oracle 데이터를 JMP로 가져오고 데이터에 대한 분석을 실행한 다음 원래 테이블을 삭제하는 동안 데이터를 다시 Oracle 데이터베이스로 반환하는 것입니다. 성공적으로 데이터를 JMP로 가져올 수 있었지만 데이터 테이블을 다시 oracle에 저장하는 데 문제가 있습니다. 지금까지 가지고 있는 것과 drop the table 명령이 있어야 한다고 생각하는 것(현재 주석 처리됨)은 다음과 같습니다.
문자열 = ("DSN=***; UID=****; PWD=****);
dt1 = Open Database(consstring,"select * from test1","test1");
dt1 << 데이터베이스 저장(constring,"test2");
//데이터베이스 열기(consstring,"Drop table test1");
이것을 실행하면 올바른 데이터가 있는 "test1" 테이블이 팝업되지만 다음 오류와 함께 "데이터베이스 저장" 오류가 발생합니다.
Send는 '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 명령이 작동합니까?
Re: 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>
Re: Oracle SQL 및 JSL을 사용한 기본 질문음, 흥미롭군요. 실제로 오라클에 로그인하여 테이블을 생성할 수 있지만 이 작업을 수행하고 싶고 DBA는 지금까지 크게 도움이 되지 않았습니다. 레코드를 삽입하려는 경우 JMP 테이블 레코드를 반복하여 삽입하도록 설정하려면 어떻게 해야 합니까? 예를 들어 JMP에 100개의 레코드와 3개의 열(ID, 우편번호, 주문 금액)이 있는 테이블이 있다고 가정해 보겠습니다. 방금 작성한 내용을 가져와서 해당 레코드를 Oracle의 테이블에 다시 삽입하려면 어떻게 해야 합니까?
Re: Oracle SQL 및 JSL을 사용한 기본 질문특정 스키마에서 테이블을 만들 수 있으려면 적절한 권한이 필요합니다. 이것이 가능하지 않은 경우 아마도 이 접근 방식이 작동할 것입니다.
DBA가 두 번째 테이블을 생성하고 그것에 대한 읽기, 쓰기, 삭제 권한을 부여하도록 하십시오.
사용 다음에서 삭제 기록을 제거하려면 업데이트 기존 레코드를 수정하거나 에 집어 넣다 새 레코드를 추가합니다.
상당히 느릴 수있는 많은 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 << 데이터베이스 저장("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 = DataTable("TEST1");
데이터베이스 연결 정보:
DSN=***; UID=***;
스크립트 가능[]
이 시점에서 너무 작은 것은 없습니다. 수상해 보이는 것이 있으면 알려주세요. 그렇지 않으면 실행할 수 있다면 내 ODBC인지 궁금합니다.
Re: Oracle SQL 및 JSL을 사용한 기본 질문이봐, 비스트우드,
JMP 13에서 Oracle을 사용하여 스크립트를 정확히 모방했고 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" 메시지를 받은 유일한 경우는 데이터베이스 열기 기능에서 테이블 이름이 잘못되어 열기에 실패했을 때였습니다.
아마도 다음을 던질 것입니다:
show(dt1);
데이터베이스 열기 및 데이터베이스 저장 호출 사이에 dt1이 올바르게 보이는지 확인하십시오. JMP 로그에 다음과 같이 표시되어야 합니다.
dt1 = DataTable("SQL Results 3");
HTH,
에릭