Как запустить хранимую процедуру Oracle в Ruby

Мне дали доступ на чтение к базе данных Oracle, чтобы получить данные для моей собственной базы данных. Администратор БД дал мне хранимую процедуру, которая, как он уверяет, это все, что мне нужно, но я пока не смог запустить ее из Ruby.

У меня есть гем ruby-oci8 и установлен мгновенный клиент oracle.

Вот что мне удалось до сих пор.

require 'oci8'
conn = OCI8.new('user','pass','//remoteora1:1521/xxxx')
=> #<OCI8::RWHRUBY>
cursor = conn.parse("call REPOSITORY.GET_PMI_ADT( '722833', 'W', null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null)")
=> #<OCI8::Cursor:0x56f4d50>

И вот тут я застреваю. У меня есть этот объект OCI8::Cursor, но я не знаю, что с ним делать. Это должно вернуть мне целую кучу результатов (где нулевые значения в запросе), но я ничего не получаю. Запуск cursor.exec с параметрами и без параметров (хотя я не уверен, какие параметры мне нужны) выдает мне ошибки.

cursor.exec дает

OCIError: ORA-06553: PLS-:
ORA-06553: PLS-:
ORA-06553: PLS-:
ORA-06553: PLS-306: wrong number or typ
ORA-06553: PLS-306: wrong number or type of arguments in call to 'GET_PMI_ADT'
ORA-06553: PLS-306: wrong number or type of arguments in call to 'GET_PMI_ADT'
ORA-06553: PLS-306: wrong number or type of arguments in call to 'GET_PMI_ADT'
ORA-06553: PLS-306: wrong number or type of arguments in call to 'GET_PMI_ADT'
ORA-06553: PLS-306: wrong number or type of arguments in call to 'GET_PMI_ADT'
ORA-06553: PLS-306: wrong number or type of arguments in call to 'GET_PMI_ADT'
ORA-06553: PLS-306: wrong number or type of arguments in call to 'GET_PMI_ADT'

так далее...

cursor.fetch дает

OCIError: ORA-24338: statement handle not executed

У кого-нибудь есть здесь идеи? Я в хорошем настроении.

Обновление здесь для тех, кто все еще смотрит. Если я изменю хранимую процедуру на

BEGIN REPOSITORY.GET_PMI_ADT( '722833', 'W', null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null); END;

Теперь я получаю ошибку;

OCIERROR: ORA-06550: line 1, column 45:
PLS-00363: expression ' NULL' cannot be used as an assignment target

Подтверждает ли это, что хранимая процедура неверна? Есть что-нибудь очевидное, чтобы сделать это исправить?

3 ответа

Решение

Это должно помочь:

http://rubyforge.org/forum/forum.php?thread_id=11295&forum_id=1078

Образец как ниже:

msi находится в состоянии переменной IN, а остальные_кредиты являются переменными OUT

cursor = conn.parse ('begin ROAMFLEX.GETMSISDNSTATUS(:msi, :status, :remaining_credit); end;')
cursor.bind_param(':msi', '250979923')
cursor.bind_param(':status', nil, String, 20)
cursor.bind_param(':remaining_credit', nil, String, 50)
cursor.exec()
puts cursor[':status']
puts cursor[':remaining_credit_amount']
# PL/SQL records or object type parameters should be passed as Hash
# test_full_name is procedure name in oracle
# p_employee holds parameter list 
#employee_id is first param defined in stored procedure

require 'ruby-plsql'

p_employee = { :employee_id => 1, :first_name => 'First', :last_name => 'Last', :hire_date => Time.local(2000,01,31) }
 plsql.test_full_name(p_employee)   #plsql should hold connection object

Ошибка, которую вы получаете

   PLS-00363: expression ' NULL' cannot be used as an assignment target

означает, что в хранимой процедуре некоторые параметры определены как IN OUT, что означает, что они должны быть переменными. Весьма распространено использовать параметр для хранения возвращаемого значения, указывающего, прошла ли процедура или нет, хотя чаще используется функция, в которой вы можете вернуть логическое значение true/false, чтобы указать успешность.

Вам нужно дать администратору базы данных сообщение об ошибке, которое вы получаете, и попросить полную подпись для процедуры, которую вы вызываете, которая должна сказать вам, какие переменные, которые вы передаете, являются входными / выходными. Любой, который находится только в IN, может быть передан константе или NULL, тогда как те, которые являются OUT или IN OUT, должны быть переменными, и вам может понадобиться что-то сделать в зависимости от того, что вы получите в этих переменных.

Другие вопросы по тегам