• 締切済み

SQL 関数ループでデータ取得

SQL 関数ループでデータ取得 オラクルSQLで、FUNCTIONを作成し、その結果データを取得するSQLを作っています。(下記参照) begin buffer := null; for i IN 1..5 LOOP buffer := 【関数A(i)】; END LOOP; return buffer; イメージとしては、シーケンス番号(i)によって異なるデータを1つずつ取得したいのですが、 上記のようにすると、1回のループ毎にbufferが書き換えられ、結局最後のデータしか取得できません。 END LOOP前にreturnをはさんでしまうとその時点で関数が終了してしまうので逆に、最初のデータ しか取得できませんし。 上記のような関数を使う理由は、上記のiを固定(下記で言うi IN 1..5)でなく、 データの個数を可変で取得する仕様を考えているからです。具体的にはMAX関数でシーケンス番号の最大値を用意し、そのデータの個数取得できるようなものを考えています。 固定ならば、下記のようにその個数分関数を記述すればいいですので 【関数A(1)】; 【関数A(2)】; : 【関数A(5)】; 記述を1行で個数分のデータを取得できる方法はないでしょうか? SQLに詳しい方、ぜひご教授ください。

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

みんなの回答

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

関数Aの戻り値が文字列なら buffer := buffer ||【関数A(i)】; とか。

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

bufferを配列にすれば。

