(現在 過去ログ36 を表示中)

HOME HELP 新規作成 新着記事 トピック表示 ファイル一覧 検索 過去ログ

[ 最新記事及び返信フォームをトピックトップへ ]

■5556 / inTopicNo.1)  外部dbで抽出件数の取得
  
□投稿者/ 尾形 -(2010/01/28(Thu) 10:28:33)
    よろしくお願いします
    MySQLです

    売上等のデータ抽出検索フォームを作成しています
    得意先id、商品id、品名(部分一致)、期間
    といった条件を指定して、&DSQLにセットしてから
    xvwを開いて抽出したいのです

    条件内容によっては、膨大なデータ件数が抽出されます
    動作が止まったような感じになってしまうのです
    事前に件数を把握する等して、対処したいのですが

    桐の環境設定に「抽出レコード数と経過表示」の設定が
    ありますが、このあたりを何とか使えないものかとも思うのですが
    (このパラメータがxvw毎の設定ならばいいのに)

    厳しいとは思いますが、よろしくお願いします

引用返信 [メール受信/OFF] 削除キー/
■5558 / inTopicNo.2)  Re[1]: 外部dbで抽出件数の取得
□投稿者/ うにん -(2010/01/28(Thu) 14:58:42)
    > 事前に件数を把握する等して、対処したいのですが
    同じテーブルから計算項目1つだけのxvwを作って、
    #COUNT( [得意先id] )
    それに#DSQLを設定して抽出してみると、結果は1行だけなので速いようです。
引用返信 [メール受信/OFF] 削除キー/
■5562 / inTopicNo.3)  Re[2]: 外部dbで抽出件数の取得
□投稿者/ 尾形 -(2010/01/29(Fri) 06:04:42)
    なるほどです

    どうも、ありがとうございました

解決済み!
引用返信 [メール受信/OFF] 削除キー/
■5564 / inTopicNo.4)  Re[2]: 外部dbで抽出件数の取得
□投稿者/ hidetake -(2010/01/29(Fri) 09:37:16)
    > 同じテーブルから計算項目1つだけのxvwを作って、
    > #COUNT( [得意先id] )
    > それに#DSQLを設定して抽出してみると、結果は1行だけなので速いようです。

    桐の場合、出来ることが限られているし、対象のテーブルを
    動的に変更できないので、ムダなこともせざるを得ないのが
    面倒です。件数だけを把握したのに、対象のテーブル毎に
    結合表を複数用意するなんて・・・

    などと思い、単純にやる方法は無いのかと考えたのですが、
    一つは以前に書いたコマンドクエリをトリガを使い実行する
    方法。ただ、これはサーバ側にトリガを用意しないといけ
    ないし、メンテナンスの事もあるので、ほかの方法はと思い。


    ムダなテーブルを1つ用意することになるのですが、テーブル
    counter と言う、ただ 1 から 1ずつ増加する整数のテーブル
    を用意する。項目は1つ。最大件数(最大数)は自分が扱うで
    あろう最大件数。ただ、大まかな件数がわかれば良いのであれ
    ば 10毎とか 100毎とか飛び飛びの数値でも構わない。

    で、項目 counter を表示する結合表を作成。
    絞り込み条件に #DSQL(&STR) を設定。

    あとは &STR に

    1飛びのデータを用意した場合は
    counter = (SELECT count(*) FROM 対象TABLE WHERE 対象TABLE.対象カラム > 20100000)
    のように &STR にセットする。条件などは任意。
    # "" の括りなどは省略

    飛び飛びのデータであれば
    counter >= (SELECT count(*) FROM 対象TABLE WHERE 対象TABLE.対象カラム > 20100000) ) ORDER BY counter LIMIT 1; --

    counter <= (SELECT count(*) FROM 対象TABLE WHERE 対象TABLE.対象カラム > 20100000) ) ORDER BY counter DESC LIMIT 1; --
    のように「それ以下」や「それ以上」のデータを1件だけ
    取りだす。

    と言うように副問い合わせを用いた方法もあるかな?と。

    桐でもっといい方法があればよいのだけれど・・・


