PLSQLで集計関数の値を配列に入れたい

このQ&Aのポイント
  • PLSQLで集計関数の値を配列に格納する方法について困っています。
  • 部門コードと件数を配列に入れるためのロジックを作成しましたが、うまくいきません。
  • どのようにすれば各部門とその対になる件数を配列に入れることができるでしょうか。
回答を見る
  • ベストアンサー

PLSQLで集計関数の値を配列に入れたい

はじめまして。 各部門に所属している人の件数を配列に格納して処理したいと考えています。 (例)テーブル名:buhyo SQL:select bumon_cd,count(*) from buhyo group by bumon_cd order by bumon_cd 上記SQLの結果↓ 部門コード(bumon_cd)     count(*) --------------------------------- A11                   100 A12                   150 A13                   200 上の結果であるA11と100、A12と150、A13と200をそれぞれ配列に入れたくて PLSQLで以下のロジックを作成しましたが、うまくいかなくて困っています。 <ロジック> DECLARE CURSOR KEKKA IS SELECT BUMON_CD,BUMON_CD,COUNT(*) RCNT FROM BUHYO GROUP BY BUMON_CD ORDER BY BUMON_CD; TYPE BUMON_TAB IS TABLE OF KEKKA%ROWTYPE INDEX BY PLS_INTEGER; WK_ARRAY BUMON_TAB; BEGIN FOR WK_BUMON IN KEKKA LOOP I := I + 1; WK_ARRAY(I).BUMON_CD = WK_BUMON.BUMON_CD; WK_ARRAY(I).RCNT = WK_BUMON.RCNT; DBMS_OUTPUT.PUT_LINE(WK_ARRAY(I).BUMON_CD || ',' || WK_ARRAY(I).RCNT); END LOOP; END; / これで出力しようとしてもWK_ARRAY配列に部門コードと件数が入りません。 どのようにすれば各部門とその対になる件数を配列に入れることが 可能でしょうか?ご教授ください。 よろしくお願いします。

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

質問者が選んだベストアンサー

  • ベストアンサー
  • yamada_g
  • ベストアンサー率68% (258/374)
回答No.1

変数Iが宣言されていないですし、代入文もおかしいです。 元のプログラムを極力変えずにいくと、 DECLARE CURSOR KEKKA IS SELECT BUMON_CD,COUNT(*) RCNT FROM BUHYO GROUP BY BUMON_CD ORDER BY BUMON_CD; TYPE BUMON_TAB IS TABLE OF KEKKA%ROWTYPE INDEX BY PLS_INTEGER; WK_ARRAY BUMON_TAB; I PLS_INTEGER := 0; --追加 BEGIN FOR WK_BUMON IN KEKKA LOOP I := I + 1; WK_ARRAY(I).BUMON_CD := WK_BUMON.BUMON_CD; -- = を := に修正 WK_ARRAY(I).RCNT := WK_BUMON.RCNT;-- = を := に修正 DBMS_OUTPUT.PUT_LINE(WK_ARRAY(I).BUMON_CD || ',' || WK_ARRAY(I).RCNT); END LOOP; END; / こんな感じでしょうか。 この場合、添え字は1から始まることになります。

eiki0520
質問者

お礼

yamada_gさん お世話になります。 変数Iの宣言が必要なのですね。それから=ではなく:=ですね。 すいません。ご指摘ありがとうございます。 教えていただいた内容で配列に正しく格納できました。 本当にありがとうございます。 いろいろと勉強になります。

関連するQ&A

  • 配列を関数に渡したいのですが…

    次のように配列を関数に渡したいのですが、うまく出来ません。どのようにしたら良いのでしょうか? 渡したい配列の個数は、偶数個ですが、未知の個数です。 $A_LINK = A_LINK("TEST_NAME", "TEST_VAL"); function A_LINK($array) { while (count($array) > 0) { $name = array_shift($array); $value = array_shift($array); $name = urlencode($name); $value = urlencode($value); $msg .= "$name=$value"; } return $msg; }

    • ベストアンサー
    • PHP
  • 配列のカウント

    こんにちは 初歩的な質問だとは思うのですが…教えて下さい 【 1.以下のような配列を作る 】 $array = array( "1-aaa", "2-aaa", "2-bbb", "2-ccc" ); 【 2.本日の日付を取得 】 $today = date("d",time()); 【 3. arrayの件数分forで回す 】 for ($i = 0; $i < count($array); $i++) { 【 4.explodeで分解 】 $items = explode("*",$array[$i]); 【 5.日付と配列[0]が一致した時に項目表示 】 if($today == $items[0]){ print $items[1]; } という処理を行った時に if($today == $items[0]) に該当するデータ件数というのは 求めることが出来ないものなのでしょうか (今日が2日として、この場合は「3」が欲しい) 前からこういう状況下で該当する件数を求めたい時があっても どうしたらよいのかわからなくて諦めていたのです 絶対ムリなら諦めるので、出来るのかどうか教えて頂けますか?? もし可能であれば、求め方のヒントも頂けると助かります よろしくお願い致します!!

    • ベストアンサー
    • PHP
  • 二次元配列に値をセットしたいんですが

    ASP(html)での変数をJavaScriptに渡して 二次元配列を作成したいのですが、どうもうまくいきません。 どなたか、ご教授願います。 サンプル 変数:strFact = "'工場1', 1000, 20/'工場2', 500, 90/'工場3', 2000, 100/'工場4', 900, 10" -------------------JavaScript strFact_WK = <%=strFact %>  ※1 var test = new Array(); var rows = strFact_WK.split("/"); for( var i in rows) { test.push(new Array()); var cols = rows[i].split(","); for( var j in cols) { test[i].push(cols[j]); } } ---------------------- 当然ですが、 ※1の所で strFact_wk = "'工場1', 1000, 20/'工場2', 500, 90/'工場3', 2000, 100/'工場4', 900, 10" とすると作成されます。

  • 配列の値を集めた1つの文字列として取得するには

    Array ( [0] => a [1] => あ [2] => 123 [3] => 55 ) この配列を "a","あ","123","55" といった1つの文字列として取得したいです。 <?php $list = array("a","あ","123",55); $r = ""; for($i=0; $i<count($list); $i++){ $r .= ',"'.$list[$i].'"'; } $r = substr($r,1); echo $r; ?> このような形でできましたが、もっと良い方法はありますか? そして上の方法で良い場合は、下の1~4のどれが一番適切ですか? [1] for($i=0; $i<count($list); $i++){ $r .= ",\"".$list[$i]."\""; } [2] for($i=0; $i<count($list); $i++){ $r .= ',"'.$list[$i].'"'; } [3] foreach($list as $key => $val){ $r .= ",\"".$val."\""; } [4] foreach($list as $key => $val){ $r .= ',"'.$list[$i].'"'; }

    • 締切済み
    • PHP
  • phpで、配列の値が意図せず変わってしまいます。

    環境はphp4です。 for、もしくはforeachを使って配列の中身を変えたいと思っています。 $array1 = array(123csv, 456csv, 789csv); for($a = 0; $a <= count($array1) -1; $a++){ $array2[] = "a" . $array1[$a]; } echo $array1[0]; echo $array2[0]; 上記の出力結果がなぜか異なり困っています。 array1[0]は「123csv」、 array2[0]は「a113csv」、もしくは「a12300v」 などとなってしまいます。 先頭に「a」を付加しない場合も「113csv」、もしくは「12300v」という結果です。 ちなみに$array1はexplodeを使って空白文字をを分割して作成した配列です。 これなバグなのでしょうか。 原因、回避策など、いろいろ調べましたが検討がつきません。 よろしくお願いします。

    • ベストアンサー
    • PHP
  • 配列操作について

    お世話になります。 $obj = array(1 array(id=>111 name=>aaa date=yyyymmdd array(2 array(id=>222 name=>bbb date=yyyymmdd 上記のようなオブジェクト($obj)があるとして この最下層の連想配列データ(id,name,date)を 配列にしたい時は、以下のような書き方で取れると 思いますが、もっとすっきりさせる書き方などありますか? $a = array(); $c = count($obj); for($i=0; $i<$c; $i++){ $a = $obj[$i]['id']; $a = $obj[$i]['name']; $a = $obj[$i]['date']; $i++}

    • ベストアンサー
    • PHP
  • 配列の初期化

    表題の件で質問があります。 //------------------------------------// $A_array = array("1", "2", "3"); $B_array = array("9", "8"); for($cnt=0;$cnt<count($A_array);$cnt++){ $test[] = $A_array[$cnt]; } for($cnt=0;$cnt<count($B_array);$cnt++){ $test[] = $B_array[$cnt]; } ※わかりやすいようの簡単に書いてみました。 //------------------------------------// 上記の処理の場合配列testには ("9", "8", "3")となってしまい、 ("9","8")のデータを取得できません。 簡単に言うと配列名を使いまわししたいと考えています。関数かなにかで配列の中身を初期化するような ものはありますでしょうか?

    • 締切済み
    • PHP
  • 配列の値について

    度々の質問で恐縮です。長時間かけて試行錯誤するものの一向に解決せず、お知恵をお借りできればと思い投稿させて頂きました。 ---------------- for ($i = 0; $i <= 2; $i++) { // 3回ループです。 if (is_uploaded_file(@$_FILES["img"]["tmp_name"][$i])) { $pre = "s_"; $imgname[$i] = basename($_FILES['img']['name'][$i]); $imgfile[$i] = $imgdir . $imgname[$i];   << 中略(色々な処理) >> if (preg_match('/\.jpg$/', $imgname[$i]) > 0) { ImageJpeg($img_out[$i], $imgdir.$pre.$imgname[$i] ); $img_thumb = array($i => basename($imgdir.$pre.$imgname[$i]));} 【A】} 【B】} 【C】 ----------------- ■上記『$img_thumb』には配列の値を格納していますが、【A】、【B】の位置で『print_r』を実施したところ、Array ( [0] => ××.jpg ) Array ( [1] => ○○.jpg )Array ( [2] => △△.jpg ) のように配列データが格納されていますが、【C】の位置では、Array ( [2] => △△.jpg ) だけしか表示されません。 これを【C】の位置でも全て表示できるようにするにはどうすればよいか、何かアドバイスをぜひともよろしくお願いいたします。 分かりにくくて申し訳ありません。

    • ベストアンサー
    • PHP
  • 配列のソートと削除

    String型のstrToRemoveで与えられた文字列を配列から探し、あればそれ以降の配列の数字をすべて左にシフトします。 なので配列の大きさは1小さくなります。その結果の配列をreturnで返します。 例) ({"A","B","C","D","B"}, "B")配列1にBがあるのでそれ以降の文字列をすべて左にシフト→ {"A","C","D","B"} ({"A","B","C","D","B"}, "A") 配列0にAがあるのでそれ以降の文字列を左にシフト→ {"B","C","D","B"} プログラムは以下のように組みました。 public class ArrayFun { public String[] oneRemoved(String[] array, String strToRemove) { int count = 0; for (int i = 0; i < array.length; i++) {      if (strToRemove.equals(array[i]) && count == 0) {        for (int j = i; j < array.length - 1; j++) {          array[j] = array[j + 1];        }          count++;      } }      array = new String[array.length - 1];      array[array.length - 1] = null;      return array; } } ちなみにcountは、一度シフトすればもう同じ文字列がそれ以降の配列にあってもシフトはしないので、countでシフトしたかどうかを判断しようと思い付けました。 これでテストメソッドも作るのですが、 import static org.junit.Assert.*; import org.junit.Test; public class ArrayFunTest { @Test public void testoneRemoved() { ArrayFun af = new ArrayFun(); String[] a1 = {"A","B","C","D","B" };//元の配列 String[] a2 = {"A","BB","CCC","DDD","B"};//元の配列 String[] a3 = {"B","C","D","B"};//シフト後の配列 String[] a4 = {"A","BB","CCC","DDD","B"};//シフト後の配列 assertEquals(a3, af.oneRemoved(a1, "A")); assertEquals(a4, af.oneRemoved(a2, "NotHere")); } } 以上のように組むと、assertEqualsの真ん中に黒線が入って自動的に@SuppressWarnings("deprecation")が加えられてしまいます。 実行結果は、({"A","B","C","D","B"}, "A") の例だと、配列0にB が入るはずがnullになっている、とエラーがでます。 どのようにしたら正常に動かせるでしょうか?宜しくお願いします。

    • ベストアンサー
    • Java
  • 多次元配列を、1次元の配列にする関数を書いてください。

    以下のように、多次元配列の配列をペチャンコにする関数(array_flatten)ってどうかきますか? <?php $arr[0] = 'a'; $arr[1][0] = 'b'; $arr[1][1][0] = 'c'; $arr[1][1][1][0] = 'd'; $arr[1][1][1][1][0] = 'e'; $arr[1][1][1][2] = 'f'; $arr[1][1][2] = 'g'; $arr[1][2] = 'h'; $arr[2] = 'i'; function array_flatten($arg){   処理; } $new_arr = array_flatten($arr); print_r($new_arr); ?> ↓ Array (   [0] => a   [1] => b   [2] => c   [3] => d   [4] => e   [5] => f   [6] => g   [7] => h   [8] => i ) ※関数のなかで、ペチャンコの配列を格納するための新しい配列を宣言すると、 同関数を再帰的に呼び出したら、その配列が初期化されますよね?

    • ベストアンサー
    • PHP