python - 仅在通过 Python 子进程调用时出现 SQL*Loader 错误
问题描述
我有一个接收大型 csv 文件的 python 脚本,应该将数据加载到 Oracle 表中。计划是使用 SQL Loader 来完成此操作。
我安装了带有 SQL Loader 的 Instant Client 19.8。我的 Python 代码是通过这个脚本运行的
#!/bin/sh
PY=py
APP_HOME=/C/Users/.../Projects/.../updates
APP_BIN=$APP_HOME/bin
APP_LIB=$APP_HOME/lib
APP_CONFIG=$APP_HOME/config
APP_LOGS=$APP_HOME/logs
APP_DATA=$APP_HOME/data
APP_OUTPUT=$APP_HOME/output
GLOBAL_ENV_DIR=$APP_HOME/ENV
export APP_HOME
export APP_BIN
export APP_LIB
export APP_CONFIG
export APP_LOGS
export APP_DATA
export APP_OUTPUT
export GLOBAL_ENV_DIR
export LD_LIBRARY_PATH=/C/Oracle/instantclient_19_8
export PYTHONPATH=$PYTHONPATH:$APP_HOME:$APP_BIN:$APP_LIB:$APP_LIB/util:$APP_CONFIG:$APP_LOGS:$APP_DATA:$APP_OUTPUT:
echo $PYTHONPATH
echo
echo $PY $APP_BIN/update/update_processor.py --globalenvdir $GLOBAL_ENV_DIR --apphomedir $APP_HOME --date 01012020 $1 $2 $3 $4
echo
$PY $APP_BIN/update/update_processor.py --globalenvdir $GLOBAL_ENV_DIR --apphomedir $APP_HOME --date 01012020 $1 $2 $3 $4
然后,我尝试像这样运行 SQL Loader
subprocess.call('sqlldr user/pass@.../... control=config/update_processor.ctl data=data/data.dat')
并看到这个错误
Message 2100 not found; No message file for product=RDBMS, facility=ULMessage 2100 not found; No message file for product=RDBMS, facility=UL
我当然可以单独运行 SQL Loader 或从单独的 Python 脚本运行,所以我假设我的 shell 脚本中没有正确配置某些内容?
解决方案
你应该设置ORACLE_HOME
环境变量。例如,您可以在命令行中设置它:
subprocess.call('ORACLE_HOME=/path/to/oracle-home sqlldr user/pass@.../... control=config/update_processor.ctl data=data/data.dat')
推荐阅读
- python - Keras 中 Conv1D 层的输出大小
- node.js - Discordjs args 检查它是否是一个词
- web-scraping - 如何告诉Lua无限点击“加载按钮”?
- java - 方法之前的@Order (which =) 注释
- android - Android - 冷启动 - 如何避免白屏打开应用程序
- c++ - 捕捉向量.erase()
- python - conda install -c anaconda mkl-service:失败
- r - 如何使用 R 绘制直方图并为分类数据命名
- java - openshift上的Camel Netty4 TCP连接问题
- reactjs - 想知道为什么响应数据映射不是函数