2012-07-23 3 views
1

Oracle 데이터베이스에 대한 읽기 권한이 부여되어 자체 데이터베이스에 대한 데이터를 가져 왔습니다. DBA는 나에게 내가 필요한 모든 것을 보증하는 스토어드 프로 시저를 주었지만 루비에서 아직 실행할 수 없었다.Ruby에서 Oracle 저장 프로 시저를 실행하는 방법

나는 ruby-oci8 보석과 oracle 인스턴트 클라이언트를 설치했다.

여기까지 내가 지금까지 관리 해왔다.

여기는 내가 붙어 있습니다. 나는이 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 

저장 프로 시저가 잘못 되었습니까? 그것을 바로 잡기 위해 명백한 것이 있습니까?

+0

죄송에, 나는 그것을 포함해야했다. 위에 추가되었습니다. – brad

+0

Oracle에서 정확한 코드 줄을 실행 해 보셨습니까? 당신이 호출하려고하는 저장 프로 시저에 문제가있는 것 같습니다. – Strelok

+0

Oracle DB에 대한 액세스 권한이 없으며 DBA가 자신의 저장 프로 시저에 문제가있을 수 없다고 확신 했으므로 ..... 의심 스럽습니다. – brad

답변

3

이 도움이 될 것

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

샘플은 아래와 같다 :

MSI 가변 상태 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'] 
+0

고마워요! 이 예제는 정확히 작동하도록 코드를 수정해야했습니다. 이것을 1 년 동안 버린 후, 이제는 효과를 낼 수있게되었습니다. – brad

1

오류가

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

를 받고 저장 프로 시저의 일부 매개 변수들은 변수이어야 의미 IN OUT로서 정의된다는 것을 의미한다. 성공을 나타 내기 위해 부울 true/false를 반환 할 수있는 함수를 사용하는 것이 일반적이지만 프로 시저가 성공했는지 실패했는지 여부를 나타내는 반환 값을 보유하는 매개 변수를 사용하는 것이 일반적입니다.

DBA에게 가져 오는 오류 메시지를 제공하고 전달중인 변수가 IN/OUT 변수임을 알려주는 호출중인 프로 시저에 대한 전체 서명을 요청해야합니다. IN 인 모든 것은 상수 또는 NULL을 전달할 수있는 반면 OUT 또는 IN OUT은 변수 일 필요가 있으며 이러한 변수로 돌아 오는 것에 따라 무언가를해야 할 수도 있습니다.

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 
관련 문제