【问题标题】:How to pass parameter into SQL file from UNIX script?如何将参数从 UNIX 脚本传递到 SQL 文件?
【发布时间】:2018-04-28 15:53:16
【问题描述】:

我希望将一个参数从我的 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.

有人知道我做错了什么吗?

谢谢!

【问题讨论】:

  • @mathB 在 sql 行中使用了重定向符号 (" $PVNUM_LOGFILE”。不知道是不是这个问题?
  • 我不熟悉错误,您是否以正确的格式传递参数?也试试这个:在您的 SQL 文件 test.sql 中,将 '&amp;1' 更改为 'VaLuE' 并在执行 sql 之前,插入此命令:sed 's/VaLuE/$cCode/' /full/path/to/test.sql 并在您的主进程中,删除 $cCode 并发送 SQL 文件直。

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


【解决方案1】:

注意:虽然我不使用 sql 命令,但在使用 isql 命令行工具时,我会经常将 UNIX 参数传递到 SQL 模板/脚本文件中,所以fwiw ...

您要做的第一件事是将&amp;1 字符串替换为cCode 变量中的值;一种典型的方法是使用sed 进行全局搜索并将&amp;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

【讨论】:

    【解决方案2】:

    您可能需要在文本文件中的 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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-07-10
      • 2022-09-27
      • 2016-12-01
      • 1970-01-01
      • 1970-01-01
      • 2021-02-15
      • 1970-01-01
      • 2018-03-02
      相关资源
      最近更新 更多