
No.4ベストアンサー
- 回答日時:
#2 の修正版です
-- ---------------------------------------------
-- 動的SQLの作成
-- ---------------------------------------------
C_SQL := DBMS_SQL.OPEN_CURSOR;
v_SQL := 'SELECT 項目1,項目2,項目3 FROM ' || i_TABLE_NM;
-- ---------------------------------------------
-- 動的SQLの解析
-- ---------------------------------------------
DBMS_SQL.PARSE(C_SQL ,v_SQL , DBMS_SQL.NATIVE);
FOR n_CNT IN 1..i_SU LOOP
t_MOJI(n_CNT) := '';
DBMS_SQL.DEFINE_COLUMN(C_SQL,n_CNT,t_MOJI(n_CNT),100);
END LOOP;
-- ---------------------------------------------
-- 動的SQLの実行
-- ---------------------------------------------
Y := DBMS_SQL.EXECUTE(C_SQL);
-- ------------------------------------------
-- フェッチ処理
-- ------------------------------------------
IF DBMS_SQL.FETCH_ROWS(C_SQL) = 0 THEN
EXIT;
END IF;
-- ------------------------------------------
-- 値の取得
-- ------------------------------------------
DBMS_SQL.COLUMN_VALUE(C_SQL ,1 , x); --xに項目1の値が入る
DBMS_SQL.COLUMN_VALUE(C_SQL ,1 , y); --yに項目2の値が入る
DBMS_SQL.COLUMN_VALUE(C_SQL ,1 , z); --zに項目3の値が入る
-------------------------------------------------
こんな感じ?
No.5
- 回答日時:
#3
全然意味違いでした。。。
なのでもうひとつの方法として書き方の簡単な方を
アドバイスさせていただきます。
--------------------------------------------------
/* テストパッケージ定義 */
CREATE OR REPLACE PACKAGE
TEST
IS
PROCEDURE TEST2(t1 in varchar );
END;
/
/* テストパッケージ本体 */
CREATE OR REPLACE PACKAGE BODY
TEST
IS
PROCEDURE TEST2(
t1in varchar
)
IS
N_MAX_VALUE INT; -- 最大値
N_MIN_VALUE INT; -- 最小値
S_SQL varchar(256);
BEGIN
-- 実行するSQL文
S_SQL := 'SELECT MAX(K1), MIN(K1) FROM ' || t1 ;
-- SQL実行と結果取得
EXECUTE IMMEDIATE S_SQL INTO N_MAX_VALUE, N_MIN_VALUE ;
-- とりあえず結果をテストテーブルに格納
INSERT INTO TEST_RESULT(
MAX_VALUE,
MIN_VALUE,
CREATE_DT
)
SELECT N_MAX_VALUE,
N_MIN_VALUE,
SYSDATE
FROM DUAL ;
END TEST2;
END;
/
/* テストプロシージャ実行 */
EXEC TEST.TEST2( 't1' ) ;
/* テスト結果の表示 */
SELECT *
FROM TEST_RESULT ;
--------------------------------------------------
ただSQL解析時のオーバーヘッドが大きいとは聞いてますが、
多用しなければ問題ないと思われます。
No.3
- 回答日時:
始めまして。
miko_zzと申します。
ストアド内で値を取得して使用するのであれば、
下記のテストで確認することは出来ます。
--------------------------------------------------
/* テスト結果テーブル */
CREATE TABLE TEST_RESULT
MAX_VALUE INT,
MIN_VALUE INT,
CREATE_DT DATE ) ;
/* テストパッケージ定義 */
CREATE OR REPLACE PACKAGE
TEST
IS
PROCEDURE TEST;
END;
/
/* テストパッケージ本体 */
CREATE OR REPLACE PACKAGE BODY
TEST
IS
PROCEDURE TEST
IS
N_MAX_VALUE INT; -- 最大値
N_MIN_VALUE INT; -- 最小値
BEGIN
SELECT MAX(K1),MIN(K1)
INTO N_MAX_VALUE,N_MIN_VALUE
FROM T1;
INSER INTO TEST_RESULT(
MAX_VALUE,
MIN_VALUE,
CREATE_DT
)
SELECT N_MAX_VALUE,
N_MIN_VALUE,
SYSDATE
FROM DUAL ;
END TEST;
END;
/
/* テストプロシージャ実行 */
EXEC TEST.TEST ;
/* テスト結果の表示 */
SELECT *
FROM TEST_RESULT ;
--------------------------------------------------
違ってたらごめんなさい。
No.2
- 回答日時:
私は以下の方法で行っています
-- ---------------------------------------------
-- 動的SQLの作成
-- ---------------------------------------------
C_SQL := DBMS_SQL.OPEN_CURSOR;
v_SQL := 'SELECT * FROM ' || i_TABLE_NM;
-- ---------------------------------------------
-- 動的SQLの解析
-- ---------------------------------------------
DBMS_SQL.PARSE(C_SQL ,v_SQL , DBMS_SQL.NATIVE);
FOR n_CNT IN 1..i_SU LOOP
t_MOJI(n_CNT) := '';
DBMS_SQL.DEFINE_COLUMN(C_SQL,n_CNT,t_MOJI(n_CNT),100);
END LOOP;
-- ---------------------------------------------
-- 動的SQLの実行
-- ---------------------------------------------
Y := DBMS_SQL.EXECUTE(C_SQL);
-- ------------------------------------------
-- フェッチ処理
-- ------------------------------------------
IF DBMS_SQL.FETCH_ROWS(C_SQL) = 0 THEN
EXIT;
END IF;
--------------------------------------------
だいたい、こんな感じです
参考になります?
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
ROW_NUMBER()を使用したデータ取得
-
ストアド実行時のエラー「参照...
-
ストアドプロシージャからアナ...
-
質問:DBMS_OUTPUTの使用方法
-
sqlplusでヘッダーが付かない
-
Access VBAで行ラベルが定義さ...
-
Statement ignored というエラー
-
Accessのマクロでモジュールを...
-
Accessでのプロシージャの呼び...
-
日付型カラムへのデータINSERT
-
PL/SQLでSPOOLさせたいのですが...
-
2016.3.2を日付として認識させたい
-
ACCESS、時間ごとの集計の仕方は?
-
sp_executesqlを実行してもテー...
-
Oracle 10gで順序sequenceの作...
-
OutlookVBAで作成したマクロに...
-
SQLで部分的にGROUP BYしたいとき
-
キャッシュを使わずにSELECTを...
-
SQL Sever での日付の差の求め...
-
PL/SQLカーソルの2重FORループ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
ストアドプロシジャからストア...
-
ストアド実行時のエラー「参照...
-
ROW_NUMBER()を使用したデータ取得
-
ストアドプロシージャからアナ...
-
PL/SQL exceptionを呼び出すには?
-
時間項目を60進数から10進数へ...
-
INSERT文の書式
-
質問:DBMS_OUTPUTの使用方法
-
PL/SQL 実行中のSID
-
Function内に記述したdbms_outp...
-
PL/SQLで連結(||)と結合(=>)の違い
-
毎日決まった時間にSQLを実...
-
パッケージ内のファンクション...
-
PL/SQLの例外
-
Oracle: PACKAGE BODY の分割
-
PL/SQLについて
-
PL/SQLのファンクションでのOUT...
-
OracleのTEXT_IOについて
-
Accessのマクロでモジュールを...
-
Statement ignored というエラー
おすすめ情報