PL/SQLのプロシージャ間でカーソル?の受渡
お世話になります。
親でループ対象とするカーソルを、子プロシージャで生成し
親に戻すということは可能でしょうか。
うまく伝わりにくいかと思いますので、下記にVBで行った例を記します。
親-----------------------
Sub aaa()
Dim rs As New ADODB.Recordset
Call bbb(rs)
Do Until rs.EOF
Debug.Print rs!COLUMN1
rs.MoveNext
Loop
End Sub
子-----------------------
Function bbb(ByRef rs As ADODB.Recordset)
rs.Open "SELECT * FROM TABLE1", CurrentProject.Connection
End Function
以上、お願い致します。
No.2ベストアンサー
- 回答日時:
エラーの原因は、カーソル変数の場合はforループを利用できないためだと思います。
なので、loop内fetchするようにします。
こんな感じでしょうか
--REF CUSOR宣言
CREATE OR REPLACE PACKAGE PKG_TEST_CURSOR
IS
--TYPE CUR_TEST IS REF CURSOR;
--レコード全体を取得するなら型を指定した方が楽だと思います
TYPE CUR_TEST IS REF CURSOR RETURN TEST%ROWTYPE;
END;
/
--親プロシージャ
CREATE OR REPLACE PROCEDURE PC_TEST親(PI_HIKISU1 IN TEST.TEST_COLUMN%TYPE)
IS
TEST_REC PKG_TEST_CURSOR.CUR_TEST;
-- l_test_rec PKG_TEST_CURSOR.CUR_TEST;
--CUR_TEST を型指定したのでrowtypeが使えます
l_test_rec TEST_REC%ROWTYPE;
BEGIN
PD_TEST子(PI_HIKISU1,TEST_REC);
-- FOR l_test_rec IN TEST_REC LOOP
-- dbms_output.put_line(l_test_rec.TEST_COLUMN99);
-- END LOOP;
--ref cursorの場合はforループはできないので
loop
fetch TEST_REC into l_test_Rec;
exit when TEST_REC%notfound;
dbms_output.put_line(l_test_rec.TEST_COLUMN99);
end loop;
close TEST_REC;
END;
/
--子プロシージャ
CREATE OR REPLACE PROCEDURE PD_TEST子
(
PI_HIKISU1 IN TEST.TEST_COLUMN%TYPE,
PI_TEST_RECIN OUT PKG_TEST_CURSOR.CUR_TEST)
IS
l_test_rec PKG_TEST_CURSOR.CUR_TEST;
BEGIN
OPEN l_test_rec FOR SELECT * FROM TEST WHERE TEST_COLUMN = PI_HIKISU1;
--カーソルを返すならopenするだけでいいのでは?
-- LOOP
-- EXIT WHEN l_test_rec%NOTFOUND;
-- FETCH lc_test_rec INTO PI_TEST_REC;
-- END LOOP;
END;
/
yamada_g 様
細かく教えて頂きありがとうございました。
無事に動作する事を確認できました。
ただ一部誤りがあるようでした。
--子プロシージャ
CREATE OR REPLACE PROCEDURE PD_TEST子
(
PI_HIKISU1 IN TEST.TEST_COLUMN%TYPE,
PI_TEST_RECIN OUT PKG_TEST_CURSOR.CUR_TEST)
IS
--l_test_rec PKG_TEST_CURSOR.CUR_TEST;--←直接引数に返すので必要ない
BEGIN
--OPEN l_test_rec FOR SELECT * FROM TEST WHERE TEST_COLUMN = PI_HIKISU1;
OPEN PI_TEST_REC FOR SELECT * FROM TEST WHERE TEST_COLUMN = PI_HIKISU1; --←引数に返してあげる
以上です、本当に助かりました。
No.1
- 回答日時:
この回答への補足
yamada_g様
ご回答ありがとうございます。
教えて頂いたとおりref cursorでいけそうですが
実際コーディングしたところ、うまくいきませんでした。
どこか考え方が根本的に間違ってるかもしれません。
エラーは親プロシージャで
[TEST_RECがプロシージャではないか、未定義です」と出ます。
ご指摘いただければ幸いです。
--REF CUSOR宣言
CREATE OR REPLACE PACKAGE PKG_TEST_CURSOR
IS
TYPE CUR_TEST IS REF CURSOR;
END;
--親プロシージャ
CREATE OR REPLACE PROCEDURE PC_TEST親(PI_HIKISU1 IN TEST.TEST_COLUMN%TYPE)
IS
TEST_REC PKG_TEST_CURSOR.CUR_TEST;
l_test_rec PKG_TEST_CURSOR.CUR_TEST;
BEGIN
PD_TEST子(PI_HIKISU1,TEST_REC);
FOR l_test_rec IN TEST_REC LOOP
dbms_output.put_line(l_test_rec.TEST_COLUMN99);
END LOOP;
END;
--子プロシージャ
CREATE OR REPLACE PROCEDURE PD_TEST子
(
PI_HIKISU1 IN TEST.TEST_COLUMN%TYPE,
PI_TEST_RECIN OUTPKG_TEST_CURSOR.CUR_TEST)
IS
l_test_rec PKG_TEST_CURSOR.CUR_TEST;
BEGIN
OPEN l_test_rec FOR SELECT * FROM TEST WHERE TEST_COLUMN = PI_HIKISU1;
LOOP
EXIT WHEN l_test_rec%NOTFOUND;
FETCH lc_test_rec INTO PI_TEST_REC;
END LOOP;
END;
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) access count数を変数に格納 2 2022/03/30 19:21
- Visual Basic(VBA) データベースから絞り込んでデータを読み込み 1 2023/02/21 19:51
- Access(アクセス) チェックボックスにチェックが入った後の挙動 1 2022/08/21 12:39
- Access(アクセス) 実行時エラー3131 FROM 句の構文エラーです について 7 2022/06/13 15:45
- Access(アクセス) DoCmd.SearchForRecord が動かない時の解決方法 3 2022/07/22 15:31
- Visual Basic(VBA) 動きっぱなしです。止め方とプロシージャの間違いを教えて下さい! 5 2022/08/15 23:08
- Access(アクセス) docmd.gotorecordを起動するには 5 2022/06/17 15:20
- Visual Basic(VBA) エクセルのマクロについて教えてください。 3 2023/07/07 08:37
- Visual Basic(VBA) 標準モジュール Public mOnTime As Date Sub sample() '実行プロシ 1 2023/02/22 15:44
- Visual Basic(VBA) 数字が「0」の列を削除するため、下記のコードを実行しましたが、コンパイルエラーSubまたはFunct 3 2022/12/04 00:00
このQ&Aを見た人はこんなQ&Aも見ています
-
プロが教える店舗&オフィスのセキュリティ対策術
中・小規模の店舗やオフィスのセキュリティセキュリティ対策について、プロにどう対策すべきか 何を注意すべきかを教えていただきました!
-
PL/SQLカーソルの2重FORループができません
Oracle
-
カーソル0件の時にエラーを発生させる
Oracle
-
[PL/SQL]REFCURSORが戻り値のプロシージャについて
その他(プログラミング・Web制作)
-
-
4
SELECT INTOで一度に複数の変数へ代入をするにはどのようにすれがよいでしょうか?
PostgreSQL
-
5
PL/SQL内の共通関数の引数にフェッチしたレコードごと渡すのは可能?
Oracle
-
6
PL/SQLのコンパイルエラーについて(ignored)
Oracle
-
7
SQLローダーCSV取込で、囲み文字がデータ中に入っている場合について
Oracle
-
8
Oracle 2つのDate型の値の差を「分」で取得したい
その他(データベース)
-
9
PL/SQLでログを確認したい。
Oracle
-
10
Statement ignored というエラー
Oracle
-
11
PL/SQLをWindowsのBATファイルで実行するには
Oracle
-
12
ストアドファンクションの実行
Oracle
-
13
SQL*LoaderでCSVから指定した列のみインポートしたい。
Oracle
-
14
PL/SQLによるCREATE TABLE後のINSERTができない
Oracle
関連するカテゴリからQ&Aを探す
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
引き渡したループ処理で変数がn...
-
プログラムの素朴な質問です 分...
-
【VB6.0】 あるフォームから他...
-
【VBScript】変数のスコープ
-
引数
-
【HTML、VBScript】HTAアプリケ...
-
SOP
-
プロシージャまたは関数の引数...
-
ドラゴン曲線を再帰で書く
-
VBA public変数はどのようなこ...
-
【VB.NET】テキストボックスに...
-
C言語のサフィックスについて
-
アクセスできない保護レベルエ...
-
コンボボックスからテキストボ...
-
VBAでcallで呼び出したsubを終...
-
ユーザーフォームへのデータ入...
-
チェックボックスを操作できな...
-
エクセルVBAでテキストボッ...
-
String型の値にスラッシュをつ...
-
VBAで入力数値について
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
【VB6.0】 あるフォームから他...
-
プログラムの素朴な質問です 分...
-
プロシージャまたは関数の引数...
-
定数を構造体で・・・
-
パーソナルXLSBのfuctionを呼び...
-
PL/SQLのプロシージャ間でカー...
-
【VBScript】変数のスコープ
-
プロシージャを呼び出したプロ...
-
VB6のFriendについて
-
【HTML、VBScript】HTAアプリケ...
-
C++からfortran77を呼び出す
-
HTML + VBScript で Sleep でき...
-
Excel VBA カーソルを当てた際...
-
subプロシージャーですか?sub...
-
変数を複数のモジュール間で共...
-
整数を二つ読み込み、それらの...
-
VB2010からPROCEDUREを実行でエ...
-
ExcelのVBA。Staticな変数について
-
Excel vba で複数のテキストの...
-
VBA public変数はどのようなこ...
おすすめ情報