Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 将sqlplus与ruby一起使用时出现的问题_Ruby On Rails_Ruby_Oracle_Sqlplus - Fatal编程技术网

Ruby on rails 将sqlplus与ruby一起使用时出现的问题

Ruby on rails 将sqlplus与ruby一起使用时出现的问题,ruby-on-rails,ruby,oracle,sqlplus,Ruby On Rails,Ruby,Oracle,Sqlplus,我想在ruby中使用sqlplus。不想使用任何gems[bec我无法在没有其他团队帮助的情况下将其安装到我们的服务器上..等等],并希望将其保持在最低限度 在我的ruby脚本中,我正在尝试这样简单的东西: `rlwrap sqlplus user/pswd@host << EOF` `set serveroutput on;` `commit;` #ERROR1: sh: commit: not found sql = "insert /*+

我想在ruby中使用sqlplus。不想使用任何gems[bec我无法在没有其他团队帮助的情况下将其安装到我们的服务器上..等等],并希望将其保持在最低限度

在我的ruby脚本中,我正在尝试这样简单的东西:

 `rlwrap sqlplus user/pswd@host << 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

`rlwrap sqlplus用户/pswd@host答案是,不要使用SQL*Plus。不要从脚本内部调用命令行实用程序;在
ruby-oci8
gem和
ruby plsql
gem之间,您可以在SQL*Plus中完成任何您可以完成的事情。

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

出现错误的原因是您将每一行分别发送到shell。如果您的整个语句被包装在一对反勾号中,那么它可能会起作用

但是,如果您确实无法安装正确的gems,请将命令放在临时文件中,并告诉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/pswd@host @#{file.path}`
file.unlink
您必须非常小心:

  • 引用值(如果使用oci8/dbi,则可以使用绑定变量)
  • 错误处理。如果使用ruby库,错误将引发异常。使用sqlplus,您将不得不解析输出。恶心
所以这是可以做到的,但我强烈建议您跳过任何需要的障碍,以正确安装oci8(可能还有ruby DBI:)


ps您确定要在插入之前提交吗?

出现错误的原因是您将每一行分别发送到shell。如果您的整个语句被包装在一对反勾号中,那么它可能会起作用

但是,如果您确实无法安装正确的gems,请将命令放在临时文件中,并告诉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/pswd@host @#{file.path}`
file.unlink
您必须非常小心:

  • 引用值(如果使用oci8/dbi,则可以使用绑定变量)
  • 错误处理。如果使用ruby库,错误将引发异常。使用sqlplus,您将不得不解析输出。恶心
所以这是可以做到的,但我强烈建议您跳过任何需要的障碍,以正确安装oci8(可能还有ruby DBI:)


ps您确定要在插入之前提交吗?

您是想在Ruby代码或shell脚本中执行此操作吗?您是想在Ruby代码或shell脚本中执行此操作吗?