bash - Bash Oracle 连接执行多个查询
问题描述
我是在 bash 中编程 oracle 的新手,我必须创建一个读取 CSV 并更新 Oracle DB 中的表的函数,该函数目前正在运行。我已经使用了这里的教程: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*Loader
- https://github.com/csv2db/csv2db
- Oracle 外部表(将 csv 文件作为 Oracle 表查看并使用 SQL 进行 DML)
祝你好运!
推荐阅读
- javascript - 使用 Bootstrap 或 CSS 调整窗口大小时如何让子 div 保持在其他子元素之上
- python - 使用 pefile 返回 unicodeDecodeError
- asp.net-web-api2 - 通过 jQuery 调用 Web API 时出现 404 Not Found 错误
- ios - PromiseKit AnyPromise 然后崩溃 EXC_BAD_ACCESS KERN_INVALID_ADDRESS 0x0000000000000010
- python - Peewee 选择不存在子元素的元素
- r - R中的规则:升力的非常高的衡量标准
- javascript - 将不同类型的 img 设置为特定的高度
- oauth - RingCentral Glip Bot OAuth
- c# - 合并一个帐户 c# 不起作用
- javascript - ReactJS:如何让 Parent 道具在子组件中全局使用