从Julia内部运行sqlplus

从Julia内部运行sqlplus,julia,sqlplus,Julia,Sqlplus,我是一个非常初级的Julia用户,但我想在我的一些项目中使用它 我的许多项目都要求我快速连接到Oracle,以获取其他数据的ID号。我可以通过从其他程序(如shell或tcl)运行sqlplus来实现这一点,但我已经尝试了Julia文档中的语法,但总是会出现这样或那样的错误 在Tcl中,它看起来像这样 exec sqlplus -s user/pass@dbname << " SET PAGESIZE 0 FEEDBACK OFF VERIFY OFF HEA

我是一个非常初级的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(`sqlplus -s user/pass@dbname << "
   SET PAGESIZE 0 FEEDBACK OFF VERIFY OFF HEADING OFF ECHO OFF
   select ID from table1 where name='abc';
   exit;
   "
   `)

exec sqlplus-s用户/pass@dbname这是一个在我的机器上运行的函数,它还返回变量中
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))

它基本上是不言自明的(顺便说一句,使用Julia版本0.6,但可能适用于0.5)。

尝试
pipeline
命令,而不是
已经尝试过的命令。我遇到一个错误,比如“无法生成sqlplus-s用户”/pass@dbname.没有这样的文件或目录“Jon:对我来说,这个特定的错误意味着
sqlplus
不在您的julia环境的路径/可访问路径中。也就是说,它与您使用的特定语法无关(显然,这并不意味着如果您将它放在路径中,它会立即工作,因为语法也可能有点错误)。或者,您可以将该字符串传递到管道,julia将其解释为管道的输入文件名,所以它自然会抱怨没有这样的文件。如果是这种情况,请尝试使用
echo
替换字符串,并将其用作管道的输入否,情况并非如此。这是我检查的第一件事。我尝试了完全限定的路径,但出现了相同的错误。回跳的一些变化,我得到了一个sqlplus错误,这意味着sqlplus在julia环境中被正确定义。这是我从运行这个程序中得到的错误。错误:MethodError:无法
将{String}类型的对象转换为{UInt8,1}类型的对象。这可能是由于调用构造函数数组{UInt8,1}(…),因为类型构造函数会返回转换方法。1。你用的是哪个版本?2.脚本中的MethodError在哪里?3.当使用
sqlplus\u cmd=`cat`
而不是
sqlplus
运行脚本“按原样”时,是否会出错?我使用的是0.6的发布版本。我将sqlplus_cmd用作sqlplus,而不是'cat',但两者都会出现此错误。我对你的问题没有把握。我如何知道MethodError是从哪里来的?好的,我已经在使用版本0.5时复制了错误。尝试用
readstring(outpipe)
替换
read(output,String)
。API中正在进行更改。谢谢,成功了!但是,您是否应该修改原始答案中的代码,使其在接受的答案中正确?
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))