我希望从UNIX脚本中将参数传递到SQL文件中。不幸的是遇到了问题。
请参阅下面的UNIX脚本:
#!/bin/ksh
############
# Functions
_usage() {
SCRIPT_NAME=XXX
-eq 1 -o "$1" = "" -o "$1" = help -o "$1" = Help -o "$1" = HELP ]; then
echo "Usage: $SCRIPT_NAME [ cCode ]"
echo " - For example : $SCRIPT_NAME GH\n"
exit 1
fi
}
_initialise() {
cCode=$1
echo $cCode
}
# Set Variables
_usage $@
_initialise $1
# Main Processing
sql $DBNAME < test.sql $cCode > $PVNUM_LOGFILE
RETCODE=$?
# Check for errors within log file
if [[ $RETCODE != 0 ]] || grep 'E_' $PVNUM_LOGFILE
then
echo "Error - 50 - running test.sql. Please see $PVNUM_LOGFILE"
exit 50
fi
请参阅SQL脚本(test.sql):
SELECT DISTINCT v1.*
FROM data_latest v1
JOIN temp_table t
ON v1.number = t.id
WHERE v1.code = '&1'
运行UNIX脚本时收到的错误是:
INGRES TERMINAL MONITOR Copyright 2008 Ingres Corporation
E_US0022 Either the flag format or one of the flags is incorrect,
or the parameters are not in proper order.
任何人都知道我做错了什么?
谢谢!
答案 0 :(得分:0)
注意:虽然我不使用sql
命令,但在使用isql
命令行工具时,我会定期将UNIX参数传递给SQL模板/脚本文件,所以fwiw ..
您要做的第一件事是将&1
字符串替换为cCode
变量中的值;一种典型的方法是使用sed
进行全局搜索,并将&1
替换为${cCode}
,例如:
$ cCode=XYZ
$ sed "s/\&1/${cCode}/g" test.sql
SELECT DISTINCT v1.*
FROM data_latest v1
JOIN temp_table t
ON v1.number = t.id
WHERE v1.code = 'XYZ' <=== &1 replaced with XYZ
注意:您需要将sed
代码用双引号括起来,以便可以引用cCode
变量的值。
现在,为了将此传递到sql
,有几个选项...将sed
输出捕获到新文件并将该文件提交到sql
或... [而且我猜这是可行的sql
],将sed
输出传输到sql
,例如:
sed "s/\&1/${cCode}/g" test.sql | sql $DBNAME > $PVNUM_LOGFILE
答案 1 :(得分:0)
您可能需要在文本文件中围绕SQL使用'\ p \ g'吗?
我个人倾向于在SQL中编写脚本本身,如
#!/bin/ksh
var=01.01.2018
db=database_name
OUTLOG=/path/log.txt
sql $db <<_END_ > $OUTLOG
set autocommit on;
\p\g
set lockmode session where readlock = nolock;
\p\g
SELECT *
FROM table
WHERE date > '${var}' ;
\p\g
_END_
exit 0