2017-04-21 1 views
1

SQL 파일에서 한 번에 하나의 쿼리를 추출하려고합니다. SQL 파일에서 한 번에 하나의 쿼리를 추출하는 방법은 무엇입니까?

내가 이런

index1=1 
index2=1 
while read -n1 char; do 
if [[ $char == ";" ]] 
    then 
    SUBSTRING=$(awk 'substr($index1,$index2)' sql1Temp.sql) 
    echo $SUBSTRING 
    index1=$index2 
fi 
((index2+=1)) 

done <sql1Temp.sql 

내 SQL 파일보기를 시도 것입니다 :

sql1Temp.sql
선택 * TEST1에서;
select * from test2;
select * from test3;

나는 결과로이 무엇입니까 :

[email protected]:~/Desktop$ ./masterFile.sh 
select *from test1; select *from test2; select *from test3; 
select *from test1; select *from test2; select *from test3; 
select *from test1; select *from test2; select *from test3; 
[email protected]:~/Desktop$ 

내가 기대 한 반면이 같은 : 또한

[email protected]:~/Desktop$ ./masterFile.sh 
select *from test1; 
select *from test1; 
select *from test1; 
[email protected]:~/Desktop$ 

을 나는 동안 루프 내부의 $의 문자를 에코 때, 그것은 인쇄하고, $ char가 * from queries를 얻을 때마다 파일명을 선택하고, * test1을 선택한다; 내 의견으로는 뭔가에이

[email protected]:~/Desktop$ ./masterFile.sh 
s 
e 
l 
e 
c 
t 

masterFile.sh sql1result.sql sql1.sql sql1Temp.sql sql2.sql Untitled Document 
f 
r 
o 
m 

t 
e 
s 
t 
1 
select *from test1; select *from test2; select *from test3; 
; 
same thing 3 times 

같은 등

뭔가 AWK 잘못입니까?

while IFS= read -r line; do 
    echo "$line" # Or do what you need to do (e.g. execute SQL statement) 
done <sql1Temp.sql 

당신은 세미콜론에 대해 걱정할 필요가 없습니다 : 당신이해야 할 일은

+0

내가 읽는 방식대로 스크립트가 의도 한 바를 설명해 주시겠습니까? 'cat sql1Temp.sql'과 동등한 회귀 및 느린 방식처럼 보입니다. 그리고 나는 뭔가 있어야한다고 생각합니다. 있어야 할 곳에 없는. – Fred

+0

sql1Temp.sql 파일에서 하나의 sql querry를 가져 와서이 파일을 실행 한 다음이 파일을 새 파일에 복사하고 원본 파일에서 해당 querry를 제거해야합니다. –

+0

항상 한 줄에 하나의 SQL 문이 있습니까? 아니면 둘 이상의 세미콜론으로 구분할 수있는 경우를 처리해야합니까? – Fred

답변

1

awk없이 훨씬 간단한 방법으로 수행 할 수 있습니다 파일을 줄을 읽고하는 것입니다 read 문은 한 번에 한 줄씩 읽을 것이므로 한 줄에 한 문장 씩 읽을 수 있습니다.

경우, 당신은 성공적으로 실행 실행 문을 제거 같은 것을 할 수 않는 원하는 : 기본적으로

local statements="sql1Temp.sql" 
local failed="sql1Temp.sql.failed" 
while IFS= read -r line; do 
    if 
    ! SOME_SQL_UTILITY "$line" 
    then 
    echo "$line" >>"$failed" 
    fi 
done <"$statements" 
[[ ! -f "$failed" ]] || mv -f "$failed" "$statements" 

을 문을 실패 포함하는 새로운 파일을 생성하고 이전하지 않는 한을 덮어 쓸 새 파일을 이동 새 파일이 없습니다.

! SOME_SQL_UTILITY "$line"!은 "테스트 성공을 의미하는이 명령의 실패"(기본적으로 논리 연산자가 아닙니다)를 의미합니다.

또한 위의 코드에서 echo을 가능한 익숙한 것으로 사용했지만 printf을 사용하면 예기치 않은 셸 동작을 트리거하는 특수 문자 시퀀스가없는 것을 확인할 수 있습니다. 이와 위의 라인을 교체 : 나는 또한 "오두막"를 포함했다

#!/bin/bash 
local statements="sql1Temp.sql" 
local failed="sql1Temp.sql.failed" 
while IFS= read -r line; do 
    SOME_SQL_UTILITY "$line" || printf "%s" "$line" >>"$failed" 
done <"$statements" 
[[ ! -f "$failed" ]] || mv -f "$failed" "$statements" 

:

printf "%s" "$line" >>"$failed" 

마지막으로, 당신은 if 블록 대신 논리 연산자를 사용하여 코드를 조금 더 단축 할 수 이 스크립트가 실행 파일로 실행되도록 허용합니다.논리적 인 || (OR) 연산자를 사용하면 if 문을 사용하는 것보다 낫지 만, 잘 이해하고 더 좋아진 경우에만 수행하십시오.

+0

별도의 질문으로 게시해야합니다. – Fred

+0

어떻게 sql1Temp.sql에서 $ 줄 (단일 querry)을 삭제할 수 있습니까? 새 파일에 복사 한 후 –

+0

처리가 끝나면'sql1Temp.sql'이 비어 있다고 기대합니까, 아니면 일부 조건에 따라 일부 줄이 파일에 남아 있습니까? – Fred

관련 문제