2011-12-05 2 views
1

루비에서 sqlplus를 사용하고 싶습니다. 다른 팀의 많은 도움을받지 않으면 우리 서버에 설치할 수 없으므로 보석을 사용하고 싶지 않으며 매우 작게 유지하려고합니다.루비와 함께 sqlplus를 사용할 때의 문제

내 루비 스크립트에서이 같은 간단한을 시도하고있다 :

사람이 "커밋을 찾을 수 없습니다를위한"기본적으로

위 ERROR1하고 있고 Error2를 도와 줄 수

`rlwrap sqlplus user/[email protected] << EOF` 

    `set serveroutput on;` 
    `commit;` #ERROR1: sh: commit: not found 
    sql = "insert /*+ APPEND*/ INTO table(col1, col2) values (#{data[0]},#{data[1]});" 
    `#{sql}` #ERROR2: sh: Syntax error: "(" unexpected 
나는 그것의 실행지고 생각 on sqlplus보다는 쉘에서. 그러나 "set serveroutput on"처럼 실행되는 것처럼 보입니다!

ERROR2의 경우 나는 우둔합니다. 나는 또한 SQL에서 "/"에 대해 이스케이프 슬래시를 사용하여 시도했다.

감사합니다.

+0

Ruby 코드 또는 셸 스크립트에서이 작업을 수행하려고합니까? –

답변

1

답은 SQL * Plus를 사용하지 마십시오. 스크립트 내부에서 명령 줄 유틸리티를 호출하지 마십시오. ruby-oci8 gem과 ruby-plsql gem 사이에 SQL * Plus 내에서 수행 할 수있는 모든 작업을 수행 할 수 있습니다.

0

오류가 발생하는 이유는 각 행을 개별적으로 쉘로 보내는 것입니다. 전체 문장이 한 쌍의 백틱으로 싸여 있다면 일 수도 있고 일 수 있습니다.

하지만 당신이 정말로, 적절한 보석을 설치 임시 파일에 명령을 넣어 그것을 실행 SQLPLUS 알 수없는 경우 예 :

require 'tempfile' 
file = Tempfile.open(['test', '.sql']) 
file.puts "set serveroutput on;" 
file.puts "commit;" 
file.puts "insert /*+ APPEND*/ INTO table(col1, col2) values (#{data[0]},#{data[1]});" 
file.puts "exit;" # needed or sqlplus will never return control to your script 
file.close 
output = `sqlplus user/[email protected] @#{file.path}` 
file.unlink 

당신은 매우 신중에 대해 일해야합니다 :

  • 인용 값
  • 오류 처리 (당신이 바인드 변수를 사용할 수 DBI/OCI8을 사용하는 경우). 루비 라이브러리를 사용하면 오류가 발생합니다. sqlplus를 사용하면 대신 출력을 구문 분석해야합니다. 왝!

은 그래서 할 수 있지만, 내가보기 엔 OCI8을 얻기 위해 필요한 어떤 농구 (어쩌면 및-DBI 루비)가 제대로 설치를 통해 :)

추신 : 당신은 확실히 당신이 이전에 커밋 할 수 있습니다 당신이 뛰어 추천 끼워 넣다?

관련 문제