Bash脚本向Oracle SQL*Plus传递变量时重复索要参数问题求助
问题原因
你遇到的二次输入变量提示,核心原因是SQL脚本中多余的define语句调用了未定义的变量:
从shell命令行传递给sqlplus的两个参数$asnid、$date,在SQL脚本中默认对应位置参数&1(第一个入参)和&2(第二个入参)。你编写的define asnid = &asnid语句里,右侧的&asnid不属于sqlplus预定义变量,也没有提前赋值,Oracle检测到未赋值的&开头变量就会自动触发输入提示。
修复方案
方案1:直接删除多余define行,使用默认位置参数
修改你的.sql脚本为以下内容即可,不需要额外自定义变量:
-- 注意替换示例中的保留字table为你实际的表名,不要用Oracle保留字作为表名/字段名 update 实际表名 set date = '&2' where asnid = '&1'; COMMIT; exit;
方案2:保留自定义变量名,用位置参数赋值
如果希望脚本可读性更高,保留asnid、date的自定义变量名,就把define语句的右侧改为对应的位置参数:
define asnid = &1 define date = &2 update 实际表名 set date = '&date' where asnid = '&asnid'; COMMIT; exit;
注意事项
- 如果执行update时出现日期格式不匹配的报错,可以在SQL脚本开头加一行
alter session set nls_date_format='DD-MM-YY';指定会话日期格式,和你传入的DD-MM-YY格式对齐。 - 不需要sqlplus输出多余交互信息的话,可以在shell脚本的sqlplus调用时加
-s参数开启静默模式:sqlplus -s data/base@srvc @./sql.sql $asnid $date
内容的提问来源于stack exchange,提问作者LJMurru
相关产品推荐
相关产品推荐