引用返信 [メール受信/OFF] 削除キー/
■5567 / inTopicNo.5)  Re[3]: 外部dbで抽出件数の取得
□投稿者/ hidetake -(2010/01/29(Fri) 11:19:26)
    2010/01/29(Fri) 11:31:35 編集(投稿者)

    > 桐でもっといい方法があればよいのだけれど・・・

    もっといい方法方があった!

    今まではトリッキーな例として SQLコマンドインジェクション
    攻撃で #DSQL にハッキングを仕掛けていたものを計算式に仕掛ける
    もの! 計算式ハッキング。

    この方式だと、対象のテーブルは何でも良い(既存の適当なものを
    使える)。それに、答えとなる値を全て用意しておく必要も無い。

    方法としては、1つの結合表を用意する。
    表示項目に「件数」とでも適当に付け、計算式に #count(&STR)
    と記入する。

    &STR には
    *') FROM 対象テーブル WHERE 対象テーブル.対象カラム >= 20100000 ; --
    のように代入。それだけ!

    対象テーブルと #DSQL で投げかける条件式をそれぞれ変数ででも
    用意し、この式が成り立つように組み立てるだけで、複数の .XVW
    は用意する必要は無くなります。

    手元の PostgreSQL の場合は #NUM とか #STR と言った関数が
    使えないけど、使える環境だと、更に更に応用は可能かも!?



    なお、実際には次のように処理されるので
    [88.375]conn=03B73AB0, query='SELECT COUNT(*) FROM "仮のテーブル" '
    [88.375]conn=03B73AB0, query='SELECT COUNT('*') FROM 対象テーブル WHERE 対象テーブル.対象カラム >= 20100000 ; --') FROM "仮のテーブル" '

    仮に使う結合のテーブルは、小さいものやワーク用のテーブルを
    用意した方が良いかも?
    それに、DB によっては SELECT COUNT('*') で何かあるかも?


引用返信 [メール受信/OFF] 削除キー/
■5568 / inTopicNo.6)  Re[4]: 外部dbで抽出件数の取得
□投稿者/ hidetake -(2010/01/29(Fri) 12:11:44)
    > 手元の PostgreSQL の場合は #NUM とか #STR と言った関数が
    > 使えないけど、使える環境だと、更に更に応用は可能かも!?

    ついでだから、結合に対象としていない別のテーブルやら
    任意の SQL を実行し、文字列の結果を得る方法。

    PostgreSQL の 7.2 でも #CAT は使えたので

    計算式に #CAT(&STR) と仕込む。

    あとは &STR に
    ','')} || "対象カラム" FROM 対象テーブル ; --
    と文字列を与えてやれば、文字列の結果も得られました。

    実際には


    query='SELECT COUNT(*) FROM "仮のテーブル" '
    query='SELECT textcat('','') || "対象カラム" FROM 対象テーブル ; --',)} FROM "仮のテーブル" '

    のように実行されます。
    #CAT("") は {fn CONCAT('',)} に置き換えられ
    最終的には textcat 関数が使われますが
    textcat('') や textcat('',) ではエラーになり
    textcat('','') で無いと通らないを補完し、
    長さ0の文字列を、実際に必要な結果に連結して
    います。

    と言うことで、桐の標準的な使い方で得られない
    結果を得る方法の1つとして。 :-)


引用返信 [メール受信/OFF] 削除キー/
■5572 / inTopicNo.7)  Re[5]: 外部dbで抽出件数の取得
□投稿者/ hidetake -(2010/01/29(Fri) 13:21:06)
    >>手元の PostgreSQL の場合は #NUM とか #STR と言った関数が
    >>使えないけど、使える環境だと、更に更に応用は可能かも!?
    > ついでだから、結合に対象としていない別のテーブルやら
    > 任意の SQL を実行し、文字列の結果を得る方法。

    No5568 の方式は結果は1行だけでなく複数行の取得も可能。
    また、カラムも1つだけでなく、桐の結合に複数行の設定を
    行い「型」が一致していれば、文字列型だけでなく数値型も
    可能。当然、一番上の表示項目で全ての SQL文を完結させる
    わけだから、下に設定した項目は表示させるためのダミー。

    No5568 は文字列の取得と書いたけど、数値の結果だけを
    取得するいい関数が無いので、複数行の数値結果が欲しい
    場合は、2項目以降に必要な数値結果をえるようにすれば
    良し!

    で、あとはお好きなように・・・

