• 締切済み

PL/SQLで文字列を分割

PL/SQLで、CSVファイルを読み込んでDBにデータを登録しようとしています。 CSVの1行を読み込んだあと、 カンマで区切ってリストに格納してくれるような 便利な関数は無いのでしょうか? 1行の先頭から1文字づつカンマかどうか調べて取り出す、よりも簡単な方法があれば是非教えて下さい。

  • Oracle
  • 回答数4
  • ありがとう数0

みんなの回答

  • 7colors
  • ベストアンサー率25% (29/114)
回答No.4

SQL*loaderか何かで、テンポラリーか何かのTABLEに取り込んで、MERGEをかければ解決しませんか? そうすれば、重複は発生しないと思いますよ。 (しかも、1件ずつ比較するpl/sqlより早いはず)

guest98
質問者

補足

Oracle8i Release 8.1.6.0.0なので、MERGE文は使えません。

回答No.3

>よりも簡単な方法があれば ・SQL*Loaderを使う。 ・9i以降であれば、外部表として定義して、  insert into DEST select * from SRC; あたりが簡単で良いと思いますが。

guest98
質問者

補足

Oracle8i Release 8.1.6.0.0なんです。

  • PrintScree
  • ベストアンサー率25% (538/2091)
回答No.2

SQL*Loaderのコントロールファイルのパラメータで REPLACE ってありませんでしたっけ?確か置き換えだったような… 今マニュアルがないのでうろ覚えですが、マニュアルで確認してみて下さい。 それと、splitっていう関数ありません?

guest98
質問者

補足

REPLACEだと古いデータが全部消えてしまうと思うのですが、重複データだけ消したいのです。

  • PrintScree
  • ベストアンサー率25% (538/2091)
回答No.1

SQL*Loaderを使うというのは無しですか?

guest98
質問者

補足

なしなんです~。 最初はそうしていたのですが、 データに重複が発生するので、 PL/SQLで重複データを削除しながら登録することにしました。 ちなみに削除対象は、重複データの古い方のデータです。(もともとテーブルにあるデータ) 新しいほうを弾くのであればSQL*Loaderでよかったんですが。。。

関連するQ&A

  • SQL*LoaderでCSVから指定した列のみインポートしたい。

    SQL*Loaderを用いてOracleのテーブルにデータを格納 しようと思っています。 格納するデータはカンマ区切りのCSVファイルです。 入力CSVファイルは他テーブル用のファイルなので、 ローダーで落とし込むテーブルとは列数が異なります。 ですので、「CSVの5列目の値をテーブルのAA_NOというフィールドに 格納する。ということが可能なのでしょうか?」 CSVファイルのある行が a,b,c,d,e,f というデータの場合、テーブルには a,e,f とインポートしたいのです。 よろしくお願いします。

  • PL/SQLでの文字列比較

    PL/SQL内の条件文で以下のような文字列比較は出来ないでしょうか? (1)ある変数に指定文字列が含まれるかどうか (PASCALで言うところのPOS関数のような) (2)ある変数が指定文字列で始まる・終わるかどうか (JAVAで言うところのstartWith,endWithのような) 調べたところ、(1)に関しては[instr]関数が使えそうだったのですが、文法エラーとなってしまいました。 どなたかお分かりになる方、よろしくお願いします。

  • PL/SQLからディレクトリ作成

    いつもお世話になっております。 PL/SQLのプログラムにて、DBより取得した情報をCSVファイルに出力するとき、同時にフォルダを作成するというのは可能でしょうか?現在CSVの出力はできているのですが、フォルダ作成はやはりDOSプロンプトを立ち上げてmkdirコマンドを実行などをしないと無理でしょうか? OS:WIN2000 DB:oracle9i 宜しくお願い致します。

  • Pl/SQLの文字種判定

    はじめまして。 今、PL/SQLでCSVファイルから読み込んだ内容を データベースに挿入するプロシージャを作成中なのですが、その中で、全角や半角、数値、日付などの読み込んだ項目の文字種を判定する方法があれば教えて頂けないでしょか? 宜しく御願い致します。

  • SQL*PLUSでPL/SQLの実行

    SQL*PLUSにて, SQL> となっているところに、別ファイルに記述してあるPL/SQLのコードを 丸々コピーして貼り付けると、 大体100行程度までコピーしたところで止まってしまいます。 止まった後、未コピー分を再びコピーし、 さらに100行程度進んだところでまた止まり、続きの分を再びコピーして貼り付ける… として全てのプロシージャを貼り付け、そしてEXECUTEで実行して デバッグしているのですが、 別ファイルに書いてあるPL/SQLコードを1度に登録する方法は ないのでしょうか? SQL*PLUSのウィンドウのオプション→環境の画面バッファの値を いじってみたのですが何も変わりません。 どなたかいい方法をご存知ないでしょうか?

  • SQLでCSVを出力する際「,」を認識しない

    いつもお世話になっております。 SQL(2005)でクエリ文を書いて、その結果をCSV保存した後、EXCELで開こうとした時なのですが、なぜかカンマを区切りと認識せず、1行あたりの全データが1つのセルに納まってしまいます。 SQL(2000)の頃はこんなことは無く、ちゃんとカンマを認識してくれたものですが、これは何故でしょうか? また、どうすればカンマをカンマと認識してくれるようになるでしょうか? 新しいDBとなり、戸惑っておりますので、皆様のお知恵を拝借いたしたく、よろしくお願い致します。

  • PL/SQLからEXCELVBAの関数をコール

    タイトルどおりなのですが PL/SQLからDBサーバのローカルにあるExcelVBAの関数を呼出すことは可能でしょうか? 宜しくお願いします。

  • 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)   よろしくお願いいたします。

  • CSVファイルの文字項目に改行コードが存在する場合

    CSVファイルの文字項目に改行コードが存在する場合 2つほど質問したいことがあります。もしよろしければアドバイス頂けると嬉しいです。 1つ目 javaでcsvファイルを読み込んで分割したいと思っています。 単純に考えればセパレータ(ここではカンマにしたいと思います)でsplit関数で済むのですが、いくつか特殊?な要件があります。 1.文字項目は"で囲まれる(例:123,"abc",456) 2.文字項目に改行コードが含まれる場合がある。 3.文字項目に"がある場合は""となる。 (4.文字項目に,がある場合は,,となる。)←ここは未確定になります。確定したら別途質問させて頂きたいと思っています。 特にいま気にしているのは2です。 改行コードが含まれているので、普通にファイルを1行読み込んでも途中までしか取得できないと想定しています。 改行が含まれている場合、2行以上(複数の改行の可能性)が1行分なのですが、どのように処理すればよいのか困っています。 2つ目 読み込んだデータをDB(DB2)に登録するのですが、改行コード込みで登録したいと思っています。1つ目の処理と絡んでどのようにすればうまくいくか悩んでいます。 よろしければアドバイス頂けないでしょうか。

    • ベストアンサー
    • Java
  • うまくPL/SQLが書けません。

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