• ベストアンサー

PL/SQLのアドバイスをお願いします。

主にオラクルのデータをAccess2000からレポートして使っています。 〒コードが、数字データで保存してあります。 例)3430123 今はクライアントPC側のAccessで 例) 343-0123 と計算させて利用しています。 こういった計算はオラクル側でPL/SQLなどを利用したほうが効率はいいでしょうか? それとも毎回計算させるのであれば、クライアント側かサーバ側で計算速度に違いはありませんでしょうか? ※実際にはオラクルの〒コードのフィールドが数値になってしまっているので、 コードが5~7桁とデータがまちまちになってしまっています。 例)北海道 0013304 → 13304 (とオラクルで保存) データを利用するとき、5桁と判断して001-3304 と計算させています。 00で始まる番号、0で始まる番号、0以外で始まる番号の3種類データがあります。 まだ、PL/SQLを利用したことがないのですがこれから活用しようと考えています。

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

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

  • ベストアンサー
  • GoF
  • ベストアンサー率37% (34/91)
回答No.4

もし力技でよければ translate(to_char(postal_no, '000,00000'), ',_','-') で生成できます。↑の',_'のアンダーバーは' 'にしてください。 ユーザ関数などを使って NUMTOPOSTALCODE関数などで覆い隠さないと 一見して何を意図しているのか分かりません。 要注意なコードの一つの例みたいものですね。 速度に関しては、この程度では大して変わらないと思います。 但し、レスポンスに非常困っている、大量のデータを一気に処理している 明らかにクライアントは時代遅れのマシンである。 を満たす場合には「やってみますか?」程度だと思います。 ちなみビューをかますと、レスポンスがガタ落ちすることが多いので安易な利用は控えたほうがよいです。

taaaaaaa
質問者

お礼

アドバイスありがとうございます。 本来ならフィールド定義を変更したいとことですが カスタマイズされたアプリケーションが動作しなくなる ことが分かったので、計算させるしかないのが現状です。 translata... を使えば、データの桁数に係わらず対応出来ますね。 工夫して試してみます。

その他の回答 (4)

  • asianttw
  • ベストアンサー率0% (0/5)
回答No.5

状況は完全には分かりませんが、、、 可能であれば、カラム自体をVARCHAR2に変えてしまうべきでしょうね。データ件数が膨大で処理が重いということであれば、スナップショットを作ってしまうのが効果的だと思います。 SQL_PLUSは基本的にサーバでのデータ処理に使うのが有効だと思います。

  • mitoneko
  • ベストアンサー率58% (469/798)
回答No.3

 (ベーステーブルの構造は修正してはならないという条件付きで)  計算速度的には、どちらでやっても似たり寄ったりだとは思います。  クライアントのデータ処理の方が多様になる傾向が大きいように思うので、どうせ必ずしなければならないなら、私は、サーバー側で処理してしまいます。デコード関数をPL/SQLで作っちゃって、ビューをかぶせてしまう形になるでしょうか。  そうしておけば、将来、違うレポートで使うなどの場合でも、変換処理のことは二度と考えずにすみます。

taaaaaaa
質問者

お礼

ビューについてのコメントを頂いたので試してみました。 いままで全然利用していなかったのですが、場合によっては効果がありますね。 クライアント側の処理をビューで持たせたところ処理時間が1/3~1/4になりました。 ありがとうございました。

  • shangzi
  • ベストアンサー率47% (17/36)
回答No.2

私の場合そう言う時にはオラクル側で、 declare A varchar2(7); --オラクルDBの郵便番号の文字型 B varchar2(8); --Accessに引き渡す郵便番号 begin A := lpad(to_char(郵便番号),7,'0') --郵便番号を文字型に変換し7桁0埋め処理をする  B := substrb(A,1,3)||'-'||substrb(A,4); --ハイフンを付与する end; とSQL関数で対応しています。  簡単な処理ですので速度的にはAccess側、ORACLE側どちらで処理しても、問題にはならない程の速度で処理できるはずです。  構造上では、不正な型で格納しているのはOracle側なので、成形した正しい型のものをAcsessに渡してやるのがいいかも知れません。  見当違いの答えだったらごめんなさい。

