2011-12-05 18 views
1

ruby​​の中でsqlplusを使いたいです。他のチームの助けを借りずに私たちのサーバにインストールすることはできないので、宝石を使いたくないのです。ruby​​でsqlplusを使用しているときの問題

私は私のRubyスクリプトでは、このような単純な何かをしようとしています:私は、その実行ばかりだと思う:「が見つかりませんコミット」

`rlwrap sqlplus user/[email protected] << EOF` 

    `set serveroutput on;` 
    `commit;` #ERROR1: sh: commit: not found 
    sql = "insert /*+ APPEND*/ INTO table(col1, col2) values (#{data[0]},#{data[1]});" 
    `#{sql}` #ERROR2: sh: Syntax error: "(" unexpected 

誰のための基本的

上ERROR1とERROR2で私を助けることができますsqlplusではなくon on shellしかし、 "set serveroutput on"のように思えますが、うまく実行されるようです!

ERROR2については、私は無知です。私はまた、SQLの "/"のエスケープスラッシュを使用してみました。

ありがとう

+0

これをRubyコードまたはシェルスクリプト内で実行しようとしていますか? –

答えて

1

答えは、SQL * Plusを使用しないことです。スクリプト内からコマンドラインユーティリティを呼び出さないでください。 ruby-oci8 gemとruby-plsql gemの間には、SQL * Plus内で何かできることがあります。

0

エラーが発生する理由は、各行をシェルに個別に送信しているためです。あなたのステートメント全体が1組のバッククォートでラップされている場合、かもしれません。

しかし、あなたは本当に、適切な宝石をインストールし、一時ファイル内のコマンドを入れて、それを実行するためにSQLPLUSを伝えることができない場合、例えば:

require 'tempfile' 
file = Tempfile.open(['test', '.sql']) 
file.puts "set serveroutput on;" 
file.puts "commit;" 
file.puts "insert /*+ APPEND*/ INTO table(col1, col2) values (#{data[0]},#{data[1]});" 
file.puts "exit;" # needed or sqlplus will never return control to your script 
file.close 
output = `sqlplus user/[email protected] @#{file.path}` 
file.unlink 

について、あなたは非常に注意する必要があります:

  • 引用値
  • エラー処理(バインド変数を使用することができDBI/OCI8を使用している場合)。 Rubyライブラリを使用している場合、エラーは例外を発生させます。 sqlplusを使用すると、代わりに出力を解析する必要があります。ヤク!

だからそれは行うことができますが、私は非常にOCI8を得るために必要とされるものは何でもフープ(多分と-DBIはRUBY)が正しくインストールされて:)

PSはあなたがあなたが前にコミットしたいですあなたはジャンプをお勧めしますインサート?

関連する問題