Hi,

djberg96 / hotmail.com (Daniel Berger) writes:

> Hi all,
>
> Ruby 1.8.1
> Oracle 9.2.x
> DBI 0.21
> oracle/oci8/ruby9i
>
> When a PL/SQL stored proc has output parameters, is it possible to
> grab those values in Ruby with the DBI module?  In other words, what's
> the equivalent of the (Perl) DBI bind_param_inout() method?  Or does
> bind_param() work?  My own tests were inconclusive (and my futzing
> capabilities are limited at the moment).

oracle: work
    dbh.do("BEGIN DBMS_OUTPUT.ENABLE; END;")
     ... use DBMS_OUTPUT.PUT_LINE ...
    dbh.prepare("BEGIN DBMS_OUTPUT.GET_LINE(?, ?); END;") do |sth|
      outbuf = ' ' * 255
      status = '0' # parameter type is integer. but bind as string.
      sth.bind_param(1, outbuf)
      sth.bind_param(2, status)
      while true
        sth.execute
        break if status != '0'
        puts outbuf.sub(/ *$/, '') # cut trailing space
      end 
    end

oci8: work with a patch
  original dbd_oci8 doesn't support output parameters. To use them,
  add the following code to DBI::DBD::OCI8::Statement.

    def __bind_value(param)
      @cursor[param]
    end

  Then you can get output parameters as following.

    dbh.do("BEGIN DBMS_OUTPUT.ENABLE; END;")
     ... use DBMS_OUTPUT.PUT_LINE ...
    dbh.prepare("BEGIN DBMS_OUTPUT.GET_LINE(?, ?); END;") do |sth|
      sth.bind_param(1, ' ' * 255)
      sth.bind_param(2, 0)
      while true
        sth.execute
        break if sth.func(:bind_value, 2) != 0
        puts sth.func(:bind_value, 1)
      end
    end

ruby9i: ???
  I couldn't run this. But as far as I look in the source code, I
  guess it runs as following if it works correctly.

    dbh.do("BEGIN DBMS_OUTPUT.ENABLE; END;")
     ... use DBMS_OUTPUT.PUT_LINE ...
    dbh.prepare("BEGIN DBMS_OUTPUT.GET_LINE(?, ?); END;") do |sth|
      line = ... create an instance of Ruby9i::Varchar ...
      status = ... create an instance of Ruby9i::Number ...
      sth.bind_param(1, line)
      sth.bind_param(2, status)
      while true
        sth.execute
        break if status.to_i != 0
        puts line.to_s
      end 
    end

-- 
KUBO Takehiro
email: kubo / jiubao.org
web:   http://www.jiubao.org
GnuPG fingerprint = 5F7B C8EF CA16 57D0 FDE1  9F47 C001 1F93 AC08 2262