2012-06-25 41 views
1

將多個值從一個變量傳遞到Oracle數據庫中的單獨記錄的最佳方式是什麼?從Shell腳本到SQLPlus的多行變量

我想借此從輸出:

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 

如何系統地分離ou t時的值,這樣我就可以創建一個看起來像這樣個人記錄:

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

我本來試圖用一個計數器while循環,但也似乎無法得到它的工作。一個確切的解決方案將是不錯的,但一些方向性的建議會一樣有用。

回答

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解析直。

1

您可以在一個單獨的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')); 

那麼您可以使用此表爲您的數據或插入,選擇從它到你的桌子; insert into my_table

select disk, value from hddlist_ext_table;