用ruby-oci8执行程序

时间:2014-01-17 11:11:12

标签: sql ruby oracle oci8

我正在尝试使用ruby-oci8 gem执行存储过程。 我可以执行普通查询但不能执行我的程序。

# irb -r oci8
Warning: NLS_LANG is not set. fallback to US7ASCII.
irb(main):001:0> conn = OCI8.new('AAA/AAA@//10.112.68.14:1521/dptedp0')
irb(main):002:0> conn.exec("SELECT * FROM mytable"){|r| puts r.join(", ")}
1, user1, data1
2, user2, data2
irb(main):003:0> conn.exec("ALTER TRIGGER trigger_mytable_id ENABLE")
=> 0
irb(main):004:0> conn.exec("ALTER TRIGGER trigger_mytable_id DISABLE")
=> 0

直到这里一切正常,但是当我尝试执行一个程序时,它没有用。

irb(main):005:0> conn.exec("EXECUTE  reset_seq( 'mytable_id_seq', 'mytable', 'id' )")
OCIError: ORA-00900: invalid SQL statement
        from stmt.c:253:in oci8lib_191.so
        from /opt/ruby/gems/ruby-oci8-2.1.2/lib/oci8/oci8.rb:474:in `exec'
        from /opt/ruby/gems/ruby-oci8-2.1.2/lib/oci8/oci8.rb:282:in `exec_internal'
        from /opt/ruby/gems/ruby-oci8-2.1.2/lib/oci8/oci8.rb:275:in `exec'
        from (irb):9
        from /usr/bin/irb:12:in `<main>'

我的程序在sqldeveloper中运行良好。

  execute  reset_seq( 'lrf_id_seq', 'lrf', 'id' )
  anonymous block completed

我没有返回任何价值。 是否可以使用oci8 gem执行这样的过程?

我正在使用: 红宝石1.9.3p429 ruby-oci8(2.1.2)

1 个答案:

答案 0 :(得分:3)

Ruby / OCI8无法识别EXECUTE - 您应该将您的调用包含在一个匿名的PL / SQL块中:

require 'oci8'

conn = OCI8.new('AAA/AAA@//10.112.68.14:1521/dptedp0')
conn.exec("begin reset_seq( 'mytable_id_seq', 'mytable', 'id'); end;")