• 締切済み

PLSQLでフィールド名の参照について

PLSQLでフィールド名で、例えば フィールド1,フィールド2…フィールド5 とし、下記の例のように添え字でフィールドを それぞれ指定したいのですが、可能でしょうか? 出来る場合、具体的にどのようにすればいいのでしょうか? FOR i IN 1..5;  sum := sum + CALCREC01("フィールド" || i);  ↑こんな感じの事がしたい。。。 END LOOP

  • Oracle
  • 回答数3
  • ありがとう数1

みんなの回答

  • 7colors
  • ベストアンサー率25% (29/114)
回答No.3

TYPE [変数名] IS TABLE OF [型名] [INDEX BY BINARY_INTEGER ←検索用INDEX(省略可)]; W_DATA [変数名]; W_TEST FOR I IN 1..5 LOOP W_TEST := W_DATA(I); END LOOP; EX) TYPE W_NUM IS TABLE OF NUMBER(10) INDEX BY BINARY_INTEGER; W_SU W_NUM; W_SUM NUMBER(12) := 0; FOR I IN 1..5 LOOP W_SUM := W_SUM + W_SU(I); END LOOP; こんな記述で可能ですね。

回答No.2

う~ん・・・、 とりあえず、PL/SQLになってないんですが・・・。 まぁ、それは置いといて、 PL/SQLではレコード型の参照をコンパイル時に解決しようとします。 この意味がわかりますか? 既存のテーブルや宣言されたレコード型(type abc as record も)の名前は、動的に変更できません。 INDEX BY表などを使ってインデックス処理にするか、動的SQLを使用して、各カラムごとにSQLを発行してください。

回答No.1

テーブルのカラムですか? cursorで取得しているのでしょうか? recordの変数に入れてるのかな? 前後がよくわからないので、いきなりフィールドが出ても・・・。

emiko0106
質問者

補足

CALCREC01というのは、カーソルのレコード型変数で、 これを使ってあるテーブルのフィールド1…5を参照しに いっていると考えてもらえたら良いと思います。 もう少し細かく書くと以下のようなコードを 想定しています。 CURSOR CALC01 is  SELECT   フィールド1,   フィールド2,   フィールド3,   フィールド4,   フィールド5  FROM テーブル; CALC01REC CALC01%ROWTYPE; FOR CALC01REC IN CALC01 LOOP  FOR i IN 1..5;   sum := sum + CALCREC01("フィールド" || i);   ↑こんな感じの事がしたい。。。  END LOOP; END LOOP;

