Проблемы при использовании sqlplus с ruby - PullRequest
1 голос
/ 06 декабря 2011

Я хочу использовать sqlplus в ruby.Не хочу использовать какие-либо драгоценные камни [потому что я не могу установить их на наших серверах без особой помощи от других команд .. и т. Д.] И хочу, чтобы они были минимальными.

Я пытаюсь сделать что-то простое в моем скрипте ruby:

 `rlwrap sqlplus user/pswd@host << 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

Может ли кто-нибудь помочь мне с ошибками ERROR1 и ERROR2 выше

В основном для "commit: not found""Я думаю, что это выполняется на оболочке, а не в sqlplus.Тем не менее, похоже, что «set serveroutput on» выполняется нормально!

Для ERROR2 я не в курсе.Я также попытался использовать escape-слэш для "/" в SQL.

Спасибо

Ответы [ 2 ]

1 голос
/ 06 декабря 2011

Ответ: не используйте SQL * Plus. Не вызывайте утилиту командной строки из вашего скрипта; между самоцветом ruby-oci8 и самоцветом ruby-plsql вы можете делать все, что можете, из SQL * Plus.

0 голосов
/ 14 декабря 2011

Причина, по которой вы получаете ошибки, заключается в том, что вы отправляете каждую строку в оболочку по отдельности. Если весь ваш оператор был заключен в одну пару обратных галочек, он может работать.

Но если вы действительно не можете установить нужные гемы, поместите команды во временный файл и скажите 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/pswd@host @#{file.path}`
file.unlink

Вы должны быть очень осторожны:

  • Цитирование значений (если вы используете oci8 / dbi, вы можете использовать переменные связывания)
  • Обработка ошибок. При использовании ruby-библиотек ошибки могут вызывать исключения Используя sqlplus, вам придется анализировать вывод. Тьфу!

Так что это можно сделать, но я настоятельно рекомендую вам прыгнуть через все обручи, необходимые для правильной установки oci8 (и, возможно, ruby-DBI):)

ps Вы уверены, что хотите зафиксировать перед вставкой?

...