• 締切済み

NETCOBOLでFETCHのネストはできますか

VBでいう、最初のSQL発行でデータ抽出、ループしながら、入れ子のSQL発行をするような処理がNETCOBOLで苦戦しています。複数のカーソルオープンはできないのでしょうか。WindowsのVer10です。

みんなの回答

  • lzNBGOo0
  • ベストアンサー率0% (0/0)
回答No.3

当方の環境、データベースはSQLSERVERで以下のようにしています。 <カーソル名>と <SQL文識別子>を切り替えるのがポイントです。 面倒なので、<カーソル名>と <SQL文識別子>は同じ名称を指定 しています。 1.事前の設定として、ODBC情報設定ツール[SQLDBCS.EXE]で、INIファイルを開き、 [拡張オプション]ボタン-カーソル同時実行-ROWVER に設定します。 2.COBOLのソースでは、動的SQLでカーソルを開くものとします。 *> カ-ソル定義の準備(PROCEDURE DIVISION.直下に記述しています) *> 同時に開く数を定義 EXEC SQL DECLARE CURSOR1 CURSOR FOR CURSOR1 END-EXEC. EXEC SQL DECLARE CURSOR2 CURSOR FOR CURSOR2 END-EXEC. *> カ-ソル1の定義とオープン *> SQL-TXT はSQL文を編集するための作業項目 *> SQL-TXT-PはSQL文を編集するための作業項目 MOVE SPACE TO SQL-TXT. MOVE 1 TO SQL-TXT-P. STRING "SELECT [CODE1] FROM [TABLE1] ORDER BY [CODE1];" DELIMITED BY SIZE INTO SQL-TXT POINTER SQL-TXT-P. EXEC SQL PREPARE CURSOR1 FROM :SQL-TXT END-EXEC. EXEC SQL OPEN CURSOR1 END-EXEC. <<エラー処理>> *> カ-ソル1のFETCH EXEC SQL FETCH CURSOR1 INTO :CODE1 END-EXEC. <<終了判定>> <<エラー処理>> *> カ-ソル2の定義とオープン *> カーソル1から取得した値で、カーソル2のSQL文組み立てます MOVE SPACE TO SQL-TXT. MOVE 1 TO SQL-TXT-P. STRING "SELECT [CODE2] FROM [TABLE2] " WHERE [CODE1]=? " " ORDER BY [CODE2];" DELIMITED BY SIZE INTO SQL-TXT POINTER SQL-TXT-P. EXEC SQL PREPARE CURSOR2 FROM :SQL-TXT END-EXEC. EXEC SQL OPEN CURSOR2 USING :CODE1 END-EXEC. <<エラー処理>> *> カ-ソル2のFETCH EXEC SQL FETCH CURSOR2 INTO :CODE2 END-EXEC. <<終了判定>> <<エラー処理>>

COBOL-fan
質問者

お礼

カーソル同時実行-ROWVERに設定することが必要なんですね。 早速行ってみます。大変参考になりました。 ありがとうございました。

  • SaKaKashi
  • ベストアンサー率24% (755/3136)
回答No.2

どんなソースの記述なのか見せてもらえませんか?

  • SaKaKashi
  • ベストアンサー率24% (755/3136)
回答No.1

RDBMSでしょ。できますよ。

COBOL-fan
質問者

お礼

ご回答に対するお礼 あれから1ヶ月の間に回答があったのはあなただけでした。解決には至りませんでしたが、どなたか私の質問を見てくれた意味ですごく嬉しくなりました。ありがとうございました。

COBOL-fan
質問者

補足

ご回答ありがとうございます。 私も言語ツールが違ってもRDBMSという特性を信じています。しかし、NETCOBOLでは外側カーソルのSQL発行は問題ありませんが、内側カーソルでの応用が効かないです。簡単なサンプルコードでカーソルのネストを教えていただけませんか。