関連するQ&A

  • PLSQLで添え字を使用してフィールドの内容を取得したい。

    PLSQLで添え字を使用してフィールドの内容を取得したい。 http://okwave.jp/qa/q1862026.html 上記のページを確認しましたが、どうも回答が私が求めている内容とは 違いますのでご質問させていただきます。 PLSQLで下記のような動作を行いたいです。 下記のようなテーブル構造のテーブルがデータベースにあります。 キー、フィールド1、フィールド2・・・・フィールド50 特定の内容をフィールド1からフィールド50までの値を確認する、 と言う簡単な内容なんですがVBなどで用いる フィールド名 & 添え字 などで内容を確認しようと思ったのですが、PLSQLでやるのが上手く出来ず どのようにやれば上記の内容もしくは上記に近い内容を実装できるのでしょうか・・・ 些細な事でも構いませんのでご助言頂けましたら幸いです。 Oracleのバージョンは8.1.6.0.0です。

  • PLSQLで

    PLSQL(Oracle9.i)で以下のことをしようとしています。 しかし、コンパイルは通るがステップ実行すると固まります。 -- 宣言部 TYPE REC_A IS RECORD( a NUMBER, b NUMBER, c NUMBER, d NUMBER, e NUMBER, f NUMBER, g NUMBER, ); TYPE B_TBL IS TABLE OF REC_A INDEX BY BINARY_INTEGER; TYPE C_TBL IS TABLE OF B_TBL INDEX BY BINARY_INTEGER; D_TBL C_TBL; -- 関数部 FOR i IN 1..3 LOOP  FOR J IN 1..3 LOOP   D_TBL(I)(J).a := 1;   D_TBL(I)(J).b := 2;   D_TBL(I)(J).c := 3;   D_TBL(I)(J).d := 4;   D_TBL(I)(J).e := 5;   D_TBL(I)(J).f := 6;   D_TBL(I)(J).g := 7;  END LOOP; END LOOP; なにぶんまだPLSQLの勉強始めて1ヶ月満たないもので、分からないことをどう伝えればいいのかも分からない状況です。 処理的には、D_TBL(I)(J)に値をいろいろセットし集計をとりCSVにはきだす処理です。 これだけでは分からないかもしれませんが、よろしくお願いします。

  • フィールド名をループの添え字として使いたい

    当方、AccessのVBAなんですがVBでも同じと思い質問します。 フォームに3つのフィールドがあって、それぞれ 1,2,3というフィールド名がついてます。 これをループの添え字に使いたいと思います。つまり For i = 1 To 3 Hairetsu(i) = me!???? Next としたいのですが、??部分をどう書いたらいいか分かりません。 Me(i),Me[i]などを試してみましたがダメでした。 どう書けばいいでしょうか?よろしくお願いします。

  • postgres ストアドファンクションないのレコードの取得について

    質問させていただきます pg/plsqlのストアドファンクション内で 受け取った引数を sql := select * from hoge; FOR rec IN EXECUTE sql LOOP return rec.col;     <<<この部分で END LOOP; return; rec.引数名のようにして 引数から取得した 列を指定したいのですが、そのまま入れると そのような列はありませんと言うような返事を 返されてしまいます。 うまくやる方法はないものでしょうか? よろしくお願いします。

  • PLSQLの識別子エラー

    下記PLSQLを実行した時に(sqlplus上で、@XXXX.SQLと実行) WCOUNT :=WCOUNT + 1; エラー PLS-00201: 識別子WCOUNTを宣言してください のエラーがでます 宣言をしているのですがわからず、お助けください また、他にもこのエラーを処置したあとに問題と なりそうな箇所があれば指摘お願いします -やろうとしてること (1)テーブルA を、男子を出席順に読み込んでその読み込んだ順番に 1から番号をふり、テーブルBへ新規追加する (2)テーブルAからテーブルBに新規追加していない女子を、出席順に読み込んで 1から番号をふり、テーブルBへ新規追加する (3)テーブルBのKEYは順番のみ (4)テーブルBのINSERT分は、今後機能追加する予定なのでNOT IN使用する -組んだPL/SQL(2つのINSETを1つのファイルに記述しています) DECLARE WCOUNT number; CURSOR カーソル IS SELECT 出席番号,名前,成績 FROM テーブルA  ORDER BY 出席番号; BEGIN FOR r IN カーソル LOOP INSERT INTO テーブルB (r.順番, r.名前,r.出席番号) VALUES (WCOUNT,r.名前); COMMIT; WCOUNT :=WCOUNT + 1; END LOO; / END; DECLARE CURSOR カーソル IS SELECT 出席番号,名前,成績 FROM テーブルA A WHERE A.出席番号 NOT IN (SELECT B.出席番号 FROM テーブルB B) ORDER BY 出席番号; BEGIN FOR r IN カーソル LOOP INSERT INTO テーブルB (順番, 名前) VALUES (WCOUNT,r.名前); COMMIT; WCOUNT :=WCOUNT + 1; END LOOP; / END;

  • アクセス フィールド名の変更

    フィールド名 [1],[2],・・・・を [090701],[090702],・・・ に変更するように Dim i As String Dim ret As String ret = InputBox("入力例  090701") i = ret DoCmd.RunSQL "SELECT [クエリ112].[1] AS [" & i & "], [クエリ112].[2] AS [" & i + 1 & "], ........中略 End Sub としましたが [090701],[90702],[90703],・・・ 2番目から 090702 になりません。 どのようにすればよいのか教えていただけませんか。

  • 同一表に同一データがある場合のPLSQLの挙動

    お世話になります。 Oracle+PLSQL初心者です。 特定のPLSQLを発行した際の、同一データが同じ表内にある場合の動作について混乱しています。 条件を満たす列に対して値+100の反応を期待しているのですが、思うような結果が返ってきません。 偶然に上記挙動が発生し、同一データの重複が問題かなと問題のなさそうな表をつくり直したら同現象は発生しなくなりました。 1. 同じ表に2度同じデータをインサート(同一データが2つある状態) ID NAME SAL DEPT 1 TARO 0 10 2 HANAKO 100 20 1 TARO 0 10 2 HANAKO 100 20 2. 特定条件下(sal<1000, deptno=10)でsalが+100になるPLSQLを発行、COMMIT DECLARE CURSOR emp_cur IS SELECT sal, empno FROM emp WHERE deptno = 10; BEGIN FOR emp_rec IN emp_cur LOOP IF emp_rec.sal < 1000 THEN UPDATE emp SET sal = sal + 100 WHERE empno = emp_rec.EMPNO; END IF; END LOOP; END; / COMMIT; 3. SELECTでSALを確認すると200増えている(2倍) ID NAME SAL DEPT 1 TARO 200 10 2 HANAKO 100 20 1 TARO 200 10 2 HANAKO 100 20 個人的には下記のような値になると思っていました。 言葉で説明するのが難しいのですが、心当たりのある方がいらっしゃったらお答え願います。 よろしくお願い致します。 ID NAME SAL DEPT 1 TARO 100 10 2 HANAKO 100 20 1 TARO 100 10 2 HANAKO 100 20

  • シート名をループに

    質問を簡単にする為に以下のマクロがあるとします。 シート名が1~31とあるのですが、これをfor loopで 使うにはinteger等の定義が違うのでしょうか。 Sub bbb() Dim ws As Worksheet Dim 曜日 As String Dim i As Integer For Each ws In Worksheets For i = 1 To 31 If ws.Name = i Then  <----------ここでエラー  (コマンド) End If Next i Next End Sub

  • MySQLからフィールド名のリストを取り出し、一部のフィールド名を除外したい場合

    PHP + MySQLにて テーブルからフィールド名だけを取得し、さらに一部のフィールド名を除外したいです。 レコードじゃないのでis not構文は使えませんでした。 何かいい方法があれば教えてください。 $sql = "select * from table"; //tableテーブルからフィールド名を取り出し $rs = mysql_query($sql); $fields = mysql_num_fields($rs); $column = array(); for ( $i=0; $i<$fields; $i++ ) { $column[$i] = mysql_field_name($rs, $i); }

    • ベストアンサー
    • MySQL
  • PLSQLについて

    いつもお世話になります。 オラクル初心者です。 宜しくお願い致します。 下記の様な、for~loopで、 tmpM商品単価(主キーなし)と言う一時表テーブルから M商品単価(主キーは「品番」)へインサートをする際、 tmpM商品単価には、「品番」フィールドにダブった品番 がある為、単価実行日を降順に並べ替え古い行は、 where not exists(~)で、インサートされない様に考えました。 しかし、下記構文では、コミットされる前だからなのか、 ダブった品番の行もインサートされようとされ、エラー となってしまいます。 どなたかご親切な方、ご教授下さいます様、 宜しくお願い致します。      記 create or replace procedure dbInsSyouhinmaster ( out_val out pls_integer ) as cursor c_1 is select 品番,商品分類,売上単価,単価実行日,登録日時,登録者 from tmpM商品単価 a where not exists(select * from M商品単価 b where trim(a.品番) = trim(b.品番)) order by 単価実行日 DESC; begin out_val:=0; for r_emp in c_1 loop if c_1%FOUND then INSERT INTO M商品単価 (品番,商品分類,売上単価,単価実行日,登録日時,登録者) VALUES(r_emp.品番,r_emp.商品分類,r_emp.売上単価,r_emp.単価実行日, r_emp.登録日時,r_emp.登録者) ; end if; out_val := out_val + 1; end loop; end;