2017-07-28 2 views
1

私は非常に初心者のJuliaユーザーですが、私のプロジェクトの一部に使用したいと思います。Julia内からsqlplusを実行しています

多くのプロジェクトでは、他のデータのID番号を取得するためにOracleにすばやく接続する必要があります。私はシェルやtclのような他のプログラムからsqlplusを実行することでこれを行うことができますが、私はJuliaのドキュメントで構文を試しましたが、常に1つまたは複数のエラーが発生します。

Tclで、それはジュリアから、この

exec sqlplus -s user/[email protected] << " 
      SET PAGESIZE 0 FEEDBACK OFF VERIFY OFF HEADING OFF ECHO OFF 
      select ID from table1 where name='abc'; 
      exit; 
      " 

ようになり、私はこの

run(`sqlplus -s user/[email protected] << " 
    SET PAGESIZE 0 FEEDBACK OFF VERIFY OFF HEADING OFF ECHO OFF 
    select ID from table1 where name='abc'; 
    exit; 
    " 
    `) 

のようにrunコマンドを使用しようとしているが、私は

などのジュリアから様々なエラーを取得します
Stacktrace: 
[1] depwarn(::String, ::Symbol) at ./deprecated.jl:70 
[2] warn_shell_special(::String) at ./shell.jl:8 
[3] #shell_parse#236(::String, ::Function, ::String, ::Bool) at ./shell.jl:103 
[4] (::Base.#kw##shell_parse)(::Array{Any,1}, ::Base.#shell_parse, ::String, ::Bool) at ./<missing>:0 (repeats 2 times) 
[5] @cmd(::ANY) at ./process.jl:796 
[6] eval(::Module, ::Any) at ./boot.jl:235 
[7] eval_user_input(::Any, ::Base.REPL.REPLBackend) at ./REPL.jl:66 
[8] macro expansion at ./REPL.jl:97 [inlined] 
[9] (::Base.REPL.##1#2{Base.REPL.REPLBackend})() at ./event.jl:73 

誰の助けですか?

+0

'<<<の代わりに' pipeline'コマンドを試してください。 –

+0

は既にそれを試しています。 "sqlplus -s user/pass @ dbname。このようなファイルやディレクトリはありません" – Jonjilla

+0

Jon:この特定のエラーは 'sqlplus'がパスにないこと/あなたのjulia環境からアクセス可能であることを意味します。私。あなたが使用した特定の構文とは何の関係もありません(これは、パスに入力すると、構文が若干間違っている可能性があるため、すぐに動作することを意味するわけではありません)。 –

答えて

2

私のマシンで動作する関数ですが、変数にsqlplusコマンドの出力を返します(必要な場合)。出力が必要ない場合、より簡単な解決法が利用可能であるかもしれません。

sqlplus_script = """ 
    SET PAGESIZE 0 FEEDBACK OFF VERIFY OFF HEADING OFF ECHO OFF 
    select ID from table1 where name='abc'; 
    exit; 
""" 

sqlplus_cmd = `sqlplus -s user/[email protected]` 
# sqlplus_cmd = `cat`   # used for testing 

function stringpipe(cmd,instring) 
    inpipe = Pipe() 
    outpipe = Pipe() 
    p = spawn(pipeline(cmd,stdin=inpipe,stdout=outpipe)) 
    write(inpipe, instring) 
    close(inpipe) 
    close(outpipe.in) 
    s = read(outpipe,String) 
    return s 
end 

println(stringpipe(sqlplus_cmd, sqlplus_script)) 

それは、ほとんど自明である(ちなみにジュリア・バージョン0.6を使用しますが、おそらく0.5で動作するはずです)。

+0

これを実行するとエラーが発生します。エラー:MethodError:Type {String}型のオブジェクトをArray型のオブジェクト{UInt8,1}に変換できません これは、コンストラクタArray {UInt8,1}(...)への呼び出しによって発生した可能性があります。タイプコンストラクタはメソッドを変換するためにフォールバックするので、 です。 – Jonjilla

+0

1.どのバージョンのJuliaを使用していますか? 2.スクリプト内のMethodErrorはどこにありますか? 3. 'sqlplus'の代わりに' sqlplus_cmd = \ 'cat \' 'を使って"そのまま "スクリプトを実行するとエラーが出ますか? –

+0

私は0.6のリリースバージョンを使用しています。私は 'cat 'ではなくsqlplusとしてsqlplus_cmdを使用していますが、このエラーは両方で発生します。私はあなたの質問#2については分かりません。 MethodErrorの出所を知るにはどうすればよいですか? – Jonjilla

関連する問題