변수 유형이 잘못되었나요?

변수 유형이 잘못되었나요?

이해할 수 없는 오류가 있습니다. 문제는 쉘에 입력한 매개변수가 SQL 데이터베이스에 입력한 매개변수와 다른 유형인 것 같습니다.

이해를 돕기 위해 각 줄에 공백으로 구분된 세 가지 중요한 내용이 있는 doc.lst 파일이 있으며 이러한 내용을 데이터베이스 업데이트를 위한 매개 변수로 사용하고 싶습니다. 각 행을 읽고 각 부분을 매개변수로 사용하여 데이터베이스를 업데이트합니다.

SQL 쿼리가 있습니다.

    UPDATE PE P
    SET P.DATED='&1', P.DATEF='&1', P.CODA='&3', P.CODB='&2'
    WHERE P.G_BAT=1;
    COMMIT;

쉘은 다음과 같습니다.

    IFS=$'\n'
    for i in $(cat $LST_HOME/doc.lst)
    do 
    sqlplus64 $User/$Pass@$ORACLE_SID << EOF
    P1=$(echo $i | awk '{print $1}')
    P2=$(echo $i | awk '{print $2}')
    P3=$(echo $i | awk '{print $3}')
    @$SQL_HOME/update_p.sql $P1 $P2 $P3
    commit;
    exit
    /data/jdk1.6.0_XX/bin/java -cp fr.bla.bla.bla 
    EOF

이 오류가 있습니다.

    SQL> SP2-0734: unknown command at the beggining of "P1=12/03/2..." - end of the line is ignored.
    SQL> SP2-0042: unknown command "P2=0" - end of the line is ignored..
    SQL> SP2-0042: unknown command "P3=FSL" - end of the line is ignored..

어디에서 어떻게 수정해야 하는지 정말 모르겠습니다.

답변1

sqlplus를 호출하기 전에 쉘 변수 설정을 완료해야 합니다.

IFS=$'\n'
for i in $(cat $LST_HOME/doc.lst)
do 
P1=$(echo $i | awk '{print $1}')
P2=$(echo $i | awk '{print $2}')
P3=$(echo $i | awk '{print $3}')

sqlplus64 $UserCoribudg/$PassCoribudg@$ORACLE_SID << EOF
@$SQL_HOME/update_p.sql $P1 $P2 $P3
commit;
exit
EOF

/data/java_1.6_XX/bin/java -cp fr.bla.bla.bla

done
  • P1=whatever유효한 SQL 코드가 아닙니다.
  • Java 부분이 업데이트된 값을 사용한다고 가정합니다.

답변2

에 표시된 바와 같이Shell: 중첩된 줄을 읽는 동안, 당신은 다음과 같은 것을 할 수 있습니다

(sed "s|^|@${SQL_HOME}/update_p.sql |" ${LST_HOME}/doc.lst; echo exit) | sqlplus64 ${UserCoribudg}/${PassCoribudg}@${ORACLE_SID}

각 SQL 업데이트 후에 명령을 실행하려는 경우 여러 가지 주의 사항(와일드카드 등)이 있지만 루프를 수행할 수 있습니다. 당신의 가치가 doc.lst안전하다면 이렇게 할 수 있습니다

while read line; do
    (echo @${SQL_HOME}/update_p.sql ${line}; echo exit) | sqlplus64 ${UserCoribudg}/${PassCoribudg}@${ORACLE_SID}
    /data/java_1.6_XX/bin/java -cp fr.bla.bla.bla
done < ${LST_HOME}/doc.lst

모든 줄을 구문 분석할 필요가 없습니다.

더 안전한 옵션은 전체 파일을 쉘 스크립트로 변환하는 것입니다.

sed "s|^|(echo @${SQL_HOME}/update_p.sql |" ${LST_HOME}/doc.lst | sed "s/$/; echo exit | sqlplus64/" | sed "s|$| ${UserCoribudg}/${PassCoribudg}@${ORACLE_SID}; /data/java_1.6_XX/bin/java -cp fr.bla.bla.bla|" > doc.script
sh doc.script

관련 정보