質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

87.92%

文字列をダブルクォーテーションで囲ってCSVファイルに出力する方法。

受付中

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 23K+

score 29

こんにちは。

pl/sqlで、csvファイルに文字を出力する
プログラムを書いているのですが、
以下のようにダブルクォーテーションを
文字列に連結させてもうまく出力されません。

~~省略

vOUTPUT := '"' || 'しゅつりょく' || '"';
UTL_FILE.PUT_LINE(vHANDLE,vOUTPUT);

~~

上記実行の出力結果↓

現状: しゅつりょく
希望: "しゅつりょく"

なぜダブルクォーテーションが出力されないのでしょうか。
また、どのようにすると表示されますか。

よろしくお願いします。

環境---------
windws8
oracle 10g
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

0

オラクル初心者なので、間違っていたらゴメンなさい。(確認できる環境もないので)

SQL*Plus で文字列だけにダブルクォートをつけて csv 形式で出力する SQL」を参考に考えると、恐らく以下のように「"」(=ダブルクォート)を「''」(=シングルクォート×2)で括る必要があるのではないかと思います。
vOUTPUT := ''"'' || 'しゅつりょく' || ''"'';
UTL_FILE.PUT_LINE(vHANDLE,vOUTPUT);

そのように考えた理由ですが(大部分が推測です…)、まず前提知識として
  • ダブルクォート「"」は「引用識別子」をあらわす引用符であり、リテラルをクォートするためのものではない
⇒ 単一引用符(シングルクォート)と二重引用符(ダブルクォート) 
  • シングルクォート「'」をリテラルとして指定する場合は、シングルクォートを重ねて「''」と記述する
⇒ PL/SQLの変数について
です。

vOUTPUT := '"' || 'しゅつりょく' || '"'; 」 と記述した場合、変数 vOUTPUT の中身は

"」+「しゅつりょく」+「"

ですが、これは「しゅつりょく」というリテラルの「引用識別子」であり、「"しゅつりょく" 」というリテラルを表している訳ではありません。(…と思います。)

そこで、「''」(=シングルクォート×2)→「'」(=シングルクォートを表すリテラル)で「"」(=ダブルクォート)を括って「'"'」というリテラルを作成し、

'"'」+「しゅつりょく」+「'"'

を変数「vOUTPUT」へ代入してやると、「UTL_FILE.PUT_LINE(vHANDLE,vOUTPUT); 」の実行時には「”」(=ダブルクォート)が「’」(=シングルクォート)で括られてエスケープされているので

「UTL_FILE.PUT_LINE(vHANDLE,"しゅつりょく"); 」

を実行するに等しく、想定通り「"しゅつりょく" 」という文字列がファイル出力されることになると思います。

なお、こんな実装例もありましたので、ご参考 まで。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 87.92%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る