我正在尝试获取查询结果并将结果设置为文件名的变量。 我一直在阅读帖子,发现从一个选择中读取然后从结果中设置一个变量会导致问题但是我没有按照如何解决这个问题。
如果我运行直接查询......
echo "SET isolation dirty read; Select * from site;" | dbaccess davedb
我得到了以下预期的响应。
site_nuber site_ID site_name
1 1 ALPHA
我已尝试使用DECLARE,INTO或AS进行以下几种变体,但没有任何效果。以下是我想要完成的要点。
#!/bin/bash
dateFormat=`date +'%Y%m%d'`
dbaccess davedb <<! 2>/dev/null
set isolation dirty read;
SELECT site_name AS $NAME
FROM site;
!
touch "/export/home/dave/"$NAME"_"$dateFormat.txt
答案 0 :(得分:1)
有各种方法可以回答这个问题。
我非常想说“这就是为什么我写了SQLCMD二十年(哦,悲伤;不,现在是三十年 - 1986年!)三十年前”。 DB-Access对于各种目的非常有用,但是这种shell脚本并不是它的强项,而SQLCMD的编写是为了弥补这一缺陷。
NAME=$(sqlcmd -d davedb -e 'set isolation to dirty read' \
-e 'select site_name from site')
假设获得SQLCMD(请注意,这不是Microsoft johnny-come-lately程序的同名)不是一个选项,那么您将需要考虑如何将DB-Access调整为提交。它尽最大努力反击!
鉴于您想要在shell变量中捕获名称,您可以使用:
cat <<'EOF' |
SET ISOLATION TO DIRTY READ;
OUTPUT TO "/dev/stdout" WITHOUT HEADINGS SELECT site_name FROM site;
EOF
dbaccess davedb - 2>/dev/null |
tr -d ' \n'
如果从命令行运行此命令,您将立即看到站点名称后面的提示符(因为所有换行符 - 其中5个 - 已被tr
命令删除),但是赢了在变量中捕获输出时很重要。
OUTPUT语句内置于DB-Access(不是数据库服务器)中。它将SELECT语句的结果写入命名文件。我将"/dev/stdout"
命名为大多数现代类Unix系统,与进程的标准输出相同。 WITHOUT HEADINGS限定符使其省略输出中的列名称。这减少了程序发出的垃圾量。如果您没有/dev/stdout
,那么您可以指定一个临时文件名,然后读取该文件 - 但这是一个麻烦。
如何将SQL提供给DB-Access有很多变种。你可以使用cat
(但那里还有一个管道),或者直接使用Bash here string进行数据库访问,或使用here document来避免使用echo
somefile.sql
DB-Access的标准输入,或者创建一个包含SQL的somefile.sql
,然后将somefile
(或者甚至只是-
)作为文件名代替dateFormat=$(date +'%Y%m%d')
NAME=$(cat <<'EOF' |
SET ISOLATION TO DIRTY READ;
OUTPUT TO "/dev/stdout" WITHOUT HEADINGS SELECT site_name FROM site;
EOF
dbaccess davedb - 2>/dev/null |
tr -d ' \n')
if [ -n "$NAME" ]
then touch "/export/home/dave/${NAME}_${dateFormat}.txt"
fi
参数
将此组合到您的脚本中,最终得到一个变体:
SELECT SITENAME FROM Systables WHERE tabid = 1
代码使用stores
进行了测试,因为SITENAME是Informix的内置函数,它返回服务器名称(以及本地可用的数据库名称 - 无处不在的Site
数据库)。目前尚不清楚您的site_name
表和char memory[sizeof(Fred)];
列是否存储该值或其他内容;在大多数方面,没关系。