如何从UNIX脚本将参数传递给SQL文件?

时间:2017-11-15 12:13:52

标签: sql sql-server unix parameters parameter-passing

我希望从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.

任何人都知道我做错了什么?

谢谢!

2 个答案:

答案 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'吗?

我个人倾向于在S​​QL中编写脚本本身,如

#!/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