カーソル宣言をIFで分けられませんか?

このQ&Aのポイント
  • Pro*Cでカーソルの宣言をIF文で分けようとすると、SQLの識別子を再定義しようとしましたというエラーメッセージが表示されます。
  • カーソルが取得するレイアウトが同一であり、OPEN後の処理も同じである場合、同一のカーソル名で実行したいです。
  • Oracle10.2を使用しています。
回答を見る
  • ベストアンサー

カーソル宣言をIFで分けられませんか?

よろしくお願いします。 Pro*Cで作成しているのですが、カーソルの宣言時に指定するSQLをIF文で分けようとすると、 コンパイル時に「PCC-W-02332, SQLの識別子を再定義しようとしました。」が表示されます。 IFの結果がどうであれ、カーソルが取得するレイアウトが同一かつ、OPEN後の処理も同じように処理するため、できれば同一のカーソル名で行いたいです。 以下は今の状態を簡略化したプログラミングですが、 どのように対処するのが良いのでしょう。 Oracle10.2です。 よろしくお願いします。 ------------------------------------------------------- int flg; <中略> if ( flg == 0 ) {  EXEC SQL DECLARE curname CURSOR FOR   SELECT tbl.col1, 'flgが0です' AS col2 FROM tbl  ; } else {  EXEC SQL DECLARE curname CURSOR FOR   SELECT tbl.col1, 'flgが0以外です' AS col2 FROM tbl  ; } EXEC SQL OPEN curname; EXEC SQL WHENEVER NOT FOUND DO BREAK; while(1) {  EXEC SQL FETCH rackBCCur INTO :retVals  <略> } -------------------------------------------------------

  • Oracle
  • 回答数1
  • ありがとう数1

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

  • ベストアンサー
  • matui2000
  • ベストアンサー率19% (30/155)
回答No.1

すみません。最近カーソル処理を書いてないんですが自分が思うにカーソル処理で帰ってくる行数は1行になるようSELECT文を書かなくてはいけなかった気がしますが。

xyzelixir
質問者

お礼

早速のご回答ありがとうございます。 よろしくお願いします。 恐らくINTOで指定する変数のことだと思います。 カーソルで抽出の定義をして(このときは複数行)、FETCHのところでそこから1行抽出し、INTOで指定した変数に値を入れます。 このとき、INTOで指定した変数には1行しか入りません。 なので、ほとんどの場合はFORやWHILEでループをして、毎行FETCHすることになります。

xyzelixir
質問者

補足

自己解決しました。 EXEC SQL PREPARE文を使えば良いようです。 ありがとうございました。