引用返信 [メール受信/OFF] 削除キー/
■5575 / inTopicNo.8)  Re[4]: 外部dbで抽出件数の取得
□投稿者/ 尾形 -(2010/01/29(Fri) 16:53:25)
    どうも、ありがとうございます

    サラっと理解できるレベルにないのですが
    「締日が31の得意先の件数取得」を想定してみました

    新規でxvwを定義しました
    対象テーブルを mst_syohin に設定(何でもいいのですよね?)
    [件数]を定義 (計算項目) #count(&STR)
      ※項目はこれ(件数)1つのみ、グループ化指定なし
    &STRに下記をセット
    *') FROM mst_tokui WHERE mst_tokui.simebi = 31 ; --

    以上で実行するのですが、編集できません

    下記がODBCのログです
    SELECT COUNT(*) FROM `mst_syohin` ;
    SELECT COUNT('*') FROM mst_tokui WHERE mst_tokui.simebi = 31 ; --') FROM `mst_syohin` ;

    どこが悪いのでしょうか

    -- ←コレって何ですか?

引用返信 [メール受信/OFF] 削除キー/
■5581 / inTopicNo.9)  Re[5]: 外部dbで抽出件数の取得
□投稿者/ hidetake -(2010/01/29(Fri) 22:43:27)
    2010/01/29(Fri) 22:51:31 編集(投稿者)

    > 以上で実行するのですが、編集できません
    >
    > 下記がODBCのログです
    > SELECT COUNT(*) FROM `mst_syohin` ;
    > SELECT COUNT('*') FROM mst_tokui WHERE mst_tokui.simebi = 31 ; --') FROM `mst_syohin` ;
    >
    > どこが悪いのでしょうか

    どこが悪いのでしょうって 、エラーが出て通らないと言うこと?
    それとも「編集できません」ってこと?

    これは元々、
    No5564
    > 件数だけを把握したのに、対象のテーブル毎に
    > 結合表を複数用意するなんて・・・
    って、ことで(s/把握したのに/把握したいのに/)件数を得るため
    の手段で、件数を得た集計結果を「編集すること」が出来ないのは
    当然のことで、エラーが出るのなら COUNT('*') が MySQL では
    エラーになるとか?

    MySQL に直接 SQL を投げかけて通るか通らないか、目的の
    結果を得られるかも検証の為には必要でしょう。
    SELECT COUNT(*) FROM mst_tokui WHERE mst_tokui.simebi = 31 ;
    SELECT COUNT('*') FROM mst_tokui WHERE mst_tokui.simebi = 31 ;
    とか



    > -- ←コレって何ですか?

    No5193
    > #DSQL("ID>0) ORDER BY ID DESC LIMIT 1 --(")
    > と、 LIMIT 1 以降を SQL標準の -- で
    > コメントアウト化しましょう! (^^)



    > サラっと理解できるレベルにないのですが

    これが理解できないと、DB を使って、インターネットに公開する
    サイトを作ったりすると、今時のデータを不正に外部から持ち出さ
    れてしまったり、Webサイトにウィルスを仕込まれたり改竄されたり
    する危険性を持ったものを作る可能性もあるので、十分に理解しま
    しょう。 (^^)


引用返信 [メール受信/OFF] 削除キー/
■5583 / inTopicNo.10)  Re[6]: 外部dbで抽出件数の取得
□投稿者/ 尾形 -(2010/01/29(Fri) 23:48:23)
    「エラーが出て通りません」です

    すいません、もう少し掘り下げてみます m(__)m

