1

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 に答える