Ruby-Oci8-行类型的通话功能不起作用

时间:2019-05-20 23:30:14

标签: ruby-on-rails ruby oracle oracle11g oci8

我有一个像这样的oracle函数:

CREATE OR REPLACE FUNCTION MY_FUNCTION (MY_ID IN VARCHAR2) 
RETURN vendedor%rowtype AS 
    res vendedor%rowtype; 
BEGIN  
    select * into res
    from vendedor
    where id = MY_ID;    
    return res;  
END MY_FUNCTION;

我想使用oci8 gem从我的ruby代码中调用此函数。这是我的红宝石代码:

connectString = ENV['DB_CONNECTION']
conn = OCI8.new(connectString)
cursor = conn.parse ('begin :ret := MY_FUNCTION(:MY_ID); end;') 
cursor.bind_param(':MY_ID', '123', String)
cursor.bind_param(':ret', nil, OCI8::RAW) # This is the question
cursor.exec()
result = cursor[':ret']
cursor.close
conn.logoff

:ret变量的参数绑定类型是什么?

要执行此代码,请抛出此错误:

ORA-06550: line 1, column 15: PLS-00382: expression is of wrong type ORA-06550: line 1, 
column 7: PL/SQL: Statement ignored

1 个答案:

答案 0 :(得分:1)

替换cursor.bind_param(':ret', nil, OCI8::RAW)

与       cursor.bind_param(':ret', OCI8::Cursor)可以解决问题,

但是您需要将函数转换为

CREATE OR REPLACE FUNCTION MY_FUNCTION (MY_ID IN VARCHAR2) RETURN sys_refcursor AS 
    res sys_refcursor; 
BEGIN  
    open res for
      select *
        from vendedor
          where id = MY_ID;    
    return res;  
END MY_FUNCTION;

准备返回sys_refcursor类型

要获得红宝石代码中的结果:

result = cursor[':ret']
while r = result.fetch_hash
    retFinal = r
end

retFinal变量具有光标的最后结果