簡體   English   中英

從 Informix 中的 SELECT 語句設置 shell 變量?

[英]Setting shell variable from SELECT statement in Informix?

我正在嘗試獲取查詢結果並將結果設置為文件名的變量。 我一直在閱讀帖子,發現從選擇中讀取然后從結果中設置變量會導致問題,但是我沒有遵循如何解決它。

如果我運行直接查詢....

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

有多種方法可以回答這個問題。

我非常想說“這就是我在 20 年前(哦,悲傷;不,現在是 30 — 1986 年!)三十年前寫SQLCMD的原因”。 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 有多種變體。 你可以避開catecho (但仍然有管道存在),或者通過使用猛砸這里字符串直接到DB-Access中,或在此文件為DB-Access中的標准輸入,或創建一個somefile.sql含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進行測試,因為 SITENAME 是 Informix 的一個內置函數,它返回服務器名稱(也是一個本地可用的數據庫名稱——無處不在的stores數據庫)。 不清楚您的Site表和site_name列是否存儲該值或其他內容; 在大多數方面,這無關緊要。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM