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

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

ただいまの
回答率

91.35%

  • SQL

    1696questions

    SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

  • bash

    466questions

    bash(Bourne-again-Shell)は sh(Bourne Shell)のインプリメンテーションに様々な機能が追加されたシェルです。LinuxやMac OS XではBashはデフォルトで導入されています。

sqlplusの引数に指定した(シングルクォーテーションを含む)文字列が、SQL文に正しく渡されない

解決済

回答 1

投稿 2017/11/22 22:25 ・編集 2017/11/23 01:42

  • 評価
  • クリップ 0
  • VIEW 67

sqlplus の引数からSQLファイル(外部のSQL文)のIN句に複数の条件を渡したく、シェルスクリプトで以下のように記述したのですが、引数に指定した文字列が正しく渡されず、困っています。

sqlplus -l -s @example.sql "'a','b'"
# or
query="'a','b'"
sqlplus -l -s @example.sql $query


この場合、'a','b'&1になることを想定していましたが、
'a'&1,'b'&2になってしまいます。

sqlplusの引数は通常のコマンドと同じく空白文字で区切られるだけではなく、シングルクォーテーションの直後でも区切られてしまうのでしょうか。
また、区切られないように(通常通り、空白文字で区切るように)する方法はございますでしょうか。

 追記

前略
WHERE
COLUMN1 IN (&1)


上記のSQL文で、「&1」にsqlplusの実行時引数から文字列を渡す(=動的に条件を指定する)ことが今回の目的になりますが、
このカラムはVARCHAR2(文字列)型のため、条件をシングルクォーテーションで囲む必要があります。そのため、「COLUMN1の値がaかb」としたい場合、'a', 'b'という文字列がそのまま&1にセットされなければ、構文エラーになってしまいます。

  • 気になる質問をクリップする

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 1

checkベストアンサー

+1

a,bという文字列を括るんだから、"a,b"じゃないでしょうか。

追記

単なる文字列として受けて、SQL側で分解する方法はどうでしょうか?

プリペアドステートメント(パラメータクエリ)で In 句を使いたい

※解決するかどうか分かりませんが、"'a'\,'b"ではどうですか?

投稿 2017/11/23 00:29

編集 2017/11/23 13:34

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2017/11/23 01:39 編集

    ご回答ありがとうございます。
    説明不足ですみません。
    ```sql
    前略
    WHERE
    COLUMN1 IN (&1)
    ```
    上記のSQL文で、「&1」にsqlplusの実行時引数から文字列を渡す(=動的に条件を指定する)ことが今回の目的になりますが、
    このカラムはVARCHAR2(文字列)型のため、条件をシングルクォーテーションで囲む必要があります。そのため、「COLUMN1の値がaかb」としたい場合、`'a', 'b'`という文字列がそのまま&1にセットされなければ、構文エラーになってしまいます。

    キャンセル

  • 2017/11/23 13:29

    追記しました。

    キャンセル

  • 2017/11/27 15:01

    返信が遅くなりすみません。
    SQL側で分解する方法で解決することができました。ありがとうございます。

    ```sql
    前略
    WHERE
    COLUMN1 IN
    (
    SELECT
    REGEXP_REPLACE(
    REGEXP_SUBSTR('&1' || :separator, '(.*?)' || :separator, 1, LEVEL)
    , :separator || '$'
    , ''
    ) token
    FROM
    DUAL
    CONNECT BY
    REGEXP_INSTR('&1' || :separator, '(.*?)' || :separator, 1, LEVEL ) > 0
    )
    ```

    キャンセル

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

ただいまの回答率

91.35%

関連した質問

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

  • SQL

    1696questions

    SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

  • bash

    466questions

    bash(Bourne-again-Shell)は sh(Bourne Shell)のインプリメンテーションに様々な機能が追加されたシェルです。LinuxやMac OS XではBashはデフォルトで導入されています。

  • トップ
  • bashに関する質問
  • sqlplusの引数に指定した(シングルクォーテーションを含む)文字列が、SQL文に正しく渡されない