1

我已获得对 Oracle 数据库的读取访问权限,以获取我自己的数据库的数据。DBA 给了我一个存储过程,他向我保证这是我所需要的,但我还不能从 Ruby 中运行它。

我安装了 ruby​​-oci8 gem 和 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'

ETC...

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

这是否确认存储过程不正确?有什么明显的方法可以纠正吗?

4

3 回答 3

3

这应该有助于:

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

样品如下:

msi 处于 IN 变量状态,remaining_credit 是 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']
于 2013-03-25T11:40:25.163 回答
1

您收到的错误

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

意味着在存储过程中,一些参数被定义为IN OUT,这意味着它们必须是变量。使用参数来保存指示过程是通过还是失败的返回值是很常见的,尽管更常见的是使用可以返回布尔值 true/false 来指示成功的函数。

您需要向 DBA 提供您收到的错误消息,并要求您为正在调用的过程提供完整签名,该签名应该告诉您传入的哪些变量是 IN/OUT 变量。任何只有 IN 的都可以传递一个常量或 NULL,而那些 OUT 或 IN OUT 需要是变量,您可能需要根据您在这些变量中返回的内容来做一些事情。

于 2012-08-06T19:06:53.950 回答
1
# 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
于 2015-11-10T15:15:47.993 回答