• ベストアンサー

SPOOLのファイル名

スプールのファイル名にバインド変数の内容を使うことはできるでしょうか? 下記のように使用すると、SPOOLファイルが作成されませんでした。 20050322.TODAYといった具合に SYSDATEに応じてファイル名を可変にしたいのですが。。 どなたかご教示いただければ幸いです。 ============================================== WHENEVER OSERROR EXIT FAILURE ROLLBACK WHENEVER SQLERROR EXIT FAILURE ROLLBACK VARIABLE V_SYSDATE VARCHAR2(8); BEGIN SELECT TO_CHAR(SYSDATE,'YYYYMMDD') INTO :V_SYSDATE FROM DUAL; END; / SPOOL :V_SYSDATE.TODAY SPOOL OFF EXIT;

質問者が選んだベストアンサー

  • ベストアンサー
  • taka_tetsu
  • ベストアンサー率65% (1020/1553)
回答No.1

一旦、固定のファイル名に"spool SYSDATEの結果"を出力し、それを読み込む set heading off set feedback off set trimspool on set termout off set pages 0 set line 9999 spool c:\spooltemp.txt SELECT 'spool c:\' || TO_CHAR(SYSDATE,'YYYYMMDD') || '.txt' FROM DUAL; spool off @c:\spooltemp.txt select * from emp; spool off exit

n-nen
質問者

お礼

ご回答ありがとうございました。 この方法でこちらの要件を実現できそうです。

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (1)

  • GoF
  • ベストアンサー率37% (34/91)
回答No.2

OTNのCodeTips #Tips759 に、そのものがあります。 短いので引用できるのですが、 何か問題あるかもしれませんので、ご自分で見てください。 (要ユーザ登録)

参考URL:
http://otn.oracle.co.jp/sample_code/code/index.html
n-nen
質問者

お礼

