2011-12-05 23 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以上

基本上是“承诺:未找到”我认为它得到执行在shell而不是在sqlplus中。但似乎“设置serveroutput”似乎执行得很好!

对于ERROR2,我无能为力。我也尝试在sql中使用转义斜杠作为“/”。

感谢

+0

你想在Ruby代码或shell脚本中做这个吗? –

回答

1

答案是,不要使用SQL * Plus。不要在脚本中调用命令行实用程序;在ruby-oci8宝石和ruby-plsql宝石之间,你可以做任何你可以在SQL * Plus中完成的任何事情。

0

您得到错误的原因是您要将每行分别发送到shell。如果你的整个陈述被包裹在一对反引号中,它可能可能工作。

但如果你真的无法安装合适的宝石,把命令在一个临时文件,并告诉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 

你必须非常小心:

  • 引用值(如果使用OCI8/DBI,你可以使用绑定变量)
  • 错误处理。如果使用Ruby库,错误会引发异常。使用sqlplus,你将不得不解析输出。呸!

所以可以这样做,但我强烈建议你跳通过所需的任何箍得到OCI8(也许Ruby的DBI)正确安装:)

PS你确定你想之前提交插?