• 締切済み

PL/SQLについての質問です。

PL/SQLについての質問です。 カーソルデータ(emp_rec(i))を、TABLE変数(emp_ins(i))に代入して、代入されたTABLE変数を使用して、DML処理を行うことは可能ですか? エラーを解読し対処を行っても、エラーが発生してしまいます。 どうか、ご教授お願いします。 下記を実行すると、下記エラーが発生します。 -実行結果------------------------------------ DECLARE * 行1でエラーが発生しました。: ORA-06502: PL/SQL: 数値または値のエラーが発生しました ORA-06512: 行127 -エラー番号解読----------------------------------------- ●エラー名: PL/ SQL: 数値または値のエラーstring が発生しました ●原因: 算術、数値、文字列、変換または制約エラーが発生しました。たとえば、NULL 値をNOT NULL で宣言した変数に割り当てようとした場合、または100 以上の整数をNUMBER( 2) で宣言した変数に割り当てようとした場合にこのエラーが発生します ●処置:値が制約違反をしないように、データ、操作方法または宣言方法を変更してください。 -ソース------------------------------------ DECLARE --カーソル定義 CURSOR emp_cur IS SELECT a,b,c FROM emp TYPE emptabtype IS TABLE OF emp%ROWTYPE INDEX BY PLS_INTEGER; emp_rec emptabtype; /* 処理対象データ格納変数 */ -- insert作業用 emp_ins emptabtype; ins_count NUMBER := 1; BEGIN /* empカーソルオープン・フェッチ・クローズ */ OPEN emp_cur; FETCH emp_cur BULK COLLECT INTO emp_rec; CLOSE emp_cur; /* (挿入)処理対象のデータを、処理対象データ格納変数に格納する。 */ FOR i IN emp_rec.FIRST..emp_rec.LAST LOOP --挿入するレコードを格納 emp_ins(ins_count) := emp_rec(i); ins_count := ins_count + 1; END LOOP; /* DML処理 */ -- 挿入する FOR count_ins IN emp_ins.FIRST..emp_ins.LAST LOOP INSERT INTO temp VALUES(emp_ins(count_ins).a ,emp_ins(count_ins).b ,emp_ins(count_ins).c); END LOOP; COMMIT; END; /

みんなの回答

回答No.3

emp_ins emptabtype; を TABLE OFとかなんとかってしないと 配列にならないんじゃなかったけ? 最近は MERGEとか INSERT ALLでカーソル回さなくても DMLだけで処理できることがおおいので あんまり自信ないけれど。。。。

  • SaKaKashi
  • ベストアンサー率24% (755/3136)
回答No.2

>ORA-06512: 行127 このエラーはどこででているのですか?全文と併せて教えてください。

  • t_nojiri
  • ベストアンサー率28% (595/2071)
回答No.1

ええと、軽くしか読んでないのですがempテーブルの中に値が代入されないでinsertもしくはupdateされてる気がするのですが、普通スキーマの定義でNULL禁止にするとか、デフォルト値を設定するとか何かしておくものじゃ無いのかなと思うのですが・・・。

kirinnamatya
質問者

補足

下記、DML処理部分を下記に修正しても、上記エラーが発生しました。回答者様がおっしゃる。emp_insに値が入っていないということですかね。 /* DML処理 */ -- 挿入する FOR count_ins IN emp_ins.FIRST..emp_ins.LAST LOOP dbms_output.put_line(count_ins); END LOOP; */ 下記のように、カーソル結果セットを、table変数に代入する事は出来ない。 ということでよろしいでしょうか?お願いします。。 --更新用するレコードを格納 emp_ins(ins_count) := emp_rec(i);

関連するQ&A