Bash Oracle 连接执行多个查询
Bash Oracle connection execute multiple queries
我是 bash 中的 oracle 编程新手,我必须创建一个函数来读取 CSV 并更新 Oracle 数据库中的 table,到目前为止它正在运行。
我使用了这里的教程:https://zwbetz.com/connect-to-an-oracle-database-and-run-a-query-from-a-bash-script/
密码是:
export ORACLE_SID=$OSID
export ORACLE_HOST=$HOST
export ORACLE_PORT=$PORT
export ORACLE_DATABASE=$DB
export ORACLE_USERNAME=$USER
export ORACLE_PASSWORD=$PW
while IFS="|" read -r col1, col2, col3; do
sql="INSERT INTO my_table(col1, col2, col3)
VALUES ('$col1',
'$col2',
'$col3');"
echo -e "SET PAGESIZE 0\n SET FEEDBACK ON\n $sql" | \
sqlplus -S -L "$ORACLE_USERNAME/$ORACLE_PASSWORD@(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=$ORACLE_HOST)(PORT=$ORACLE_PORT))(CONNECT_DATA=(SERVICE_NAME=$ORACLE_DATABASE)))"
done < $INPUT_ADD
查询是用这个命令发送的:
echo -e "SET PAGESIZE 0\n SET FEEDBACK ON\n $sql" | \
sqlplus -S -L "$ORACLE_USERNAME/$ORACLE_PASSWORD@(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=$ORACLE_HOST)(PORT=$ORACLE_PORT))(CONNECT_DATA=(SERVICE_NAME=$ORACLE_DATABASE)))"
我不确定的是,sqlplus 是否总是为每次执行查询打开一个新的数据库连接?如果是这样,是否可以保持连接打开并在 while 循环结束时关闭连接?
感谢您的帮助!
您可以在 while 循环中生成包含所有插入内容的 sql 文件,最后在循环外调用 sqlplus 并将该文件作为输入。现在你只连接一次。
一种更简单的 *nix 方法是:
awk '{transform-magic}' file.csv | sqlplus <connect-info>
但我更愿意推荐现有的工具来完成这项工作。
- sqlldr - SQL*装载机
- https://github.com/csv2db/csv2db
- Oracle 外部表(将 csv 文件视为 Oracle table 并将 SQL 用于 DML)
祝你好运!
非常感谢您提示创建包含查询的文件。
最后,我能够使用 HERE 命令按照以下方式进行操作:
sqlplus -L "$ORACLE_USERNAME/$ORACLE_PASSWORD@(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=$ORACLE_HOST)(PORT=$ORACLE_PORT))(CONNECT_DATA=(SERVICE_NAME=$ORACLE_DATABASE)))" << HERE
start tmp_query.sql
quit
HERE
我是 bash 中的 oracle 编程新手,我必须创建一个函数来读取 CSV 并更新 Oracle 数据库中的 table,到目前为止它正在运行。 我使用了这里的教程:https://zwbetz.com/connect-to-an-oracle-database-and-run-a-query-from-a-bash-script/
密码是:
export ORACLE_SID=$OSID
export ORACLE_HOST=$HOST
export ORACLE_PORT=$PORT
export ORACLE_DATABASE=$DB
export ORACLE_USERNAME=$USER
export ORACLE_PASSWORD=$PW
while IFS="|" read -r col1, col2, col3; do
sql="INSERT INTO my_table(col1, col2, col3)
VALUES ('$col1',
'$col2',
'$col3');"
echo -e "SET PAGESIZE 0\n SET FEEDBACK ON\n $sql" | \
sqlplus -S -L "$ORACLE_USERNAME/$ORACLE_PASSWORD@(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=$ORACLE_HOST)(PORT=$ORACLE_PORT))(CONNECT_DATA=(SERVICE_NAME=$ORACLE_DATABASE)))"
done < $INPUT_ADD
查询是用这个命令发送的:
echo -e "SET PAGESIZE 0\n SET FEEDBACK ON\n $sql" | \
sqlplus -S -L "$ORACLE_USERNAME/$ORACLE_PASSWORD@(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=$ORACLE_HOST)(PORT=$ORACLE_PORT))(CONNECT_DATA=(SERVICE_NAME=$ORACLE_DATABASE)))"
我不确定的是,sqlplus 是否总是为每次执行查询打开一个新的数据库连接?如果是这样,是否可以保持连接打开并在 while 循环结束时关闭连接?
感谢您的帮助!
您可以在 while 循环中生成包含所有插入内容的 sql 文件,最后在循环外调用 sqlplus 并将该文件作为输入。现在你只连接一次。
一种更简单的 *nix 方法是:
awk '{transform-magic}' file.csv | sqlplus <connect-info>
但我更愿意推荐现有的工具来完成这项工作。
- sqlldr - SQL*装载机
- https://github.com/csv2db/csv2db
- Oracle 外部表(将 csv 文件视为 Oracle table 并将 SQL 用于 DML)
祝你好运!
非常感谢您提示创建包含查询的文件。 最后,我能够使用 HERE 命令按照以下方式进行操作:
sqlplus -L "$ORACLE_USERNAME/$ORACLE_PASSWORD@(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=$ORACLE_HOST)(PORT=$ORACLE_PORT))(CONNECT_DATA=(SERVICE_NAME=$ORACLE_DATABASE)))" << HERE
start tmp_query.sql
quit
HERE