CURSORを使用する際に、以下のようなことが実現できるものか分からないもので、
ご質問させていただきました。
以下のような記述で、where条件を別の変数(wk_where)に格納しておいて、
それを連結させることが可能なのかお教えいただきたいです。
もしも可能であればどのように連結させるのでしょうか?
CURSORcur出力データIS
SELECT
AAA,
BBB
FROM
AAAテーブル
;
イメージとしては以下のように考えていました。
CURSORcur出力データIS
SELECT
AAA,
BBB
FROM
AAAテーブル & wk_where
;
以上ですが、宜しくおねがいいたします。
No.1ベストアンサー
- 回答日時:
検索条件となる項目は決まっていて値のみを変えたい、というのであればカーソルにパラメータを渡すようにすれば可能です。
検索条件まるごと動的に変えたい、ということであれば明示カーソルでは出来ないと思いますが、動的SQLを使えば可能です。
以下、参考になれば。
DROP TABLE TEST_TAB PURGE;
CREATE TABLE TEST_TAB AS
SELECT 1 COL1, 100 COL2 FROM DUAL
UNION ALL SELECT 1 COL1, 101 COL2 FROM DUAL
UNION ALL SELECT 2 COL1, 200 COL2 FROM DUAL
UNION ALL SELECT 2 COL1, 201 COL2 FROM DUAL
UNION ALL SELECT 2 COL1, 202 COL2 FROM DUAL
UNION ALL SELECT 3 COL1, 300 COL3 FROM DUAL
UNION ALL SELECT 3 COL1, 301 COL3 FROM DUAL
UNION ALL SELECT 3 COL1, 302 COL3 FROM DUAL
UNION ALL SELECT 3 COL1, 303 COL3 FROM DUAL;
SET SERVEROUTPUT ON
DECLARE
--カーソルにパラメータを渡せるように定義
CURSOR C1(I_COL1 TEST_TAB.COL1%TYPE) IS
SELECT *
FROM TEST_TAB
WHERE COL1 = I_COL1; --パラメータを検索条件に使用
--カーソル変数
W_RCUR_TEST_TAB SYS_REFCURSOR;
--レコード変数
W_REC_TEST_TAB TEST_TAB%ROWTYPE;
--基本となるSQL
C_SQL CONSTANT VARCHAR2(100) := 'select * from TEST_TAB';
--WHERE句
W_WHERE VARCHAR2(100);
BEGIN
--パラメータを設定してカーソルオープン
FOR R1 IN C1(1) LOOP
DBMS_OUTPUT.PUT_LINE(R1.COL2); --100, 101
END LOOP;
FOR R1 IN C1(2) LOOP
DBMS_OUTPUT.PUT_LINE(R1.COL2); --200, 201, 202
END LOOP;
--WEHRE句部分を生成
W_WHERE := ' where col1 = 3';
--動的SQLのカーソルオープン
OPEN W_RCUR_TEST_TAB FOR C_SQL || W_WHERE;
LOOP
--1行分のデータをフェッチ
FETCH W_RCUR_TEST_TAB INTO W_REC_TEST_TAB;
--データがなくなったら終了
EXIT WHEN W_RCUR_TEST_TAB%NOTFOUND;
DBMS_OUTPUT.PUT_LINE(W_REC_TEST_TAB.COL2); --300, 301, 302, 303
END LOOP;
CLOSE W_RCUR_TEST_TAB;
END;
/
SET SERVEROUTPUT OFF
詳しくはORACLEのリファレンスを参照してください。
http://docs.oracle.com/cd/E16338_01/appdev.112/b …
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- MySQL 複数DBテーブルからのデータ取得 3 2022/05/17 15:02
- Oracle 質問です。 下記のテーブルとデータがあり、 取得想定結果のように出力したいです。 下記のsqlだと0 2 2023/05/23 19:10
- SQL Server [SQLServer] テーブル名からカラム名を取得する 1 2022/08/23 21:20
- MySQL 書籍の内容はまともでしょうか? 1 2023/01/22 03:07
- Oracle sqlで質問です。 aテーブルとbテーブルがあり、下記のsqlで取得したidとnameに一致しないレ 1 2022/04/20 20:34
- Oracle SQLの書き方について 1 2023/04/13 09:54
- PHP Q&Aサイトを作成していてURLの生成方法について迷っているのでアドバイスお願い致します 1 2023/08/10 16:42
- Oracle SQL update方法 2 2022/06/22 14:07
- MySQL SQLです。こんな感じですか?あってますか? うまくいきません教えてくださいお願いします 1 2023/07/08 15:27
- MySQL うまくいきません教えてくださいお願いしますSQLです。クエリ構文です。 1 2023/07/07 12:39
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
ExcelVBAで重複するデータを表...
-
ORMについて
-
select文の実行結果に空白行を...
-
count関数の値をwhere句で使用...
-
2つの列が同じ値の行を取得するSQL
-
複数のテーブルから値を合計出...
-
1の行を固定した上でVBAを用い...
-
トランザクションログを出力せ...
-
単一グループのグループ関数で...
-
デフォルトでデータが表示され...
-
エクセル、並び替え正しくソー...
-
SQLローダーCSV取込で、囲み文...
-
MySQLのサブクエリ
-
Null値件数をカウントする式に...
-
int型フィールドにnullを登録で...
-
2回実行のSQL文を1回にしたい
-
AccessのSQL文で1件のみヒット...
-
mysqlでクロス集計を取りたいが...
-
最大値の数をカウントしたい
-
ntext更新時にエラーが出ます
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
VB6のオラクルのバインド変数
-
oo4oを使ったOracleへのデータ...
-
指定文字を太字にするVBAを別シ...
-
配列への分割方法
-
SQLローダーCSV取込で、囲み文...
-
単一グループのグループ関数で...
-
select文の実行結果に空白行を...
-
テーブルの最後(最新)のレコー...
-
count関数の値をwhere句で使用...
-
【PL/SQL】FROM区に変数を使う方法
-
SELECT FOR UPDATE で該当レコ...
-
2つの列が同じ値の行を取得するSQL
-
レコードの登録順がおかしい
-
<SQL>重複しているデータの場合...
-
AccessのSQL文で1件のみヒット...
-
where句中のtrim関数について
-
アクセスのレポートでレコード...
-
複数のテーブルから値を合計出...
-
エクセル、並び替え正しくソー...
-
Oracleで「文字が無効です」の...
おすすめ情報