从Shell脚本到SQLPlus的多行变量

时间:2012-06-25 16:05:48

标签: oracle shell unix variables sqlplus

将多个值从一个变量传递到oracle db中的单独记录的最佳方法是什么?

我想从以下输出:

hddlist=`iostat -Dl|awk '{print ""$1"="$(NF)}'

这会返回如下输出:

hdisk36=0.8
hdisk37=0.8
hdisk38=0.8
hdisk40=5.5   
hdisk52=4.9

我想将它们插入数据库中,如下所示:

sqlplus -s /nolog <<EOF1
connect / as sysdba
set verify off
insert into my_table ##Single Record Here
EOF1

如何系统地分离出值,以便我可以创建如下所示的单个记录:

 Disk         Value
---------    -------
hdisk36       0.8
hdisk37       0.8
hdisk38       0.8
hdisk40       5.5   
hdisk52       4.9

我最初尝试使用计数器进行while循环,但似乎无法使其工作。一个确切的解决方案会很好,但一些方向性的建议也会有所帮助。

3 个答案:

答案 0 :(得分:3)

循环并生成插入语句。

sql=$(iostat -Dl | awk '{print ""$1"="$(NF)}' | while IFS== read -r k v ; do
    printf 'insert into mytable (k, v) values (%s, %s);\n' "$k" "$v"
done)

此输出可以某种方式传递给sqlplus,也许就像这样

sqlplus -s /nolog <<EOF1
connect / as sysdba
set verify off
$sql
EOF1

虽然,根据iostat的行格式,可能更简单的是省略awk并直接用read解析。

答案 1 :(得分:2)

您可以将输出重定向到文件,然后使用external table

看起来应该是这样的:

CREATE TABLE hddlist_ext_table (
  disk CHAR(16),
  value CHAR(3)
  ORGANIZATION EXTERNAL (
                         TYPE ORACLE_LOADER DEFAULT DIRECTORY tab_dir
                         ACCESS PARAMETERS (RECORDS DELIMITED BY NEWLINE
                                            FIELDS TERMINATED BY '=')
                         LOCATION ('your_file_name'));

然后您可以将此表用于您的数据,也可以从中将其插入到您的表中; 插入my_table

select disk, value from hddlist_ext_table;

答案 2 :(得分:1)

您可以在Oracle中的单个SQL语句中插入多行,如下所示

 INSERT ALL
    INTO mytable (column1, column2, column3) VALUES ('val1.1', 'val1.2', 'val1.3')
    INTO mytable (column1, column2, column3) VALUES ('val2.1', 'val2.2', 'val2.3')
    INTO mytable (column1, column2, column3) VALUES ('val3.1', 'val3.2', 'val3.3')
  SELECT * FROM dual;

如果您打算每隔一段时间自动运行此脚本,然后查看每个磁盘的结果,您可能需要其他列来保存日期和时间。

您也可以查看sqlldr,因为您可以指定一个控制文件,告诉它您的数据包含什么,然后这会将数据加载到表中。如果要加载大量数据而不是SQL Plus,它更适合于此目的。