引用返信 [メール受信/OFF] 削除キー/
■5584 / inTopicNo.11)  Re[6]: 外部dbで抽出件数の取得
□投稿者/ 尾形 -(2010/01/30(Sat) 07:56:40)
    phpMyAdmin 上からSQL操作で確認してみました

    SELECT COUNT(*) FROM `mst_syohin` ;
    SELECT COUNT('*') FROM mst_tokui WHERE mst_tokui.simebi = 31 ;
    上記2つは動作しました

    SELECT COUNT('*') FROM mst_tokui WHERE mst_tokui.simebi = 31 ; --') FROM `mst_syohin`
    これはエラーとなりました

    下記がエラーメッセージです
    > ERROR: 引用符が閉じていません @ 3
    > STR: '
    > SQL: --') FROM `mst_syohin` ;


引用返信 [メール受信/OFF] 削除キー/
■5585 / inTopicNo.12)  Re[7]: 外部dbで抽出件数の取得
□投稿者/ 尾形 -(2010/01/30(Sat) 08:10:15)
    -- の後ろにスペースを入れたら良いようでした

    --はオプション指定となる?

引用返信 [メール受信/OFF] 削除キー/
■5586 / inTopicNo.13)  Re[7]: 外部dbで抽出件数の取得
□投稿者/ hidetake -(2010/01/30(Sat) 08:15:27)
    > SELECT COUNT('*') FROM mst_tokui WHERE mst_tokui.simebi = 31 ; --') FROM `mst_syohin`
    > これはエラーとなりました
    >
    > 下記がエラーメッセージです
    >>ERROR: 引用符が閉じていません @ 3
    >>STR: '
    >>SQL: --') FROM `mst_syohin` ;

    '' を調整するために
    SELECT COUNT('*') FROM mst_tokui WHERE mst_tokui.simebi = 31 ; --'') FROM `mst_syohin`
    は?
    &STR だと
    *') FROM mst_tokui WHERE mst_tokui.simebi = 31 ; --'
    と言う感じ。
    しかし -- をコメントアウトとして見てくれないのかな?
    それだと、これらの方式は相当面倒くさいことになる。


    しかし、自分ももうろくしました。
    計算式に任意の SQL 文を実行させようとして、わざわざ
    #関数を使おうとするなんて・・・ orz

    素直に、計算式には &STR とやればよいのに!

    表示項目の1番目に「表示」という表示項目名で計算式に
    設定する。計算式は &STR
    実際の取得情報を表示されるために、2番目の項目を設定。
    項目名は「件数」、計算式は表示させるデータの型にあわせ
    件数であれば「1」とでも入れる。
    複数項目を取得したい場合は、以下にダミーの項目を作成し
    型をあわせる。

    &STR には
    件数',count(*) FROM mst_tokui WHERE mst_tokui.simebi = 31; --
    と言うように。

    # 一番目の項目に結果を得たいと脳が固定観念を持っている
    # からダメなんだ。 orz


引用返信 [メール受信/OFF] 削除キー/
■5587 / inTopicNo.14)  Re[8]: 外部dbで抽出件数の取得
□投稿者/ hidetake -(2010/01/30(Sat) 08:19:17)
    > -- の後ろにスペースを入れたら良いようでした
    >
    > --はオプション指定となる?
    >

    そうなんだ。
    # しかし脳に記憶させ続けることが出来るか > 自分

引用返信 [メール受信/OFF] 削除キー/
■5588 / inTopicNo.15)  Re[8]: 外部dbで抽出件数の取得
□投稿者/ 尾形 -(2010/01/30(Sat) 08:23:29)
    > -- の後ろにスペースを入れ
    これで桐でも通りました ^^

    件数カウントのクエリと実際の抽出クエリと
    2回同じようなクエリが出る?けど
    実際の抽出クエリの方ではキャッシュが効いて
    速度的にもイイ感じのようでした

    この方法って最高ですよね!
    色々使えそうです

    5568の方も勉強してみます

