Ruby - Oci8 - функция вызова с неработающим типом строки - PullRequest
2 голосов
/ 21 мая 2019

У меня есть функция оракула, подобная этой:

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;

И я хочу вызвать эту функцию из моего кода ruby, используя 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 Ответ

1 голос
/ 21 мая 2019

Замена 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 введите

Для получения результата в коде ruby:

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

переменная retFinal имеет последний результат курсора

...