- ベストアンサー
T-SQLのカーソルで結果が返らない問題
- T-SQLのカーソルを使用している際に、結果が返らない問題が発生しています。カーソルにパラメータを使用している場合、結果が返らない可能性があります。プロシージャでカーソルを使用する際には、パラメータをローカル変数に代入してカーソルに書き込むことができますが、それでも結果が返らないかもしれません。
- また、カーソル定義の「@param1」を実行時の引数に置き換えると結果が返ります。原因は正確には分かっていませんが、T-SQLの初心者であるため、何か間違いがある可能性があります。質問者が問題を再現できるようにカーソルの使用方法やパラメータの扱い方について説明し、問題の原因を特定するための手助けをすることが求められます。
- 質問者はT-SQLのカーソルについて初心者であり、結果が返らない問題に困っています。カーソルにパラメータを使用し、プロシージャ内でカーソルを実行する際に結果が返らないという現象が発生しており、原因が分からないため問題解決が難しい状況です。質問者が提供したコードに基づいて問題を分析し、カーソルの使用方法やパラメータの扱い方などを解説する必要があります。
- みんなの回答 (1)
- 専門家の回答
質問者が選んだベストアンサー
関連するQ&A
- 動的な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.?????はないでしょうか? いろいろ調べたのですが手に負えず。 どなたか教えてください。
- ベストアンサー
- その他(データベース)
- PL/SQLでカーソルを指定する方法
以下のSQL文で、 あるストアドプロシージャを作成し、その引数の値を WHERE句の検索条件に取ってカーソルを宣言したいので すが、どうやってもエラーが出ます。結果として カーソルで格納したデータを呼び出し元に返したいの ですが…。下記の文は間違ってますか? CREATE OR REPLACE PROCEDURE ss( quote IN NUMBER result OUT CHAR ) IS CURSOR cur IS SELECT empname FROM emp WHERE empno = quote; result cur%rowtype; BEGIN OPEN cur; LOOP FETCH cur INTO result; ~ END; どうかよろしくお願いします。
- ベストアンサー
- Oracle
- PL/SQLのカーソルについて
PL/SQLのカーソルについて お世話になります。 Oracle11gで開発しています。 初心者です。 下記ストアドプロシージャの「zokuseisyutoku」で取得した 値(入数、重量、才数、ロケーション)を受けて、別のストアドプロシージャ 「Hyouji」の変数(irisuu、jyuryou、saisuu、lokesyon)に代入して得られた 内容をGridviewに表示させたいと思っています。 現在は、別々のストアドプロシージャなのですが、 一つに出来るものなら一つのストアドプロシージャにまとめたいの ですが、どなたかご親切な方、ご教授頂きたく宜しくお願い致します。 記 (1)ストアドプロシージャ1つ目 create or replace procedure zokuseisyutoku ( sItemClass in コード表.品番%type, out_val out pls_integer, out_cursor out sys_refcursor ) as begin if sItemClass is null then open out_cursor for select 入数, 重量, 才数, ロケーション from コード表 ; else open out_cursor for select 入数, 重量, 才数, ロケーション from コード表 where 品番 = sItemClass ; end if; out_val := 1; (2)ストアドプロシージャ2つ目 create or replace procedure Hyouji ( irisuu in 部材表.入数%type, jyuryou in 部材表.重量%type, saisuu in 部材表.才数%type, lokesyon in 部材表.ロケーション%type, out_val out pls_integer, out_cursor out sys_refcursor ) as begin open out_cursor for select b.資材名,b.色,b.種類,b.サイズ,b.棚番号 FROM 部材表 a,資材項目 b WHERE a.ID = b.資材ID AND a.入数 = irisuu AND a.重量 = jyuryou AND a.才数 = saisuu AND ロケーション = lokesyon ; out_val := 1; end; end;
- ベストアンサー
- Oracle
- PL/SQLにてカーソル名を変数に
PL/SQLにて、カーソル名を変数にしたいのですが、どうすればよいのでしょうか? 具体的には以下のとおりです。 DECLARE CURSOR Cur1 IS SELECT K1,K2 FROM EMP; BEGIN FOR Cur_Rec1 IN Cur1 Cur_Rec1.K1 DBMS_OUTPUT.PUT_LINE(Cur_Rec1.K1); ★ END LOOP; END; ★の部分の「Cur_Rec1.K1」を「Cur_Rec1.K2」として、置き換えて使用したいのです。(2回書きたくない) 初心者で、申し訳ないです。どうか、ご教授ください。
- ベストアンサー
- Oracle
- PL/SQLのエラー処理について
PL/SQLを勉強し始めたのですが、テーブルを作成してから、データを流し込むという処理をしたいのですが、テーブルの作成に失敗しらたら、処理を終了させるという処理はできないのでしょうか? それとも、考え方が違うのでしょうか?アドバイスお願いします。 次のようにPL/SQLを作成しています。 例) declare curHandle1 INTEGER; begin curHandle1 := DBMS_SQL.OPEN_CURSOR; DBMS_SQL.PARSE(curHandle1, 'create table xxx as select * from xxx where ID=-1', DBMS_SQL.V7); DBMS_SQL.CLOSE_CURSOR(curHandle1); exception when OTHERS then エラーになったら、処理終了したい(次のブロックにいきたくない) end; declare begin insert into xxx NOLOGGING values (1,'test'); end; よろしくお願いします。
- ベストアンサー
- Oracle
- カーソルについて
カーソルってオープン時に該当データの全レコードセットを取得するんでしょうか?。 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するカーソルを使用するほうが 作法的によいのでしょうか?
- 締切済み
- Oracle
- ストアドプロシージャ_カーソルのヒット件数
いつもお世話になっています。 SQLServer7.0です。 ストアドプロシージャでカーソルを使用し、オープンしたカーソルの件数を調べたいのですがうまくいきません。 Declare curs2 cursor for Select [項目名] From [テーブル名] Where [検索条件] Open curs2 Print @@CURSOR_ROWS この「@@CURSOR_ROWS」変数でヒット件数を取得できるように参考書では書いてあるのですが、実際Printしてみると、カーソルをオープンする前だと 0 で、オープンした後だと-1 です。 特にエラーだとか、対象データがないというわけではありません。実際その後ヒットした件数分行う処理は正常に出来ています。 ただ、どうしても処理を行う前に件数を知りたいのです。カーソルの変数だけでは取れないとなると セレクトしたカーソルと全く同じセレクトを実行して@@ROWCOUTで取るしかないかなって思ってるのですが・・・。どうも建設的ではないなって思ってます。 カーソルの件数を取得するにはどうしたらよいのでしょうか?
- ベストアンサー
- その他(データベース)
- [PL/SQL]REFCURSORが戻り値のプロシージャについて
[PL/SQL]REFCURSORが戻り値のプロシージャについて お世話になってます タイトルの内容について、親プロシージャより引数を受け取り 子プロシージャでカーソルをオープンして、そのカーソルを親に戻す。 というプロシージャなのですが、親から実行した場合には問題ないのですが 子をSI ObjectBrowserから実行すると[実行][デバッグ]共に 押した瞬間に止まってしまいます。 下記にソースを記述します --カーソル変数の定義 CREATE OR REPLACE PACKAGE LC7BDEV.PKG_TEST_CURSOR IS TYPE TEST_TYPE IS RECORD (COL1 TABLE1.COL1%TYPE , COL2 TABLE1.COL2%TYPE ); TYPE CUR_TEST IS REF CURSOR RETURN TEST_TYPE; END; --親プロシージャ CREATE OR REPLACE PROCEDURE PD_TEST ( in_COL_KEY IN TABLE1.COL_KEY%TYPE ) IS TEST_REC PKG_TEST_CURSOR.CUR_TEST; TEMP_COL1 TABLE1.COL1%TYPE; TEMP_COL2 TABLE1.COL1%TYPE; BEGIN PD_TEST_KO(in_COL_KEY,TEST_REC); loop fetch TEST_REC into TEMP_COL1,TEMP_COL2; exit when TEST_REC%notfound; dbms_output.put_line(TEMP_COL1 || ',' || TEMP_COL2); end loop; close TEST_REC; END; --子プロシージャ CREATE OR REPLACE PROCEDURE PD_TEST_KO ( in_COL_KEY IN TABLE1.COL_KEY%TYPE , in_TEST_REC OUT PKG_TEST_CURSOR.CUR_TEST , ) IS BEGIN OPEN in_TEST_REC FOR SELECT COL1,COL2 FROM TABLE1 WHERE COL_KEY = in_COL_KEY END;
- ベストアンサー
- その他(プログラミング・開発)
- T-SQLの sp_executesql について
SQL-Serverでストアドプロシージャを作っています。 EXEC sp_executesql で検索結果をテーブル型変数に格納したいですができるのでしょうか。動的にSQLを発行し、結果を格納する必要がありますのでEXEC sp_executesqlを使わざる得ない状況です。下記にそのサンプルがあります。 Declare @tblAA Table(NO int) declare @strSQL nVarChar(1000) set @strSQL = '' set @strSQL = @strSQL + ' Insert into @tblAA' set @strSQL = @strSQL + ' Select NO from TBLBango' EXEC sp_executesql @strSQL ,N'@tblAA table(No int) OUTPUT', @tblAA OUTPUT Select * from @tblAA これを実行すろと「変数 '@tblAA' を宣言する必要があります。」というエラーがでます。 解決方法を分かる方教えてください。
- ベストアンサー
- SQL Server
- カーソルでLONG型のカラムが更新されない
お世話になります。 LONG型のカラムに長い文字列がセットされてるのですが、その文字列の中からある特定の文字列を別の文字に置換したいのです。 SELECT ~ REPLACEを使おうと思ったのですが、LONG型では使えないらしく、PLSQLにて以下のように作成しました。 DECLARE CURSOR CURSOR1 IS SELECT * FROM T_テーブル; HIGH_VALUE_WORK VARCHAR2(32760); BEGIN FOR REC_CURSOR1 IN CURSOR1 LOOP HIGH_VALUE_WORK := REC_CURSOR1.カラム; HIGH_VALUE_WORK := REPLACE(HIGH_VALUE_WORK, 'あああ', ' '); REC_CURSOR1.カラム := HIGH_VALUE_WORK; END LOOP; END; / しかしテーブルを確認しても変更されてませんでした。 更新直後に試しにセレクトかけてDBMS_OUTPUTすると正しく更新されてました。 Oracleは10gR2です。 ご存知の方どうかよろしくお願いします。
- ベストアンサー
- Oracle
お礼
私の単純なコーディングミスでした。 ありがとうございました。