如何从oracle select query获取多个列值到shell变量

时间:2015-03-26 05:59:32

标签: shell oracle11g multiple-columns

我正在尝试将具有多个列值的行提取到不同的shell变量。事实上我发现,所有列值都可以存储到单个shell变量中。但是,如何将这些列值分隔为单独的shell变量。下面是我正在尝试的一个例子

function sqlQuery {
sqlplus -S shiyas/********* <<'EOF'
set heading OFF termout ON trimout ON feedback OFF
set pagesize 0
SELECT name,open_mode from v$database;
EOF
}
OUTPUT="$( sqlQuery )"
echo $OUTPUT

这里我的输出为

ORCL READ WRITE

但我的要求是列值ORCL,READ WRITE应该分配给不同的shell变量。

我尝试了下面的解析。

echo "$OUTPUT" | while read name open_mode

但它意外结束了文件错误。

-bash-3.2$ sh call_sql_col_val_1.sh
ORCL READ WRITE
call_sql_col_val_1.sh: line 18: syntax error: unexpected end of file

请让我知道我可以使用什么概念将单行列值提取到不同的shell变量。

1 个答案:

答案 0 :(得分:0)

我自己通过eval执行此操作:

oracle@******:/*****> cat test.sh
#!/bin/bash
function sqlQuery {
sqlplus -S / as sysdba <<'EOF'
set heading OFF termout ON trimout ON feedback OFF
set pagesize 0
SELECT name,open_mode from v$database;
EOF
}
eval x=(`sqlQuery`)
NAME=${x[0]}
OPEN_MODE="${x[1]} ${x[2]}"
echo NAME IS $NAME
echo OPEN_MODE IS $OPEN_MODE

因此,我们运行上述相同的功能,将其传递到x并通过eval运行以处理分隔。然后你有一个数组,并且呼叫呼叫是这样的:例如,x[0]用于第一个项目 输出是:

oracle@******:/******> sh test.sh
NAME IS ******
OPEN_MODE IS READ WRITE