引用返信 [メール受信/OFF] 削除キー/
■5589 / inTopicNo.16)  Re[9]: 日本語未対応?
□投稿者/ 尾形 -(2010/01/30(Sat) 10:08:48)
    #count(&STR)で

    *') FROM mst_tokui WHERE mei1 LIKE "%a%" ; --
    これは通ります

    *') FROM mst_tokui WHERE mei1 LIKE "%あ%" ; --
    これが通りません

    ログを見ると
    SELECT COUNT('*') FROM mst_tokui WHERE mei1 LIKE "%') FROM・・・
    日本語までで切れています

    ODBC側の問題でしょうか?

引用返信 [メール受信/OFF] 削除キー/
■5590 / inTopicNo.17)  Re[10]: 日本語未対応?
□投稿者/ hidetake -(2010/01/30(Sat) 10:33:43)
    > *') FROM mst_tokui WHERE mei1 LIKE "%あ%" ; --
    > これが通りません

    SQL の文字列リテラルの場合、" と ' で両方使える場合(DB)も
    あるけど、通常は ' で
    *') FROM mst_tokui WHERE mei1 LIKE '%あ%' ; --
    では、

    データベースオブジェクトは "" で括る場合が多いけど、文字列
    は '' と言う使い分け。

引用返信 [メール受信/OFF] 削除キー/
■5591 / inTopicNo.18)  Re[11]: 日本語未対応?
□投稿者/ 尾形 -(2010/01/30(Sat) 10:44:04)
    ありがとうございます

    > *') FROM mst_tokui WHERE mei1 LIKE '%あ%' ; --
    やはり通りません

引用返信 [メール受信/OFF] 削除キー/
■5592 / inTopicNo.19)  Re[12]: 日本語未対応?
□投稿者/ hidetake -(2010/01/30(Sat) 10:47:56)
    2010/01/30(Sat) 12:04:15 編集(投稿者)
    2010/01/30(Sat) 11:12:39 編集(投稿者)

    >>*') FROM mst_tokui WHERE mei1 LIKE '%あ%' ; --
    > やはり通りません

    MySQL の場合は、ANSI の場合は " で、それ以外の場合は
    ` で括る独自仕様のようです。

    「SQL バッククオート」or「SQL バッククォーテーション」
    で検索すると出てきます。

    SQL の場合、" と ' と ` が出て来るので DB によって
    それぞれ違うので気をつけた方が良いです。

    MySQL の場合、動作モードで違いがあるとは前に書いたけど
    ANSIモード(SQL標準)だと、最初のように " と ' の使い
    分けで動作するようです。



    そう言えば、前にもバッククォート関係は出てきたんだった。
    そのときは識別子の記述方式の違いだった。
    No5459


    今回はリテラル関連

    8.1.1. 文字列
    http://dev.mysql.com/doc/refman/5.1/ja/string-syntax.html

    しかし、これを見る限りはそんな事は書いてないのだが・・・



    追加
    あれ? 最初に検索したページが出てこなくなった。
    これ
    http://dev.mysql.com/doc/refman/4.1/ja/string-comparison-functions.html
    を見ても、古い MySQL でも
    SELECT 'いあ' LIKE '%い%';
    SELECT 'イあ' LIKE '%い%';
    なんて記述されている。実物が無いとわからない。 (;_;)

    ちなみに PostgreSQL 7.2 では問題なく通ります。

引用返信 [メール受信/OFF] 削除キー/
■5593 / inTopicNo.20)  Re[13]: 日本語未対応?
□投稿者/ 尾形 -(2010/01/30(Sat) 12:25:19)
    > ` で括る
    やっぱりダメです

    >SELECT COUNT('*') FROM mst_tokui WHERE mei1 LIKE "%あ%" ;
    このあたりでも、直接コマンド投げると通るのですが

    > ANSIモード
    やってみます

引用返信 [メール受信/OFF] 削除キー/

次の20件>

トピック内ページ移動 / << 0 | 1 >>

[このトピックに返信]
Mode/  Pass/

HOME HELP 新規作成 新着記事 トピック表示 ファイル一覧 検索 過去ログ

- Child Tree -
- Antispam Version -