関連する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するカーソルを使用するほうが 作法的によいのでしょうか?

  • ストアドプロシージャ_カーソルのヒット件数

    いつもお世話になっています。 SQLServer7.0です。 ストアドプロシージャでカーソルを使用し、オープンしたカーソルの件数を調べたいのですがうまくいきません。 Declare curs2 cursor for Select [項目名] From [テーブル名] Where [検索条件] Open curs2 Print @@CURSOR_ROWS この「@@CURSOR_ROWS」変数でヒット件数を取得できるように参考書では書いてあるのですが、実際Printしてみると、カーソルをオープンする前だと 0 で、オープンした後だと-1 です。 特にエラーだとか、対象データがないというわけではありません。実際その後ヒットした件数分行う処理は正常に出来ています。 ただ、どうしても処理を行う前に件数を知りたいのです。カーソルの変数だけでは取れないとなると セレクトしたカーソルと全く同じセレクトを実行して@@ROWCOUTで取るしかないかなって思ってるのですが・・・。どうも建設的ではないなって思ってます。 カーソルの件数を取得するにはどうしたらよいのでしょうか?

  • PL/SQL カーソルのFROM句にカーソル

    もしご存知の方がいればお教えください。 ORACLE PL/SQLで CURSOR cur_a AS SELECT a FROM TBLA とカーソルを宣言し そのカーソルを他のカーソルで 使用することは可能でしょうか? 以下のような感じで CURSOR cur_B AS SELECT b FROM TBLB,cur_a ご存知の方が居たら どのようなSELECT文を 書けばよいかお教えください よろしくお願いいたします

  • ROWID型の宣言について(Pro*C)

    (Oracle9i) Pro*Cにて、ROWIDを使用したSELECT&INSERTをしたいのですが、 ホスト変数をROWID型で宣言しようとするとエラーになります。 [PCC-S-02201, 記号"rowid"が見つかりました。 次のうちの1つが入るとき~] 宣言の仕方は以下の通りです。  EXEC SQL BEGIN DECLARE SECTION;   rowid fetch_ROWID;   short fetch_ROWID_ind;  EXEC SQL END DECLARE SECTION; ROWIDという型はORACLEにあるので、なぜプリコンパイルが通らないのか 分かりません。 どなたかお分かりになる方がいらっしゃいましたらよろしくお願いいします。 ちなみに以下のような使い方をしようとしていますので、参考までに 載せておきます。  EXEC SQL DECLARE C_XXX CURSOR FOR   SELECT ・・・,ROWID FROM XXX FOR UPDATE ・・・  EXEC SQL OPEN C_XXX;  EXEC SQL WHENEVER NOT FOUND DO break;  while(1){   EXEC SQL FETCH C_XXX INTO    ・・・,    :fetch_ROWID:fetch_ROWID_ind;   EXEC SQL    UPDATE XXX    SET ・・・    WHERE ROWID=:fetch_ROWID:fetch_ROWID_ind;  }

  • 動的なSQLからカーソルを返す。

    下記のようなカーソルを返すパッケージがあったとします。 CREATE OR REPLACE PACKAGE TEST AS CURSOR C1 IS SELECT * FROM テーブル; TYPE TC1 IS REF CURSOR RETURN C1%ROWTYPE; PROCEDURE P_TEST(in条件 IN CHAR, CU OUT TC1); END; CREATE OR REPLACE PACKAGE BODY TEST IS PROCEDURE P_TEST(in条件 IN CHAR, CU OUT TC1) AS sqlStr VARCHAR2(1000); cur NUMBER; r NUMBER; BEGIN cur := DBMS_SQL.OPEN_CURSOR; sqlStr := 'OPEN CU FOR SELECT * FROM テーブル WHERE 条件 = ' || in条件; DBMS_SQL.PARSE(cur, sqlStr, DBMS_SQL.NATIVE); DBMS_SQL.DEFINE_COLUMN(cur, 1, CU); r := DBMS_SQL.EXECUTE(cur); DBMS_SQL.CLOSE_CURSOR(cur); END; SELECTした結果のカーソル(CU)をクライアントで取得したいのですけど 技術的に可能でしょうか? ストアドのコンパイル時に→DBMS_SQL.DEFINE_COLUMN(cur, 1, CU);が エラーとなります。 DBMS_SQL.DEFINE_COLUMNではカーソルタイプは取得できないとわっかたの ですがカーソルを取得する為のDBMS_SQL.DEFINE_COLUMNにかわる DBMS_SQL.?????はないでしょうか? いろいろ調べたのですが手に負えず。 どなたか教えてください。

  • T-SQLのカーソルで

    つい先日、ここで「T-SQLのカーソルにパラメータは使えますか?」という質問をして、使えることがわかって解決したんですけど、 実際にプロシージャで使ってみると、カーソルから結果が返りません。 以下のように書いています。 CREATE PROCEDURE hoge(@param1 int) AS DECLARE C1 CURSOR FOR SELECT CODE_1 FROM TableA WHERE COLUMN_1 = '0' AND COLUMN_2 = @param1 BEGIN .... END @param1をローカル変数に代入し、そのローカル変数をカーソルに書いても同じです。 また、カーソル定義の「@param1」をプロシージャ実行時の引数に渡していた数値に書き換えると結果は返ります。 T-SQLは初めてなもので原因が全く分かりません。 何が間違っているのでしょうか?

  • オラクルDB選択レコードの配列代入

    オラクル9.0にて、DB(xxxxxx)から選択したレコード項目(record) を、配列(group)に代入したいのですが、うまくいきません。 よろしくお願いします。 メイン(main) main char group[ ]; nSts = GetGroupIcids(nCountGroup); if (RT_NORMAL != nSts) { return (RT_ERROR); } レコード選択処理(GetGroupIcids) EXEC SQL INCLUDE sqlca; #include <stdio.h> #include <sys/types.h> #include "com/comdef.h" int GetGroupIcids(int nCount) { int nRtn = RT_NORMAL; int nIndex; EXEC SQL BEGIN DECLARE SECTION; char www_corp[14]; EXEC SQL END DECLARE SECTION; EXEC SQL DECLARE CUR1 CURSOR FOR SELECT record FROM XXXXXXXX; EXEC SQL OPEN CUR1; /*取得したカードIDを配列に代入*/ for (nIndex = 0; nIndex < nCount; nIndex++) { EXEC SQL FETCH CUR1 INTO :www_corp; group[nIndex]=www_corp; } EXEC SQL CLOSE CUR1; return (nRtn); }

  • PRO*Cでテーブル名にバインド変数は使えますか?

    PRO*Cのプログラムで、テーブル名とカラム名をパラメータで 受け取って、ホスト変数(バインド変数?)に代入して、 それぞれ、SELECT文等で使用できますか? PL/SQLなら出来るでしょうか? EXEC SQL BEGIN DECLARE SECTION; varchar t_name[64]; /* テーブル名 */ varchar col_name[64]; /* カラム名 */ EXEC SQL END DECLARE SECTION; /* 中略 パラメータの値をホスト変数に代入する処理を行う */ ↓以下のように出来ますか? SELECT :col_name FROM :t_name ;

  • 過去の質問を見て分からなかったSQL文があります

    お世話になります。 過去の質問の中で、文法が分からないものがあったので、教えてください。 [QNo.1118130] 全テーブルのデータの行数 という質問の中のNo.1の方の回答で次のようなSQL文がありました。 -------------------------------------------------------------------------------------- DECLARE @name nvarchar(30) DECLARE @sql nvarchar(200) DECLARE TCUR CURSOR FOR SELECT name FROM sysobjects WHERE type = 'U' OPEN TCUR FETCH NEXT FROM TCUR INTO @name -----・・・(1) WHILE (@@fetch_status <> -1) BEGIN SET @sql = 'SELECT count(*),''' + @name + ''' AS TNAME FROM '+ @name -----・・・(2) EXEC(@sql) FETCH NEXT FROM TCUR INTO @name -----・・・(3) END CLOSE TCUR DEALLOCATE TCUR -------------------------------------------------------------------------------------- (1)の部分について  "INTO @name"の部分で、@name には何を入れているのでしょうか? (2)の部分について  最初の 'SELECT count(*),'の部分は分かるのですが、これ以降で"'(シングルクォーテーション)"が沢山あって、何を囲っているのか分かりませんでした。  ("'"が多用されていて分かりませんでした) (3)の部分について  (1)と全く同じ文ですが、(1)と(3)でやっていることは違うのでしょうか。 すみませんが、アドバイスお願いします。

  • aes_decryptでsyntax error

    はじめまして。 mysql 4.0.26でaes_decryptを使うとsyntax errorとなってしまいます。(mysql4.0.26+phpMyAdmin 2.6.4-pl2) aes_decryptに関してはこのサイト及びGoogleで調べていろいろ試したのですが実行することができませんでした。 皆様のお知恵を拝借したく質問を作成させていただきました。 ご教授の程よろしくお願いいたします。 -- 実行したソース -- select col1, aes_decrypt(col2, 'key') as col2 from tbl; -- エラーメッセージ -- #1064 - You have an error in your SQL syntax. Check the manual that corresponds to your MySQL server version for the right syntax to use near '( col2 , 'key' ) as col2 from tbl LIMIT 0, 30' at line 1 以下のソースを実行するとエラーが発生することなく終了しますが、 最後のdrop table文を削除すると上記のエラーが発生します。 --- 以下ソース --- create table tbl( col1 integer, col2 tinyblob ); insert into tbl(col1, col2) values (1, aes_encrypt('test','key')); select col1, aes_decrypt(col2, 'key') as col2 from tbl; drop table tbl; --- 上記ソースを実行したときのphpmyadminのメッセージです -- SQL 照会が正常に実行されました 実行した SQL 照会: CREATE TABLE tbl( col1 integer, col2 tinyblob );# MySQLが空の値を返しました。(例えば行が空とか). INSERT INTO tbl( col1, col2 ) VALUES ( 1, aes_encrypt( 'test', 'key' ) ) ;# 影響された行数:1 SELECT col1, aes_decrypt( col2, 'key' ) AS col2 FROM tbl;# 行: 1 DROP TABLE tbl;# MySQLが空の値を返しました。(例えば行が空とか). --