1

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

我想从以下位置获取输出:

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 循环,但似乎无法让它工作。一个确切的解决方案会很好,但一些方向性的建议也会有帮助。

4

3 回答 3

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可能更简单。awkread

于 2012-06-25T17:03:21.560 回答
2

您可以将输出重定向到文件,然后使用外部表

它应该看起来像这样:

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;
于 2012-06-25T17:02:55.007 回答
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 更适合此目的。

于 2012-06-25T16:32:48.963 回答