ご回答ありがとうございます。 まさに、求めていた答えで、目から鱗です。 ありがとうございました。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • 動的にSPOOLファイルのファイル名を生成したい

    実行するSQLは同じだが、実行するタイミングによってSPOOLファイルのファイル名を変更したい。 たしかdefineコマンドでできた記憶があるがうまくいかない。 そもそもコマンドが間違っているような気もします。 ご教授ください。 sqlplus user/user @file SPOOLファイル名 @file ----------------------------------------------- set difine SPOOL_FILE = &1 SELECT .... FROM .... spool SPOOL_FILE / sppol off 文字列開始 "SPOOL_FILE..."は長すぎます。最大サイズは1文字です。 SP2-0332:スプールファイルが作成できません。

  • sqlのエラーハンドリングについて質問です。

    シェルからsqlplusを実行し、そのsqlplusで発生したエラーをハンドリングするために、 出力内容をORACLEエラーコード(ORA-xxxxx)、SQLPLUSエラーコード(SP2-xxxxx) で検索して判定しています。 また、SQLで何らかのエラーが発生した際に処理を終了させるために、 SQL実行前に whenever sqlerror exit; whenever oserror exit; を定義しています。 何らかのエラーが発生した際は、ORACLEエラーコード(ORA-xxxxx)、SQLPLUSエラーコード(SP2-xxxxx) が出力されるため、エラーハンドリングは可能と考えているのですが、 sqlplusのstartコマンドでsqlファイルを実行した場合のみ、エラーコードが出 力されないため、ハンドリングできません。 ■実行例 SQL> start 存在しないsqlファイル O/Sメッセージ:No such file or directory 切断しました。 試しにwhenever oserror exit;の記述を削除したところ SP2-0130が出力されエラーハンドリングできました。 whenever oserror exit; の記述があるとエラーコードが出力されないのはなぜでしょうか??

  • startup、shutdownコマンド実行時のエラーでもリターンコードは0

    whenever oserror exit failure whenever sqlerror exit failure を付けていても startupコマンドもしくはshutdownコマンドを実行してエラーが発生した場合、リターンコードは0になってしまいます (alter database openのようにalter文を使うと、リターンコードは0以外になります)。 これは仕様なのでしょうか? [環境] OS:Solaris9 DB:Oracle9i

  • プロシージャの戻り値を取得する方法

    perlからSQLPLUS->プロシージャを実行してその戻り値を取得。 戻り値が0なら次の処理へ、0以外ならエラー処理へというようなことをやりたいと思っています。 perlの実行コマンドは以下。 $sqlcmd = "sqlplus$DBUSER$PASS\@DB_ALIAS\@$SQLFILE $OUTFILE"; $sql_ret = system("$sqlcmd") >>8; この$sql_retにプロシージャの戻り値が入るようにしたいのです。 プロシージャを実行する$SQLFILEは以下のようなSQLです。 --------------------------------------------------- set serveroutput on WHENEVER SQLERROR EXIT 1 spool &1; DECLARE RetVal NUMBER; BEGIN RetVal := 実行ストアドファンクション; END; / spool off; EXIT SQL.SQLCODE; ---------------------------------------------- エラーが起きたときにファンクションは1を返すようにしているのですが、 それがSQLPLUSの実行結果の戻り値に反映されません。 どうしたらいいのでしょうか? よろしくお願いします。

  • ファイル名の変換

    たびたびですいませんが、まったくの初心者で全然わからずお手上げ状態で困っています。よろしくお願いします 「以下のプログラムで入力ファイル名をID(ref|~~|の~~の部分のことです、例えばNP_000166.2.txtなど)の形に変更しなさい」といった作業をしたいのです。 #include <stdio.h> #include <string.h> #include <stdlib.h> #define MAX_LEN 256 int main(int argc, char *argv[]) { FILE *rfp; FILE *wfp; int i, score; double evalue; char id[MAX_LEN], name[MAX_LEN], fname[MAX_LEN]; if (argc != 2){ printf("エラー:プログラム名 入力ファイル\n"); return(0); } if((rfp = fopen(argv[1], "r")) == NULL) { printf("入力ファイルが存在しません。\n"); return (EXIT_FAILURE); } i = 0; while (fscanf(rfp,"%s\t%s\t%d\t%f", id, name, &score, &evalue) != EOF){ sprintf(fname,"files/%d.txt",i); if ((wfp =fopen(fname,"w")) == NULL) { printf("出力ファイルが存在しません\n"); return (EXIT_FAILURE); } fprintf(wfp,"%s\t%s\t%d\t%f", id, name, score, evalue); fclose(wfp); i++; } fclose(rfp); return (EXIT_SUCCESS); }

  • oracleのPL/SQLのEXIT戻りでエラーが

    PL/SQLを実行したのですが、EXITの終了でエラーがとなってしまいます。エラーがでます。 being~endを書いてしてPL/SQLを実行しているのですが、 being~endのPL/SQLでエラーとなった場合、EXITの終了時の戻りで以下のエラーがでます。 エラーとならないようにするにはどうしたらよいでしょうか。 SP2-0670: 内部数値変換が失敗しました。 使用方法: { EXIT | QUIT } [ SUCCESS | FAILURE | WARNING | n | 変数 | :バインド変数 ] [ COMMIT | ROLLBACK ] 実行したSQLは以下となります。 set serveroutput on exec utl_file.fremove('DATA_PUMP_DIR','hogehoge.txt'); VARIABLE rtn NUMBER DECLARE BEGIN :rtn := 0; select count(*) from d; EXCEPTION WHEN OTHERS THEN DBMS_OUTPUT.PUT_LINE(SQLCODE||','||SQLERRM); :rtn := 16; END; / EXIT :rtn →ここでエラーがでる oracleは19cです。 よろしくお願いします。

  • ファイルからの読み込み(初心者)

    #include <stdio.h> #include <stdlib.h> int main(void) { FILE *fp; char s[256]; if ((fp = fopen("memo.txt", "r")) == NULL) { printf("file open error!!\n"); exit(EXIT_FAILURE); } while (fgets(s, 256, fp) != NULL) { printf("%s", s)         } fclose(fp);         return 0; } というファイルから1行読み込むというプログラムなのですが いくらやってもファイルが開けませんにしかなりません。 ファイル名の所が間違ってるのだとは思いますが・・ ファイルはメモ帳で作った簡素なファイルで ファイル名:memo ファイルの種類:テキスト文書(*.txt) 文字コード:ANSI 保存場所はデスクトップ です どうすれば開けるようになるのでしょうか。

  • ファイル操作で全角空白を消す

    こんばんは(^o^) C言語のファイル操作について聞きたいのですが、 半角スペースを消去するところまではわかったんですけど、 全角スペースも消去するプログラムがわかりません(>_<) お手数ですが、ご指導のほうよろしくお願いしますm(_ _)m 問題 テキストファイルから空白を削除して、画面に表示するプログラムを 作成しなさい。 自分のプログラム #include <stdio.h> #include <stdlib.h> #define SIZE 15 int main(void) { char c; char finName[SIZE],foutName[SIZE]; FILE *fpin,*fpout; printf("入力ファイル名>>>"); scanf("%s",finName); if((fpin=fopen(finName,"r"))==NULL) { printf("ファイルが見つかりません。---%s\n",finName); exit(EXIT_FAILURE); } printf("出力ファイル名>>>"); scanf("%s",foutName); if((fpout=fopen(foutName,"w"))==NULL) { fclose(fpin); printf("ファイルを作成できません。---%s\n",foutName); exit(EXIT_FAILURE); } while(1) { c=fgetc(fpin); if(feof(fpin)) { break; } if(c!=' ') { fputc(c,fpout); } } fclose(fpin); fclose(fpout); return EXIT_SUCCESS; }

  • サーバ間での/var/spool/mail/の同期

    メールサーバのリプレースに伴い、CentOS5.4をインストールした2台のサーバで メールサーバを構築しようと考えています。 構築に当たって検討しているのは、  ・サーバが落ちても、メールデータは極力守りたい。 ということです。 最悪サービスは主導で切り替えれば(起動すれば)よいので、サービスの冗長性は あまり考えていません。(できるに越したことはないですが) ただ、メールのデータの消失は、業務に支障が出たりするので、極力避けたいと考えています。 SMTPサーバはPostfix、POPはDovecotです。 メールのスプールは同期時の保全も考え、MboxではなくMaildirで考えています。 要は・・・  "2台のメールサーバの/var/spool/mail/を同期したい" または、 ということです。 フォルダの同期に関しては、rsyncやlsyncでできるので、利用すればできそうなのは調査して わかっています。 ただ、データの保全という観点からすると、少々心もとない気がしています。 理由は、  ・同期間隔(たとえば10分)の間で障害が発生した場合、最後の同期から障害発生までの間は   データが抜けてしまう。  ・データ量によっては、同期に時間がかかり次の同期に間に合わないことがありそう。   2重に同期が実行された場合の挙動が不明。(よく調べていないだけかも知れないですが) というものです。 ミラーできるディスク上にNFSで共有ディスクをマウントし、2つのサーバから同じディレクトリに メールをスプールする、という方法も考えたえたのですが、メールのデータファイル名が 重複することがあるかも知れないと思い、考えを保留しています。 正直、自分のスキルと知識では限界です。 どなたかお知恵を貸していただけませんでしょうか?

  • 外部ファイルを使用するシェルの作成について

    こんにちわ。プログラミングど素人のpcunixと申します。 これまで直接シェルの中身を編集していましたが、今後利用回数が増えたことから、編集していた箇所を外部ファイル(txtでもcsvでも何でも良い)へ書き込んでおき、その内容を取り込みたいと考えております。 「今まで使用していたシェル」 #!/bin/sh echo start `date` DK_LOG_DIR=./log DK_USR=dkggapp01 DK_PWD=dkggapp01 DK_SID=${ORACLE_SID} DK_OUT_FILE=dk_grp_insert.txt sqlplus -s ${DK_USR}/${DK_PWD}@${DK_SID} << EOF > ${DK_LOG_DIR}/${DK_OUT_FILE} whenever sqlerror exit sql.sqlcode insert into DKZT_GRP ( ******************************* GRP_CD , GRP_MEI_KNJ , GRP_MEI_KNA , GRP_RYS_KNJ , GRP_RYS_KNA , GRP_KNR_KBN_CD , GRP_HJI_KHI_FLG , GRP_HJI_JNJ , BSO_CD , RRI_DEL_FLG , ******************************1 DB_RGS , DB_TRK_D , DB_TRK_JKK , DB_KSS , DB_KSN_D , DB_KSN_JKK, DB_TMP , DB_KSN_GAM_ID ) values ( ******************************* '0123456', '東京センター', 'トウキョウセンター', '営業G', 'エイギョウ', '1', '1', '', '000', '0', ******************************2 'rinji', to_char(systimestamp, 'yyyymmdd'), to_char(systimestamp, 'hh24miss'), 'rinji', to_char(systimestamp, 'yyyymmdd'), to_char(systimestamp, 'hh24miss'), to_char(systimestamp, 'yyyymmddhh24missff3'), 'DK9999B9001' ) ; commit; exit; EOF # 終了判定 DK_RET=$? if [ ${DK_RET} -ne 0 ] then echo 異常終了 ステータス=${DK_RET} exit ${DK_RET} fi echo finish `date` exit ${DK_RET} ***2の部分を外部ファイルに書き込んでおき ***1へ代入するにはどうすれば良いでしょうか? 何を書いたらよいのかわからないので全て書いたつもりですが 足りない情報があったらご指摘いただけますと幸いです。 よろしくお願いいたします。