• 締切済み

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

tsuduki123の回答

回答No.3

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

関連するQ&A

  • PL/SQLでの参照

    PL/SQLで、複数データをLOOPで 読み込む処理を行います。 TYPE T_CHR IS TABLE OF VARCHAR2(30) INDEX BY BINARY_INTEGER; vc_data T_CHR; FOR cur_01 IN rec_01 LOOP vc_data(1) := rec_01.SHOHIN1 vc_data(2) := rec_01.SHOHIN2 vc_data(3) := rec_01.SHOHIN3 vc_data(4) := rec_01.SHOHIN4 ・・・・・ vc_data(50) := rec_01.SHOHIN50 END LOOP; 上記のような処理をしたいのですが、vc_dataに セットする処理を、Loopでできないですか? FOR n_count IN 1..50 LOOP vc_data(n_count) := rec_01(n_count); END LOOP; のようなかんじで。。。 今は50個羅列したままです。 でも、上のような処理は、エラーでした。 rec_01は、 rec_01.SHNNO1 のように、列名を指定する以外方法はないのでしょうか? 初歩的な質問ですみませんが、よろしくおねがいします。

  • 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回書きたくない) 初心者で、申し訳ないです。どうか、ご教授ください。

  • PL/SQLで変数へ値の代入

    PROCEDURE TEST(PI_ABC IN A_TABLE.A_CODE%TYPE) IS CURSOR CUR IS SELECT A_CODE FROM A_TABLE; BEGIN --抽出したデータを代入 FOR REC_CUR IN CUR LOOP PI_ABC := REC_CUR.A_CODE; END LOOP; 上記のコードを実行すると ORA-06502:数値または値のエラー PL/SQL: 文字列バッファが小さすぎます。 とエラーが出ます。 このプロシージャを呼び出す時にも同じテーブル同じ項目を渡しています。 同パッケージ内で同じ事をやっているのに特定のプロシージャだけ 上記のエラーが出てしまいます。 環境:Windows2003Server oracle9i

  • 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; どうかよろしくお願いします。

  • PL/SQLでテーブル名に変数を使いたい

    下記のようにV_TABLE_NAMEに不定のテーブル名で使用したい ご存知の方は教えて頂けないでしょうか?V_TABLE_NAMEに取得したテーブルをセットし、データの件数を取得するPL/SQL CURSOR C_CUR IS SELECT COUNT (*) FROM V_TABLE_NAME; BEGIN for ・・・・・ loop ・・・  ・・・ V_TABLE_NAME := GET_TABLE;  OPEN C_CUR;  FETCH C_CUR into w_count; CLOSE C_CUR; end loop;

  • PL/SQLの例外処理で出力しないようにしたい

    いつもお世話になっております。 PL/SQLの例外処理で分からないところがあるのですが どなたかお分かりになる方がいましたら、 教えていただけないでしょうか?? コーディングの悩んでる部分だけしか貼れないのですが↓↓ BEGIN FOR c_rec IN c_cur LOOP /*事業者テーブルからデータを探す*/ BEGIN SELECT cust_id, unit_sec INTO v_cust_id, v_unit_sec FROM m_cust WHERE op = c_rec.call AND vc = c_rec.isdn; EXCEPTION WHEN TOO_MANY_ROWS THEN v_err_msg := '該当業者が複数見つかりました'; WHEN NO_DATA_FOUND THEN       ★★ END; ★★のところで、何も見つからないエラーの場合、 何も文字を出力しないで、カーソルFOR LOOPの 次のレコードに行ってほしいのです。 何かしらエラー処理をしないと、プロシージャが正常に 完了してくれないので今はエラー番号を表示させているのですが ここに何を記入すればよいでしょうか?? よろしくお願いいたします。

  • カーソルループ内部でログを出力

    DECLARE CURSOR EMP_CUR IS SELECT SALARY FROM EMP WHERE DEPT_NO = 10 FOR UPDATE; BEGIN FOR EMP_REC IN EMP_CUR LOOP DBMS_OUTPUT.PUT_LINE( '変更前:' || EMP_REC.SALARY ); --SALARYが2500以下なら100を加える IF EMP_REC.SALARY < 2500 THEN UPDATE EMP SET SALARY = SALARY + 100 WHERE CURRENT OF EMP_CUR; DBMS_OUTPUT.PUT_LINE( '処理件数:' || SQL%ROWCOUNT ); END IF; DBMS_OUTPUT.PUT_LINE( '変更後:' || EMP_REC.SALARY ); END LOOP; END; / 上記のようなSQLで、 変更前のSALARYと変更後のSALARYを出力したいのですが、 変更前と変更後のEMP_REC.SALARYで、同じ値が出力されました。 処理の前後でSELECTする事は可能であると思いますが、 カーソル内でまとめて行いたいです。 カーソル内でIF文の前後の値を出力する事は可能でしょうか? また、もう1点質問があります。 それは、SALARYの値が、どちらも更新された値が出力される事についてです。 例:DEPT_IDが10で、SALARYが1000の従業員が居た場合。   変更前:1100   変更後:1100 EMP_REC.SALARYの値が、DECLAREで定義されたカーソルのデータならば、 1000が出力されると考えたのですが、 どちらも更新後の値が出力されるのは何故でしょうか? お手数をお掛け致しますが、よろしくお願い致します。

  • PL/SQL文にて

    PL/SQL文にて、コーディングをしています。意図した通りにプログラムは動作するのですが、ファイルに何のデータも入ってこない場合の分岐処理を加えて、データが入ってこなかった場合にはファイルは作成しないというロジックを検討しています。どなたかうまいやり方をご存知無いでしょうか? --略-- --ファイル名設定 file_name := UPPER(rec_kaisya_1.kaisya_cd) || '_KATAMEI_ERROR_' || to_char(sysdate, 'YYMMDD') || '.csv'; --ファイルオープン(新規書き込みモード) File_Handle := UTL_FILE.FOPEN(file_dir, file_name, 'w'); --日付の書き込み UTL_FILE.PUTF(File_Handle, 'Created: %s\n', SYSDATE); --ファイルへの書き込み(改行のみ) UTL_FILE.NEW_LINE(FILE_HANDLE); --見出しの書き込み v_line_header := '会社コード, 会社名, 販製品名, 数量'; UTL_FILE.PUT_LINE(File_Handle, v_line_header); --会社毎のデータ取得 FOR rec_kaisya IN cur_kaisya(v_nenki,rec_kaisya_1.kaisya_cd ) LOOP --一行づつ書き込み UTL_FILE.PUTF(File_Handle,' ''%s, ''%s, ''%s, %s\n', rec_kaisya.kaisya_cd ,rec_kaisya.kaisya_jname   ,rec_kaisya.hanseihin_mei ,rec_kaisya.su); END LOOP; UTL_FILE.FCLOSE(File_Handle); END LOOP; --略--

  • PL/SQLに関しての質問です。

    はじめまして。 PL/SQLの入門書を一冊程度読んで開発に携わってしまった初心者です。 どうしてもわからず、行き詰ってしまったので質問させて下さい。 現在あるパッケージを作成しています。 例えとして、パッケージ内にプロシージャAとプロシージャBが有るとします。 プロシージャA内で、SELECTにてDBから取ってきた値を変数Cに入れます。 その変数Cはパッケージの呼出し元のモジュールに返します。 ここまでは解りますが問題はここからです。 プロシージャAで変数Cに格納した値を、そのままプロシージャBでも使用したいのです。 変数Cを仕様部で宣言して、グローバル変数として使用すれば楽だと思うのですが、 グローバル変数は一切使用してはならない。と言われています。 ご回答お待ちしております。

  • PL/SQLでCSVを作成又は、読み込みたい

    下記のエラーが出て、UTL_FILEパッケージが使用できません。なぜでしょう? 下記SQL文の「※1」箇所で「UTL_FILE」の後 「.」を入力しても、「FILE_TYPE」は選択肢には表示されず、やむを得ず手入力しました。 ~~~~~~~~~~~~~~~~~~~~~~~ 問題のSQL文 ~~~~~~~~~~~~~~~~~~~~~~~~~~~ DECLARE  DNM VARCHAR2(200) := 'C:\TMP';  FNM VARCHAR2(200) := 'TEST.CSV';  CURSOR CUR1 IS      SELECT COL1, COL2, COL3, COL4, COL5     FROM A;  FHANDLE UTL_FILE.FILE_TYPE;  ←←←←←←←←←←  ※1  REC VARCHAR2(2000); BEGIN  FHANDLE := UTL_FILE.FOPEN(DNM,FNM,'W',2002);  UTL_FILE.PUTF(FHANDLE,'"%S","%S","%S","%S"\N','タイプ','オブジェクト','作成日','更新日');    BEGIN    FOR CUR_REC IN CUR1 LOOP    UTL_FILE.PUTF(FHANDLE,'"%S","%S","%S","%S"\N','タイプ','オブジェクト','作成日','更新日');   END LOOP;  END;  UTL_FILE.FCLOSE(FHANDLE); END; ~~~~~~~~~~~~~~  エラーメッセージ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Error [row:1,col:1] ORA-06510: PL/SQL: ユーザー定義の例外が発生しましたが、処理されませんでした ORA-06512: "SYS.UTL_FILE", 行120 ORA-06512: "SYS.UTL_FILE", 行293 ORA-06512: 行14