2013-11-06 3 views
1

Мы пытаемся выполнить обычные задачи обслуживания наших баз данных Oracle с помощью Perl. У меня есть пользовательский доступ к базам данных, и я делаю все свои скрипты локально в базах данных. Я хотел бы запустить инструкцию SQL в базе данных для создания файла pfile и сохранить его в папке tmp, чтобы потом просмотреть его.Выполнять SQL-запросы в Perl на базе Oracle DB без DBI?

Однако у нас нет DBI, установленного в наших системах, поэтому я не могу использовать его для подключения к БД и выполнения SQL-операторов. У меня есть доступ администратора, но мы стараемся избегать использования DBI, поскольку этот скрипт будет развернут локально на каждой машине, и мы не хотим устанавливать DBI во все наши базы данных. Есть ли какой-либо возможный способ выполнения SQL-запросов в Oracle db без использования DBI, если вы используете скрипты локально в БД?

Например, мне нужно было бы запустить этот SQL заявление для того, чтобы сгенерировать PFILE:

create pfile='/tmp/pfile.ora' from spfile 

Если бы я делал это вручную, я бы су, как oracle и затем запустить sqlplus на для выполнения инструкции SQL. Я пытался как бы эмулировать это, помещая эти команды в здесь-документ, а затем бросить его в system() функции:

my $result =<<EOF; 
su - oracle 
sqlplus/as sysdba 
create pfile='/tmp/pfile.ora' from spfile; 
exit 
EOF 

system($result); 

Но это не работает, потому что она ждет команды su - oracle для выхода перед продолжением остальная часть заявлений (это также похоже на небрежный способ делать вещи). Я также попытался сделать то же самое, создав скрипт оболочки, а затем выполнив скрипт из perl с помощью системы («sh script.sh»), но это дало те же результаты.

Есть ли способ достичь того, что я пытаюсь сделать, или я должен говорить, что у вас больше нет другого способа сделать это, кроме DBI?

ответ

0

мне удалось получить эту работу, помещая набор SQL команды в строку, а затем выполняет его с помощью system() функция:

my $result = 'sqlplus/as sysdba <<EOF; 
create pfile=\'/tmp/pfile.ora\' from spfile; 
exit; 
EOF 
'; 

system($result); 

Первая строка сообщает ему, чтобы выполнить следующую здесь-док в sqlplus/as sysdba. Обратные косые черты исключают одиночные кавычки в каталоге pfile. Кроме того, поскольку только oracle может работать sqlplus, уже предполагается, что они запускают скрипт как oracle, отрицая необходимость в su.

2

Чтобы запустить несколько команд, ожидающих ответов между ними, вам нужно будет использовать модуль Expect. Однако это не в ядре perl, поэтому, если у вас нет DBI, у вас, вероятно, тоже нет ожиданий. Если вы все равно собираетесь устанавливать модуль, тогда вы также можете установить DBI и сделать это правильно.

Это может быть, однако, можно сделать это в одной строке, с чем-то вроде:

open my $of, ">", "/tmp/pfile.sql"; 
$of->print("create pfile='/tmp/pfile.ora' from spfile"); 
close $of; 
system("su - oracle -c 'sqlplus/as sysdba < /tmp/pfile.sql'");