関連するQ&A

  • PL/SQLカーソルの2重FORループができません

    こんにちは。 PL/SQLで下記のようなFORループを 2重3重に処理することはできないのでしょうか? コンパイル時に PLS-00103: 記号"END"が見つかりました と、内ループの"END"に対して起こられてしまいます。 お分かりになる方、よろしくお願いします。 … <<L_OUT>> FOR data_a IN csr_a LOOP  … <<L_IN>> FOR data_b IN csr_b LOOP  END LOOP L_IN;  … END LOOP L_OUT; …

  • ループ処理について。

    下記のようなプログラムを作りました。 機能としては同じDB内にある異なるテーブルの日付を比較し、 違うものがあれば挿入するというものです。 ただしこの場合ではうまくいきません。 (1)テーブルの値を順に読み取り、 (2)にあるテーブル全ての行に対応させ、 ある行に値があれば、ループをぬけて そのsql文には空にするという形にしたいのですが、 このままですと条件文だけしかぬけていません。。。 何かよい方法があればご教授お願いいたします。 //比較するテーブル・・・(1) for($i=0;$i<$num;$i++){ $num_i=(レコードを取得する関数); //挿入するテーブル・・・(2) for($j=0;$j<$num;$j++)} $num_j=(レコードを取得する関数);    //日付が同じでなければ挿入する if($num_i["start_date"] != $num_j["start_date"] && $num_i["end_date"] != $num_j["end_date"]){ $sql[$i]="INSERT INTO date (start_date,end_date) VALUES(".$num_i["start_date"].",".$num_i["end_date"].");"; } else{ $sql[$i]=""; break; } } if($sql[$i] != ""){ print($sql[$i]); } }

    • ベストアンサー
    • PHP
  • 配列 x に入っているデータの個数を求める関数の作り方

    配列 x に入っているデータのうちで、値が正(つまり x(i) .gt. 0.0d0 ) であるデータの個数を求める関数 numpos(x,n) を作り方を教えてください。n はデータの個数。 implicit real*8(a-h,o-z) real*8 x(1000) dummy = rand(13) 乱数の初期化 n = 1000 do 10 i=1,n x(i) = rand(0)-0.4d0 テストデータ 10 continue write(6,*) 'numpos =', numpos(x,n) stop end function numpos(x,n) implicit real*8(a-h,o-z) real*8 x(*) この部分が分かりません。(関数副プログラムなので、関数の値、つまり正のデータの個数は、関数名と同じ名前の変数、つまり numpos という名前の変数へ代入すること、らしいです。) return end とても困っていますし、急いでいます。 誰か助けてください。 よろしくお願いします。

  • 配列生成される限り、ループしたい

    function arrayxml (){ urlで取得したXMLから、配列を取得 return $hairetu; //戻り値は多次元配列 } $data = arrayxml(); $cnt = count($data); do { for ($i=0; $i < $cnt; $i++) { $data = arrayxml($data[$i][0]); } } while (count($data) > 0); //関数によって配列が作られる限り このスクリプトではループはうまくされません。 $data = arrayxml($data[$i][0]);を--->arrayxml($data[$i][0]);にすると $cnt分ループされますが、do~whileのループはなされません。 関数で配列が生成される限り、do~whileループをさせたいのですが正しい方法を教えていただけないでしょうか。 よろしくお願いします。

    • ベストアンサー
    • PHP
  • 2つの情報を1つのSQLで取得する方法について

    お世話になります。 SQL文で、下記内容のデータを取得する方法がわかりません。 ・TESTテーブルからA、B、Cの3項目のデータを取得する。 ・但し、この中のC項目については、WHERE句の条件を満たす データの最大値を取得する。 ・項目AおよびBの取得条件は、項目Cと同一条件とする。 ・目的は、項目AおよびBに関しては、WHERE句の条件を満たす  全てのレコードを取得し、項目Cにおいては最大値のみ取得したい。 上記内容を取得しようと考えた場合、 現時点で下記のSQL文を作成して実行しましたが、 うまくデータが取得できません。 SELECT A, B, C FROM TEST WHERE C = (SELECT MAX(C) FROM TEST) AND Z = 'xxxxx' AND Y = 'x' AND X = 'Y' ※項目X, Y, ZはTESTテーブルのカラムです ※上記SQLを、A、Bのみ取得用とCのみ取得用に   それぞれ分解して実行すると、それぞれの結果は   正常に取得できます。 2つの結果を1つのSQLで取得することは可能でしょうか? どなたかご教授願えますか?よろしくお願いいたします。

  • 関数の中のループについて

    typedef struct{ int num; char basic_gainen[MAX][32]; int particle[MAX]; }Gainen; int main (void){ Gainen g1, g2; char str1[256] = "外国_の_大型_の_船"; char str2[256] = "大型_の_船"; char buf[256]; divide(&g1, str1);//文字列の中から助詞と名詞を取得 divide(&g2,str2);//文字列の中から助詞と名詞を取得 printf("gainen:%s\n",print(&g1,buf)); printf("gainen:%s\n",print(&g2,buf)); if(hikaku(&g1,&g2)==1) printf("一部の単語は一致する\n"); } //二つの文字列を比較し、一部一致するかどうかの判定 int hikaku(Gainen *g1, Gainen *g2){ int n,i; if(g1->num != g2->num){ if(g1->num >= g2->num) n = g2->num; else n = g1->num; printf("n:%d\n",n); for(i=n;i>0;i--){ printf("inside loop i:%d\n",i); if(g1->particle[n] != g2->particle[n]) return 0; else if(strcmp(g1->basic_gainen[n],g2->basic_gainen[n]) != 0 ) return 0; } } return 1; } divide関数を省略させて頂きます。 hikaku関数のところで、二つの文字列の助詞と名詞が一致しなかったら0を返すその以外は1と返すというふうにしたいですが、実行したらhikaku関数から0の値wが返された。ループの数を表示したら、上のやり方でループがまわらないというのはわかったんです。上の条件判断はいけないですか?ご教授よろしくお願いします。

  • PL SQL のループ

    あるセレクト文のパフォーマンスを測定するためにループで複数回実行し時間を測定したいのですが、select 変数 into をしないとコンパイルできず実行できません。 同じセレクト文を複数回実行し時間を測定するのに良い方法は無いでしょうか? CREATE OR REPLACE PROCEDURE test IS BEGIN DBMS_OUTPUT.PUT_LINE(TO_CHAR(sysdate(),'YYYY/MM/DD HH24:MI:SS')); FOR i IN 1..100 LOOP SELECT a,b,c,d,e FROM tbl; END LOOP; DBMS_OUTPUT.PUT_LINE(TO_CHAR(sysdate(),'YYYY/MM/DD HH24:MI:SS')); END;

  • PL/SQLの動的SQLで複数の項目を取得する方法教えて下さい。

    動的SQLで複数の項目を取得する方法で 悩んでいます。 下記の例だと、1項目しか取れません。 何か他のやり方でもいいので、複数の項目を 取得する方法を教えていただきたいです。 ********************************************* declare sql_stmt varchar2(200); wk_grp varchar2(5); wk_name varchar2(30); type cursor_type is ref cursor; cur_name cursor_type; begin wk_grp := '1u'; open cur_name for 'select 名前 from 社員表 where 所属グループ = :v1' using wk_grp; loop fetch cur_name into wk_name; exit when cur_name%notfound; dbms_output.put_line(wk_name); end loop; close cur_name; end; ********************************************* 下記のようなDBMS_SQLパッケージ?? を利用した方法がいいんでしょうかね。。。。 DBMS_SQL.COLUMN_VALUE(SQL,1,WK_NAME) DBMS_SQL.COLUMN_VALUE(SQL,2,WK_NO) よくわかってないので、宜しくお願いします。

  • fgetsとループ処理

    C言語の勉強をしております。 http://oshiete1.goo.ne.jp/qa4436782.html での質問に付随することなのですが、新しく立てさせていただきました。 キーボードからの入力で、何も入力されない場合にループから抜けたいんですが、以下のように記述すると、fgetsが飛ばされてしまいました。 char buffer[80]; int i; for(i = 0; i < 1000; i++){ memset(buffer, 0, sizeof(buffer));   printf("登録する名前を入力してください:"); fgets(buffer, sizeof(buffer)-1, stdin); /* 名前が未入力でEnterされた場合 */ if(buffer[0] == '\n'){ /* ループを抜ける */   break;   } } sscanf(buffer, "%s", work_pt->names); 1回目のループで未入力とすると正常にループから抜けるんですが、 データを1度入力してから2回目の入力で未入力とすると、 「登録する名前を入力してください:」の表示後、ループから抜けてしまいます・・・。 どなたか原因と解決策の分かる方がおられたら教えていただけないでしょうか?

  • VBScriptでSQLに接続し、CSV出力したい

    お世話になります。 VBScriptでSQLに接続し、CSV出力したいのですが、どうしても上手くいかないのでどうかアドバイスを頂けたらと思います。 検索したサンプルを基に作成したプログラムです。 -------------------------------------- Dim ObjConn Dim objFso Dim objCsv Dim objRc Set ObjConn = Server.CreateObject("ADODB.Connection") ObjConn.Open "Provider=SQLOLEDB;Server=XXXXX;Database=XXXXX;UID=XXXXX;PWD=XXXXX" Set objFso = CreateObject("Scripting.FileSystemObject") Set objRc = Server.CreateObject("ADODB.Recordset") Set objCsv = objFso.CreateTextFile("C:\テスト.csv", True ) sql = "select * from `商品マスタ`" objRc.Open sql, ObjConn Dim i Dim Buffer Do While not objRc.EOF Buffer = "" For i = 0 to objRc.Fields.Count - 1 if Buffer <> "" then Buffer = Buffer & "," end if Buffer = Buffer & objRc.Fields(i).Value objCsv.WriteLine(Buffer) Next objRc.MoveNext Loop -------------------------------------- これを実行すると、無限ループのような状態になり、テスト.csvに延々改行のみが出力されます。(文字は何も出力されない) sql文の結果としては正しくは10レコードだけなので、For~Nextのループも10回しか繰り返さない筈なのですが、延々繰り返してしまっています。 objRc.RecordCount をやってレコード数を調べてみようともしましたが、結果としては何も返ってきません。 カーソルタイプによっては『-1』しか返らないとのことですが、-1すら返りません。 つまり、接続の時点で失敗していると思われるのですが、どこが間違っているのかが分かりません。 お詳しい方、ご教示いただけないでしょうか。 どうぞ、宜しくお願いいたします。