- PR -

シェルにてデータ抽出をする方法

1
投稿者投稿内容
みゆきっく
会議室デビュー日: 2004/07/27
投稿数: 3
投稿日時: 2005-10-12 16:58
はじめまして。
シェル初心者です。困っているのでどなたか
アドバイスお願いします。

----------------------------------------------------------
1.シェルを実行して「sqlplus」コマンド?でOracleに接続。
2.hogeテーブルからキーになるコードを取得。
  select hoge_cd from hoge;
3.取得したコードをループしながらhoge_cdに紐付くデータを抽出。
  select huga_cd, huga_nm from hoge_cd;
~~~~~~~~
----------------------------------------------------------
このように、1度SQLを実行して取得したコードをもとに
2つめのSQLを実行するような処理はできるのでしょうか??
for...ループの途中でSQLを実行することはできないのでしょうか??

わかりにくい説明かとは思いますが
どなたかよろしくお願いします。
コブラ
ぬし
会議室デビュー日: 2003/07/18
投稿数: 1038
お住まい・勤務地: 神奈川
投稿日時: 2005-10-12 17:13
create view せんでも Oracle やと select 文の多重化できるでっしゃろ?
MySQL, PostgreSQL には到底不可能な芸当が(笑)
みゆきっく
会議室デビュー日: 2004/07/27
投稿数: 3
投稿日時: 2005-10-12 17:32
コブラさん。早速のお返事ありがとうございました。

質問の追記ですが、
for文はシェルの方で行いたいのです。
sqlplusに接続する際、結果のhuga情報をhoge_cdごとに
ファイル出力したいのです。

sqlplus -s aaa/bbb <<EOF
select hoge_cd from hoge_tbl;
exit

:
:

for
do
sqlplus -s aaa/bbb <<EOF >hoge_cd.txt
select huga_cd, huga_nm from huga_tbl
where hoge_cd = hoge_cd;
exit
done
EOF

こんな感じの雰囲気にしたいのですが。。。。
上記のロジックを実行するとうまくいきません T T
処理フロー自体見直したほうがいいのかもわからなくなりました。

すみませんがよろしくお願いします。
Yam
大ベテラン
会議室デビュー日: 2003/09/13
投稿数: 179
お住まい・勤務地: だんじり祭りの地
投稿日時: 2005-10-12 17:53
引用:

このように、1度SQLを実行して取得したコードをもとに
2つめのSQLを実行するような処理はできるのでしょうか??
for...ループの途中でSQLを実行することはできないのでしょうか??



fetch

#あんまり素気なかったので。。。

[ メッセージ編集済み 編集者: Yam 編集日時 2005-10-12 18:09 ]
今川 美保(夏椰)
ぬし
会議室デビュー日: 2004/06/10
投稿数: 363
お住まい・勤務地: 神奈川県茅ヶ崎市
投稿日時: 2005-10-12 18:30
こんなんどうですか?
C:\testディレクトリ配下に
テーブル毎のテキストファイルができて、
その中に件数が出力されているってPL/SQLを書いてみました。
参考にして手直しなどしてもらえれば・・・いけるのかな?
#Oracle9iR2で実行テストしました。


コード:

create or replace directory TEMP_DIR as 'c:\test';
grant read on directory temp_dir to UserName;
grant write on directory temp_dir to UserName;


DECLARE
CURSOR c1 is
SELECT tname FROM tab ;
name VARCHAR(100) ;
trow varchar(10) ;
fp utl_file.file_type ;
BEGIN
OPEN c1;
WHILE TRUE LOOP
FETCH c1 INTO name;
EXIT WHEN c1%NOTFOUND;

fp := UTL_FILE.fopen('TEMP_DIR' ,name || '.txt', 'w', 10 ) ;

EXECUTE IMMEDIATE 'select to_char(count(*)) from ' || name INTO trow ;
UTL_FILE.put_line(fp, trow) ;

UTL_FILE.FCLOSE(fp) ;
END LOOP;
CLOSE c1;
END;



[ メッセージ編集済み 編集者: 夏椰【SUICA】 編集日時 2005-10-12 18:42 ]
みゆきっく
会議室デビュー日: 2004/07/27
投稿数: 3
投稿日時: 2005-10-12 18:58
Yamさん・夏椰さん。
ありがとうございました!
早速やってみます!!
1

スキルアップ/キャリアアップ(JOB@IT)