2014-01-22 2 views
2

명령 줄 매개 변수를 배열로 읽는 ksh 스크립트를 작성하고 DML 문을 작성하여 oracle 데이터베이스에 레코드를 삽입해야한다는 요구 사항이 있습니다. 이 작업을 위해 아래 스크립트를 작성했습니다. 그러나 스크립트를 호출하는 사용자에게는 스크립트를 실행해야하는 디렉토리에 쓸 수있는 권한이 없습니다. 그래서, 루프 내에서 sqlplus에 여러번 연결하지 않고 데이터베이스에 여러 개의 삽입 작업을 수행 할 수있는 방법이 있습니까? 다음과 같이 임시 SQL 파일을 만들지 않으시겠습니까? 어떤 아이디어든지 높게 평가된다. 미리 감사드립니다!루프에있는 파일에 쓰지 않고 sqlplus에 한 번만 연결하십시오.

i=0 
while ((i<$src_tbl_cnt)) 
do 
echo "insert into temp_table values ('${src_tbl_arr[$i]}', ${ins_row_arr[$i]}, ${rej_row_arr[$i]});" >> temp_scrpt.sql 
((i+=1)) 
done 
echo "commit; disc; quit" >> temp_scrpt.sql 
sqlplus user/[email protected] @ temp_scrpt.sql 

답변

0

그냥/tmp 디렉토리를 사용하십시오.

/tmp 디렉토리는 모든 유닉스 계열 서버에 존재 함을 보장합니다. 이 같은 필요에 정확하게 부합합니다. 여러 사용자가 서로 밟지 않도록 파일 이름에 현재 프로세스 ID를 추가하는 것과 같은 것을 확실히하십시오. 따라서 전체 이름은 /tmp/temp_$PID_scrpt.sql 또는 이와 유사한 것입니다.

완료되면 sqlplus 호출 바로 다음 행에서 해당 파일을 삭제해야합니다. 따라서 파일 이름을 변수에 저장하고 해당 변수의 내용을 삭제하십시오.

관리자는 잘 실행되는 상점에서 다음을 수행해야합니다. 1) 관리자는/tmp에 충분한 공간을 두어야합니다. 2) 커뮤니티의 모든 사용자가/tmp에있는 다른 파일을 삭제해서는 안됩니다. 과부하로 인해 공간이 부족합니다. 3) 관리자는 특정 나이 이후에/tmp에서 파일을 삭제하는 작업을 설정해야 스크립트가 임시 파일을 삭제하기 전에 실패 할 경우 영구히 존재하지 않게됩니다.

정말이 답변은/tmp에 대한 것이고 효과적으로 관리하는 방법입니다.하지만 실제로 필요한 것입니다. 임시 파일을 사용하는 것은 강력한 기술이므로 설계가 좋습니다. 사용자가 디렉토리에서 권한을 갖지 못하는 경우가 많기 때문에/tmp가 답입니다.

+0

죄송합니다 파일로. – user3221849

0

임시 파일을 만드는 대신 입력 생성 블록의 출력을 쉘 스크립트의 sqlplus로 직접 파이프 할 수 있습니다.

예 :이 Ksh 쉘 (93)과 함께 작동 배시

{ 
    echo 'set auto off;' 
    for ((i=0; i<100; i++)); do 
    echo "insert into itest(i) values ($i);" 
    done 
    # echo 'rollback;' # for testing 
    echo 'commit;' 
} | sqlplus -S juser/[email protected] > /dev/null 

(어쩌면은 Ksh 88은 (( 표현 구문 모듈로).

테스트 테이블에 대한 해당 DDL 문 :

create table itest (i number(36)) ; 

PS :, BTW 선호하는 경우에도 임시 파일을 생성 - 출력을 리디렉션하는 각각 재 _가 스타일을하는 것보다 방법이 더 효율적입니다 라인, 예를 들면 : 내 원래의 질문에 오해의 소지가 소리를하지만, 우려가 쓰는 모든 삽입 문 "하지 않고"모든 INSERT 문이 실행 시간을 한 번만 SQLPLUS하고 연결에 실행하는 방법에 대한 자세한 인 경우

{ for ((i=0; i<100; i++)); do echo "line $i"; done; echo end; } > foo.tmp