Ruby OCI8 и хранимые процедуры Oracle - как получить доступ к bind_param, который является курсором ref?

У меня есть пакет Oracle с хранимой процедурой, которая возвращает таблицу с именем prereq_list. Объявление возвращаемого типа данных:

TYPE prereq_list IS TABLE OF VW_PREREQ_SVC_CD%ROWTYPE;

Подпись моей хранимой процедуры выглядит так:

PROCEDURE GET_PREREQS (
site_id_in IN VARCHAR2,
rate_group_in IN VARCHAR2,
service_code_in IN VARCHAR2,
prereq_list_out out prereq_list);

Я пытаюсь вызвать эту хранимую процедуру с помощью Ruby и OCI8, которые выглядят так:

cursor = Warehouse::Base.connection.raw_connection.parse("BEGIN codekeeper.get_prereqs(:site, :rate_grp, :svc_code, :prereqs); END;")
cursor.bind_param(':site', '9')
cursor.bind_param(':rate_grp','3990003')
cursor.bind_param(':svc_code','RPSTARZ')
cursor.bind_param(':prereqs', nil, OCI8::Cursor )
cursor.exec()
results_cursor = cursor[':prereqs'] 
cursor.close
while row = results_cursor.fetch()
  puts row.join(',')
end
results_cursor.close    

Я знаю, что мой основной подход верен. Если я заменю выходную переменную простой строкой или числом, я смогу получить все, что выводится. Но это действительно не то, что мне нужно. Мне нужно вернуть либо настоящий курсор, либо хотя бы массив хешей.


person kmh    schedule 28.06.2013    source источник
comment
Уупс. Отвечая на этот вопрос.   -  person kmh    schedule 02.07.2013


Ответы (1)


Это определенно был случай неправильного чтения моего собственного кода. Prereq_list_out, который я возвращаю, - это, поймите, НЕ курсор ссылки. Это ТАБЛИЦА.

Если вы заставите get_reqs вернуть sys_refcursor вместо того настраиваемого типа TABLE, который я использую, и измените объявление cursor.bind_param на cursor.bind_param(':prereqs', OCI8::Cursor), вызов oci8 для возврата курсора в качестве вывода bind_param будет работать. Надежный и полный пример этого можно найти здесь: https://blogs.oracle.com/opal/entry/casting_plsql_arrays_as_ref_cu, хотя вам нужно будет прочесть тот факт, что парень из оракула пытается решить немного другую проблему. Он не беспокоится о возврате курсора, он просто делает это. Его пример пытается получить значения из массива PL SQL.

person kmh    schedule 02.07.2013