2016-03-04 129 views
-1

我有一个名为table.txt的文件,它存储了表名。我希望sql更新查询从我的table.txt文件中逐个获取表名。我的代码如下:shell脚本将表名作为参数传递给sqlplus?

while read LINE1; do 
`sqlplus username/[email protected] <<END |sed '/^$/d' 
set head off; 
set feedback off; 
update &LINE1 set enterprise_id = '1234567890' where enterprise_id is NULL; 
update &LINE1 set sim_inventory_id ='1234567890'; 
COMMIT; 
exit; 
END` 
done < table.txt 

它给出一个错误sqlplus找不到。你能告诉我什么是错的吗?

+0

为什么反引号? SQL \ * Plus是否位于PATH环境变量中,并且已导出? –

+0

@AlexPoole是的,一切都很好,连接。错误在传递表名。 –

+0

“找不到sqlplus”与传递表名无关。它找不到'sqlplus'二进制文件。给出该二进制文件的完整路径,或者检查PATH是否已正确设置并导出,无论是在脚本中还是在您调用脚本的shell中。 (如果您将其设置在脚本中,如果删除反引号,则导出并不是真的必要)。 –

回答

0

这与传递表名无关。 “sqlplus not found”错误意味着它找不到该二进制可执行文件,所以它没有尝试连接或运行SQL命令。

您的shell脚本只能看到来自调用shell的环境变量(如果已导出)。如果您已修改PATH以包含sqlplus二进制文件的位置,那么您可能尚未导出它;设置后请添加export PATH

或者您可以将脚本设置为不依赖于shell环境。

export ORACLE_HOME=/path/to/oracle/installation 
export PATH=${ORACLE_HOME}/bin:$PATH 
export LD_LIBRARY_PATH=${ORACLE}/lib:${LD_LIBRARY_PATH} 

while read LINE1; do 
sqlplus username/[email protected] <<END |sed '/^$/d' 
set head off; 
set feedback off; 
update &LINE1 set enterprise_id = '1234567890' where enterprise_id is NULL; 
update &LINE1 set sim_inventory_id ='1234567890'; 
COMMIT; 
exit; 
END 
done < table.txt 

顺便说一句,更新同一个表两次是没有必要的;你可以这样做:

update &LINE1 set enterprise_id = nvl(enterprise_id, '1234567890'), 
    sim_inventory_id ='1234567890'; 

这也将是更快地从你的文件内容创建所有的更新语句的列表,并在一个单独的SQL * Plus会话中运行它们,这样你就不会反复创建和撕裂向下连接。但这超出了你所问的范围。

+0

但是Alex我写了一个选择查询,它正在这个代码之上工作。但只有这样会产生一个错误:SQL * PLUS ::未找到 –

+0

@vartikadhupar - 反引号创建另一个shell级别。如果你没有导出PATH(我能说多少次?),那么它不会被该子shell看到。如果删除反引号并不能解决问题,那么编辑该问题以显示整个脚本(如果该脚本不太长),但至少包括以前的查询和您设置和/或导出的任何变量的相关位。 –

+0

我得到了问题。它与导出ORACLE路径无关。当我将查询绑定到变量时,它会产生结果。感谢您的意见,以及:) –