今日はShellでOracleを接続し、SQL文を実行する方法を紹介します。
SQL実行エラーの処理を含めて、参照いただけますと幸いです。
今回はEC2からRDSを接続し、SQL文を実行するため、事前にEC2から
RDSをsqlplusで接続できる状態を準備する必要です。
EC2からRDSをsqlplusで接続する設定は以下の内容を参照してください。
https://www.flyenginer.com/low/low_db/ec2からsqlplusでrdsを接続する設定.html
事前準備
sqlplusでRDSを接続する
sqlplus user_name/password@go
テーブル領域の作成
SQL>create tablespace TESTSPACE;
Tablespace created.
SQL>select
tablespace_name,
bytes/1024/1024 MB
from
dba_data_files
where
tablespace_name = ‘TESTSPACE’;
TABLESPACE_NAME MB
—————————— ———-
TESTSPACE 100
Tablespace created.
SQL>select
tablespace_name,
bytes/1024/1024 MB
from
dba_data_files
where
tablespace_name = ‘TESTSPACE’;
TABLESPACE_NAME MB
—————————— ———-
TESTSPACE 100
テーブルの作成
create table emp (
empno VARCHAR2(5),
empname VARCHAR2(10),
empage NUMBER(3),
area NVARCHAR2(100),
CONSTRAINT pk1 PRIMARY KEY(empno)
) TABLESPACE TESTSPACE;
Table created.
empno VARCHAR2(5),
empname VARCHAR2(10),
empage NUMBER(3),
area NVARCHAR2(100),
CONSTRAINT pk1 PRIMARY KEY(empno)
) TABLESPACE TESTSPACE;
Table created.
データの登録
BEGIN
FOR i IN 1..300 LOOP
INSERT INTO emp VALUES(lpad(i,5,0),’TEST’ || lpad(i,5,0),i,’東京’);
END LOOP;
COMMIT;
END;
/
PL/SQL procedure successfully completed.
FOR i IN 1..300 LOOP
INSERT INTO emp VALUES(lpad(i,5,0),’TEST’ || lpad(i,5,0),i,’東京’);
END LOOP;
COMMIT;
END;
/
PL/SQL procedure successfully completed.
データの確認
SELECT COUNT(*) FROM emp;
COUNT(*)
———-
300
COUNT(*)
———-
300
ヒアドキュメントでsqlplusを実行する方法1
cd /tmp
vi TestSqlplus.sh
vi TestSqlplus.sh
#!/bin/bash
sqlplus -s user_name/password@go <<EOF
SELECT COUNT(*) FROM emp;
EOF
exit $?
sqlplus -s user_name/password@go <<EOF
SELECT COUNT(*) FROM emp;
EOF
exit $?
COUNT(*)
———-
300
———-
300
ShellでSQLファイルを実行する方法2
#!/bin/bash
selFile=/tmp/selectEmp.sql
echo -e “SELECT COUNT(*) FROM emp;\n exit” > ${selFile}
sqlplus -s user_name/password@go @${selFile}
exit $?
selFile=/tmp/selectEmp.sql
echo -e “SELECT COUNT(*) FROM emp;\n exit” > ${selFile}
sqlplus -s user_name/password@go @${selFile}
exit $?
COUNT(*)
———-
300
———-
300
パイプで実行SQLを渡してsqlplusを実行する方法3
直接SQLの内容を渡す方法
#!/bin/bash
(
for ((i=0;i<3;i++)); do
echo -e “SELECT COUNT(*) FROM emp;\n”
done
echo “exit”
) | sqlplus -s user_name/password@go
exit $?
(
for ((i=0;i<3;i++)); do
echo -e “SELECT COUNT(*) FROM emp;\n”
done
echo “exit”
) | sqlplus -s user_name/password@go
exit $?
以下の結果は3回を取得できます。
COUNT(*)
———-
300
COUNT(*)
———-
300
変数を作成してから、実行する。
#!/bin/bash
sql=””
for ((i=0;i<3;i++)); do
sql=”${sql}SELECT COUNT(*) FROM emp;\n”
done
sql=”${sql}exit”
echo -e “${sql}” | sqlplus -s user_name/password@go
echo $?
sql=””
for ((i=0;i<3;i++)); do
sql=”${sql}SELECT COUNT(*) FROM emp;\n”
done
sql=”${sql}exit”
echo -e “${sql}” | sqlplus -s user_name/password@go
echo $?
以下の結果は3回を取得できます。
COUNT(*)
———-
300
COUNT(*)
———-
300