【问题标题】:Multiple Line Variable into SQLPlus from Shell Script从 Shell 脚本到 SQLPlus 的多行变量
【发布时间】:2012-06-26 22:09:10
【问题描述】:

将多个值从一个变量传递到 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 循环,但似乎无法让它工作。一个确切的解决方案会很好,但一些方向性的建议会同样有帮助。

【问题讨论】:

    标签: oracle shell unix variables sqlplus


    【解决方案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 更适合此目的。

    【讨论】:

      【解决方案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;
      

      【讨论】:

        【解决方案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 解析可能更简单。

        【讨论】:

          猜你喜欢
          • 2013-07-08
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-07-08
          • 1970-01-01
          • 1970-01-01
          • 2020-12-06
          • 2012-05-03
          相关资源
          最近更新 更多