関連するQ&A

  • カーソルについて

    カーソルってオープン時に該当データの全レコードセットを取得するんでしょうか?。 PL/SQLでVIEWのカーソルをオープンし、ループ処理を行っているんですが、処理速度からして1フェッチごとに毎回SELECT文を発行しているように見受けられます・・・。 ソースはこんな感じです↓。 declare cursor cur_tb_1 is select * from ビュー; begin for rec_tb_1 in cur_tb_1 loop ...処理いろいろ end loop; end; また、このようなケースの場合、VIEWのSELECT結果を一時テーブルにINSERTし、そのテーブルをSELECTするカーソルを使用するほうが 作法的によいのでしょうか?

  • FETCH した行が取り出せない

    こんにちは pgAdmin3を使用しています。  条件に一致する行を複数取得して、その行に対してアップデートをかけたいです。アップデートの処理がややこしいので一文で書かず、カーソルを使用して一行づつ処理をしていきたいのですが、下記で カーソル名.列名で値の取得が出来ないようです。 missing FROM-clause entry in subquery for table "car" BEGIN;   DECLARE car CURSOR IS ~抽出条件 FETCH ALL IN car;   UPDATE ・・・ WHERE clm_name = car.clm_name CLOSE car; END;  postgresqlが不慣れで、ネットで調べては色々変えてやってみているのですが、ここで詰まってしまいました。  カーソル内のカラムの取得方法についてご教示下さる方が居れば助かります。

  • カーソルオープンの処理について

    バッチ処理をするために、DB2の埋め込みSQLを使用していますが問題があります。 処理対象のデータが大量にあるのですが、カーソルのオープン処理で時間がかかってしまうため、時間内に終了することができません。 カーソルオープン処理を早くする方法がありましたら教えていただけますでしょうか。 ちなみに、 1.取得件数とオープン処理速度は全く関係がないように見えます。 2.インデックスを貼ってみましたが、変わりませんでした。 よろしくお願いいたします。

  • VBで配列の差分を取りたいのですが

    VB2005を使用しています。 エクセルに2つのシートには更新前と更新後のデータがあって、 それの差分を取るために一度2次元配列に確保してから処理を行い たいのですが、配列を入れ子にして順にループ、比較させると時間がかかりすぎてしまいます。 どうしたらよいのでしょうか?

  • 「主キー以外重複データ(フィールド多数)」の抽出

    タイトルのような抽出方法が必要になり、その出し方で困っています フィールドが100以上ある大きなテーブルが複数(フィールド構造は全く同じ)あり、 そのレコードを一つにまとめる為重複データを抽出し削除したいのです 条件は「主キー以外の全てのフィールドのデータが一致してる重複データ」であり、 それをどうやればAccessの機能で出せるのか悩んでいます。 最初はクエリでグループ化して出そうと思ったのですがこのフィールド数では全て グループ化はできず、 VBAで一行ずつループで処理しようにもキー以外の全フィールド一致とする検索条件のSQLのWHERE式が複雑すぎると出て処理できませんでした フィールド数が多大なテーブルで主キー以外完全一致の重複レコードをうまく抽出するにはどうすればいいのでしょうか?

  • PL/SQLでmdb(Access)ファイルへの書き込みは可能?

    あまりPL/SQLに関して知識がないので 可能なのかを教えていただきたいのですが、 例えば、 Oracleのテーブルデータ(例:メッセージテーブル) をローカルの空のMDBファイルへ丸ごとコピー といった処理をVBで行っているのですが、 毎回Insertを発行しているために とても処理に時間がかかっています。 (もともとこれ自体無謀なんですが・・・) そこでPL/SQLではバルク処理?といった 高速処理もあるようで、 このVBのかわりにPL/SQLで出来ないものだろうか・・・ と単純に思ったのですが、 PL/SQLでこういったコピー処理っていうのは 可能なんでしょうか?? ご存知の方、教えていただきたいです。 よろしくおねがいします。

  • T-SQLで10万件程度のInsert処理を記述したい。

    T-SQLで10万件程度のInsert処理を記述したい。 カーソルを利用したループ処理の中で、 Insert失敗時(エラー時)のみ、そのデータだけスキップし、 次のデータ登録処理に進みたい場合、 どのように記述すればよいのでしょうか。

  • VB6からSQLServer7に加工したデータを、正常に追加できません。なぜ?

    VB6から、SQLServerに対して 加工したデータを追加するプログラムをしています。 (環境:Windows2000 Pro + VB6[SP5] + SQLServer[7.0]) 一度、「sampletable」のデータを全件削除した上で、 必ず2回以上実行するループ処理の中で、Insert文を発行しています。 がしかし、プログラム実行後にSQLServerのデータベースを検索してみると、 何故か、最後に実行したInsert文しか、正常に実行終了していないようなのです。 (最後のループ処理でInsertされたデータしか、追加されてないのです。) 何か、プログラム上で、おかしいところとか 抜けているところとかございましたら、教えて下さい。 <サンプルプログラム> ' SQL Server へ接続 Set cn = New ADODB.Connection cn.Open "Provider=SQLOLEDB;" & _ "Data Source=(localhost);" & _ "Initial Catalog=database", "login", "passwd" ' 一度、テーブルデータを削除する strSQL = "delete from sampletable" Set rs = cn.Execute(strSQL) Do 'このループ処理は、2回以上、必ず動作します。 ・・・ (データ加工処理) ・・・ ' データを追加する strSQL = "INSERT INTO sampletable(xxx, xxx, xxx) " & _ "VALUES('" + HENSUU-A + "','" + HENSUU-B + "','" + HENSUU-C + "')" Set rs = cn.Execute(strSQL) Loop ' SQL Server 接続を閉じる cn.Close

  • SQLを連続発行する時の正しい(?)書き方は?

    Microsoft Visual Basic 2010 Express の質問です。 ExcelVBAや、AccessVBAで作成したプログラムを、VBに移そうと思っています。 ネットや本のサンプルを、自分のやりたいことに修正しつつ、一応、動作としては希望通りなのですが、元々VBAで簡易に作ったものだけに、本来なら注意すべきインスタンスの管理などがおざなりになっています。 動作は一応正常ですが、果たしてこれで良いのか不安でもありますので質問させていただきます。 大抵の本やサンプルには、複数のSQLを連続で発行するようなものは載っていませんが、いくつものSQLを順次発行していく処理をする時は、どのように記述するのが正しいでしょうか? 例えば、Access2010データベース、C:\test.accdb には、別のテーブルからリンクしたテーブル genpon があるとします。これをコピーしたテーブル、tb01を作る場合、 ------------------------------------ Dim com As OleDb.OleDbCommand Dim cn As OleDb.OleDbConnection = New OleDb.OleDbConnection( _ "Provider=Microsoft.ACE.OLEDB.12.0;" & _ "Data Source=C:\test.accdb;") cn.Open() ''現在のデータを削除 com = New OleDb.OleDbCommand("DROP TABLE [tb01];", cn) com.ExecuteNonQuery() ''現在のデータを削除 com = New OleDb.OleDbCommand("SELECT * INTO [tb01] FROM [genpon];", cn) com.ExecuteNonQuery() ------------------------------------ SQLとしては、現テーブルをDROPして、SELECT * INTO を発行すれば希望通りで、上記もその通り動きますが、NEWでインスタンス作成を繰り返しているのは、やってはいけない事ではないでしょうか? さらに、例えばこのコードの続きとして、FOR~NEXTや、DO~LOOPで繰り返しを設け、その中でINSERT INTO を発行しながら、データを登録するような処理を加える場合、このままでは NEWをループの回数分、繰り返す事になります。 プロシージャの中で、ループなどで複数のSQLを発行する場合、記述として正しい作法がありましたら、教えてください。

  • SQLServer、エラーにならずに途中で終了

    VB2008,SQLServer2005でバッチ処理を作成し 下記のような処理を行っているのですが データ件数が多い時、何度行っても エラーにもならず、途中で処理が終わっているようなのですが どのような原因が考えられるのでしょうか・・・ トランザクション開始 DBからデータ取得1 データ編集1 DBへデータ登録1 ループ開始  DBからデータ取得2  データ編集2  DBへデータ登録2 ループ終了 トランザクション終了 上記のDBへデータ登録2の途中で終了してしまっているようです・・・ デバック用としてテキストファイルへの処理工程の書き出し(発行SQLなど)しているのですが 書き出さた文章が文章の途中で終わり、ファイルEOFが・・・ あいうえお と書かれるはずが あいう となってしまっています・・・ なので処理が途中で終わってしまっているのかと思っています。 ディスク容量はかなり余裕があるのでディスク容量不足ではないのですが・・・ よろしくお願いします。