回答No.1

こんにちは オラクル側で数値データで保存してあるのは悲劇ですね。 クライアント側かサーバ側のどちらが効率的かということですが、クラアントがたくさんあるなら、サーバで集中させて処理するより分散したほうが計算速度は速いと思います。 ただ、オラクルはPL/SQLなどで引数が違うだけのものは解析してメモリにキャッシュしておくので毎回計算といっても、実行文→解析→実行 ということはやってないません。 しかし、今回の場合ですと簡単な処理なのでどっちでもいい気がします。^^; 私がやるならオラクル側のテーブルの変更をするか、ビューを作ります。 ただPL/SQLは便利なので勉強を兼ねて利用することをオススメです!

関連するQ&A

  • PL/SQLでmdb(Access)ファイルへの書き込みは可能?

    あまりPL/SQLに関して知識がないので 可能なのかを教えていただきたいのですが、 例えば、 Oracleのテーブルデータ(例:メッセージテーブル) をローカルの空のMDBファイルへ丸ごとコピー といった処理をVBで行っているのですが、 毎回Insertを発行しているために とても処理に時間がかかっています。 (もともとこれ自体無謀なんですが・・・) そこでPL/SQLではバルク処理?といった 高速処理もあるようで、 このVBのかわりにPL/SQLで出来ないものだろうか・・・ と単純に思ったのですが、 PL/SQLでこういったコピー処理っていうのは 可能なんでしょうか?? ご存知の方、教えていただきたいです。 よろしくおねがいします。

  • うまくPL/SQLが書けません。

    PL/SQLを作成しているのですが、うまくいかないので 質問させていただきました。SQL初心者ですがよろしければご教示ください。 テーブル名  カラム名 Bar       number numberには’AB734869 テスト’、‘AB364850 再テスト’ といった具合にまず8桁の番号が入り、その後データによってテキスト項目が続いています。 そしてnumberのデータへ、一律、頭から数えて5バイト目と6バイト目の間に’0000’という文字列を挿入したいと考えています。 例えば’AB734869 テスト’の場合は’AB7300004869 テスト’というようにしたいのですが、良い方法が思いつきません。 STUFF関数は使えませんし。。。UPDATEやINSERTを使ってやろうと思ったのですが、 どうしても出来ません。 皆様の知恵を拝借頂けたらと幸いです。 宜しくお願いいたします。 m(_ _)m

  • SQLアプリケーション制御

    Oracleのデータを操作できるアプリケーションを端末ごとに、使用可/不可にわけたいのですが、可能でしょうか?例えば、 Aさん------SQL*Plus ○ Access ×  Bさん------SQL*Plus ○ Access ○  できれば、ここのクライアントで設定するのではなく、サーバー側で一括設定したいです。 どうか教えてください。お願いします。

  • 異なるDBのSQL

    SQLを始めたばかりの初心者です。 oo4oやADOを使用して、オラクルサーバーのデータをSELECT文で オラクル内の複数のテーブルを結合してListViewで表示する プログラムを作成中です。 オラクルサーバーにメインデーターがあり 各クライアントにMDB形式でマスタデータがあります。 MDBのマスタデータにはたとえばですが、テーブル名 [商品テーブル] フィールド名[コードナンバー]、[商品名]... となっており、サーバーには、テーブル名[商品コード]  フィールド名[コードナンバー]、[受注日]....があるとします。 クライアントからoo4oやADOを使用して、サーバーのデータを SELECT文でオラクル内の複数のテーブルを結合して ListViewで表示するのはできます。しかし [コードナンバー]は取得できるのですが、サーバーのテーブルには、 [商品名]がないためとうぜん表示できません。 この場合、オラクルから取得したデータをマスタデータのあるMDBに新しくテーブルを 作りそこに一度格納して再度ADOで結合処理して 商品名を表示する方法しか考えつかないのですが、 ほかに良い方法はありますでしょうか? ADOで接続MDBに保存再度ADOで接続して表示では レスポンスが悪いかなと思いまして... *VB6 winXP-pro オラクル9i

  • PL/SQLで@ファイル名が反応しません

    はじめまして、PC超初心者なのにOracleを勉強し始めました。 PL/SQLの本を買って見よう見真似でやっているのですが、SQL*PLUSから@<ファイル名>を実行しても何の反応もありません。 SQL>@sample1 としても SQL>@sample1 SQL> と何事もなかったようになります。 本によればエディタに保存したSQL内容が実行されるとあるのですが。。。 ちなみにサンプルエディタをダウンロードして、実行しようとしても全くの無反応です。 どこか根本的な設定がおかしいのでしょうか。。。 どなたかご回答いただけると助かります。

  • SQL ServerのUNICODE設定について

    SQL Server 2005を使っていますが、SJIS形式で格納された、Oracleの データを、SQL ServerのUNICODEで構成されたテーブルに、ロードする 必要があります。 Oracleでは、異なる文字コードの場合、SQL Netが自動的に、文字 コードを判断して、自動変換してくれますが、SQL Serverでは、 どのようになりますか?SQL Native Client等が、自動変換してくれる のでしょうか? お手数ですが、どなたかお教え下さい。

  • SQLの書き方

    電話番号がcsvファイルに000-0000-0000 という形で たくさん入っています。これをアクセスのフォームを使って 読み込んで、オラクルサーバーとつなげ、SQLを発行しています。 DB上には電話番後はtel1 000 tel2 0000 tel3 0000 というように、フィールドが分かれてハイフンなしで入っています。 これを抜くためにはどのようなSQLをかいたらいいのでしょうか? 苦し紛れに書いてみたSQLは select telno1_1||'-'||telno1_2||'-'||telno1_3 as TEL1,* from DB where TEL1 = '" & n1 & "'" というものです。 n1にはcsvから読み込んだ電話番号が000-0000-0000の形で入っています。 どなたか教えてください。 宜しくお願いします。

  • PL/SQLでSJISの文字コードを取得可能でしょうか

    失礼いたします。 PL/SQLでSJISの文字コードを取得したいのですが可能でしょうか。 文字コードのみを取得したいので、CONVERT関数やCHR関数などの変換関数は不要です(WIN拡張以外の外字判定に使用するため)。 ORACLEは8iです。 どなたかご存知の方、いらっしゃいましたら教えていただけませんでしょうか。 よろしくお願いいたします。

  • pl/sqlでcsvファイルダウンロード

    Oracleアプリケーションサーバーを利用しています。 Oracle8i。 PL/SQLから特定のテーブルのデータをCSVダウンロードさせるようにしたいのですが、ファイル名の特定ができません。 処理順序  declare    略  begin    owa_util.mime_header('text/csv', FALSE);    owa_util.http_header_close;    動的SQLを利用して一行ずつhtp出力    end 実行するとダウンロードを促すダイアログが表示されますが、そのとき表示されるファイル名がパッケージ名になっています。ソース中で任意にファイル名をつけたいのですがどうしたらよいでしょうか? または、ブラウザにデータを表示させたEXCELを表示させるといった方法でもよいです。(一行にカンマ区切りのデータが収まってしまうのはNG)   よろしくお願いいたします。

  • MySQLでの動的SQL

    javaとOracleを利用して開発をしています。 OracleのデータをそのままMySQLへ移行し、 小規模の類似システムを構築しようと考えているのですが、 MySQLではOracleと同様に、 動的SQL(埋め込みSQL)を利用することは可能でしょうか? また、参考になるサイトがあれば教えていただきたいです。 宜しくお願い致します。

    • ベストアンサー
    • MySQL