テーブルデータのフェッチ

解決


LUKU  2010-01-15 15:43:04  No: 36998

オラクルデータベーステーブルからある値を持っているデータ(年齢25才以上)をある一定件数フェッチしてとってこようとしてます。。クエリを使い、SQL.ADDのなかで、オラクルのFETCH関数を使っているますが、思い通りにいきません。DELPHI5以降で、上記のようなfetch処理をした人はいらっしゃいますか?

もしいましたら、情報をいただけませんか?


HOta  2010-01-15 16:47:58  No: 36999

Fetchは知りませんが、
SQL.Add('Select *');
SQL.Add(' From テーブル名');
SQL.Add(' where 年齢 >= 25');
の様なSQLで発行すれば対応レコードを取り込めます。
どのようにしたいかをもっと詳しく説明していただけませんでしょうか?


igy  2010-01-15 17:00:58  No: 37000

>オラクルのFETCH関数を使っているますが、思い通りにいきません。

試したソースコードを書いてみるのは
いかがですか?
あと、期待する結果と実際に表示する結果なども。


Ru  2010-01-15 17:18:45  No: 37001

>一定件数フェッチ

SELECT * FROM Table WHERE 年齢 >= 25
FETCH FIRST 20 ROWS ONLY

こういうことですか?
25歳以上が100件あるとして,そのうち20件を取得します。


LUKU  2010-01-20 08:58:10  No: 37002

ありがとうございます。Ruさん、ちなみにデータの頭から20件ではなく、ランダムに20件とる方法ってありますか?


Ru  2010-01-20 17:47:10  No: 37003

たぶんないと思いますが,SQLのFETCH構文を調べてください。

あとはプログラムで強引にするぐらい?
TClientDataSetを使用してRecNoプロパティがレコード位置になりますので,
Random関数を用いてRECNOと一致した物を拾うルーチンを20回するとか?


delphi大好き  2010-01-20 21:52:20  No: 37004

自分なら以下でトライしてみます

query1.sql.text := 'select count(*) from テ−ブル名;';
query1.open;
i2 := query1.fieldbyname(count(*))・asineger;
query1.close;
query1.sql.text := 'select * from テ−ブル名';
query1.open;
i :=1;

while 1 = i do begin
  s := query1.fieldbyname('フィ−ルド名').asstring;
  memo1.lines.add(query1.fieldbyname('フィ−ルド名').assring);
  query1.next;
  if s = query1.fieldbyname('フィ−ルド名').asstring then
    i:= 0;
end;

i2 :=0
while 20 > i2 do begin
  memo1.lines[randam(i2)];
  i2:= i2 +1;
end;

携帯から打ったのでスペルミス、エラ−等あるかもしれません。
ミスってたらゴメンナサイ;
あとスペル解らなかったので書いてありませんがランダマイズをする必要があります。


delphi大好き  2010-01-20 22:03:03  No: 37005

ミスです。すいません。

memo1lines[randam(i2)];

memo2.lines.add(memo1.lines[randam(i2)]);
です。
結果を出力するのを忘れてました^^;


delphi大好き  2010-01-20 23:56:10  No: 37006

致命的ミス書いてました汗

i3 := 0;
while 20 > i3 do begin
  memo2.lines.add(memo1.lines[i2]);
  i3 := i3 + 1;
end;

 です。
i2とi3を混同して書いてました
更にrandamじゃなくてrandomでした。汗


delphi大好き  2010-01-21 05:47:13  No: 37007

上記のだと結果がだぶってしまいますね
しかもまたミスってます。
何度もすいません^^;

i3 := 0;
while 20 > i3 do begin
  s2 := memo1.lines[random(i2)];
  if -1 = memo2.lines.indexof(s2) then begin
    memo2.lines.add(s2);
    i3 := i3 + 1;
  end;
end;

一応見直しましたが
携帯から書いてるので、もしかしたらまたミスってるかもしれません。
しかも試してないので自信ありません。
一応よく書く方法なので、
多分大丈夫だと思うのですが・・・


LUKU  2010-01-21 09:01:45  No: 37008

参考になりました。ありがとうございました。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加