【发布时间】:2020-12-06 17:25:44
【问题描述】:
我正在使用属性文件来获取数据库连接值,下面是 shell 脚本文件。
....
read -p "Please enter start date and end date " para1 para2
source database.prop
for ((i=1;i<=$Dbcount;i++ )); do
sqlplus -S ${user1}/${Password}@${conn} <<EOF &
spool sqlcsvdb_"$i".csv
@squery.sql $para1 $para2
exit;
EOF
done
....
squery.sql 文件。
....
SET PAGESIZE 50000
SET COLSEP "|"
SET LINESIZE 20000
SET headsep ON
SET FEEDBACK OFF
SET TRIMSPOOL ON
SET TRIMOUT ON
set verify off
SELECT id|| '|'||date|| '|'|| appid from table where date between '¶1' and '¶2';
exit;
EOF
....
当我执行 shell 时,它没有传递变量值并在第 1 行得到 ERROR:ORA-01722: invalid number 错误消息。 请帮助我解决这个问题以及绑定变量的使用。
【问题讨论】:
-
$para1 和 $para2 设置在哪里,您在 SQL*Plus 调用之前检查它们是否正确?如果它们代表日期,它们是什么格式的? (您可能应该在通话中引用它们,如
@$para1",但不太可能是问题所在。)当您更改发布的 SQL 时,您确定您的真实版本在替换变量周围有单引号 -那些应该在to_date()调用中,除非参数格式允许您使用日期文字? -
实际上你也没有定义
&para1,你的真实脚本中真的有&1吗?很难从中看出你真正在做什么。不过,设置验证可能会更清楚地说明出了什么问题。如果没有,那么你需要举一个更现实的例子。只要您始终如一地合法地更改名称和数据就可以了... -
看起来像许多其他关于将 CMD 参数传递到 SQLPlus 的问题的重复。喜欢stackoverflow.com/questions/18620893/… 和stackoverflow.com/questions/40989668/…
-
@Dornaut,我检查了上面的链接,但我使用的是相同的方式,但我仍然收到绑定变量未定义的错误消息。
-
@AlexPoole,日期参数动态传递,日期验证与数据库日期格式相同,在我的脚本中工作正常,阅读 -p "请输入开始日期和结束日期" para1 para2,通过日期参数与 DB 日期格式相同。
标签: oracle shell unix oracle-sqldeveloper sqlplus