1

自分のデータベースのデータを取得するために、Oracleデータベースへの読み取りアクセス権が付与されました。DBAから、必要なのはすべてだと保証するストアドプロシージャが提供されましたが、Rubyからはまだ実行できませんでした。

ruby-oci8gemと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オブジェクトを持っていますが、それをどうするかわかりません。大量の結果(クエリにnull値が含まれている場合)が返されるはずですが、何も返されません。パラメータを使用して、または使用せずに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

これは、ストアドプロシージャが正しくないことを確認しますか?それを修正するために行うべき明らかなことはありますか?

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 に答える