从Julia中运行sqlplus

时间:2017-07-28 05:33:46

标签: julia sqlplus

我是一名非常初学的Julia用户,但我想将它用于我的一些项目。

我的许多项目都要求我快速连接到Oracle以获取其他一些数据的ID号。我可以通过从shell或tcl等其他程序运行sqlplus来实现这一点,但是我已经尝试过Julia文档中的语法,但总是会出现一个错误或其他错误。

在Tcl中它看起来像这样

exec sqlplus -s user/pass@dbname << "
            SET PAGESIZE 0 FEEDBACK OFF VERIFY OFF HEADING OFF ECHO OFF
            select ID from table1 where name='abc';
            exit;
            "

来自朱莉娅,我试图像这样使用run命令

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

但我从Julia那里得到了各种错误,如

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

任何人的帮助?

1 个答案:

答案 0 :(得分: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/pass@dbname`
# 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))

它主要是不言自明的(BTW使用Julia版本0.6,但应该可以使用0.5)。