首页 > 解决方案 > 仅在通过 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 脚本中没有正确配置某些内容?

标签: pythonoracleshellsql-loader

解决方案


你应该设置ORACLE_HOME环境变量。例如,您可以在命令行中设置它:

subprocess.call('ORACLE_HOME=/path/to/oracle-home sqlldr user/pass@.../... control=config/update_processor.ctl data=data/data.dat')

推荐阅读