Открыть трубопроводный процесс (sqlplus) в Perl и получить информацию из запроса? - PullRequest
3 голосов
/ 03 февраля 2011

По сути, я бы хотел open передать в sqlplus канал, используя Perl, отправив запрос и получив обратно информацию из запроса.

Текущий код:

open(PIPE, '-|', "sqlplus user/password@server_details");

while (<PIPE>) {
    print $_;
}

Это позволяет мне перейти в sqlplus и выполнить мой запрос.

Что мне трудно понять, так это как Perl отправляет sqlplus запрос (поскольку это всегда один и тот же запрос), и как только это будет сделано, как я могу получить информацию, записанную обратно в переменную в моем скрипте Perl?

PS - я знаю о DBI ... но я хотел бы знать, как это сделать, используя вышеописанный метод, такой же неэлегичный, как и он:)

<ч />

Внесены некоторые изменения в код, и теперь я могу отправить свой запрос в sqlplus, но он отключает ... и я не знаю, как получить от него результаты.

my $squery = "select column from table where rownum <= 10;"

# Open pipe to sqlplus, connect to server...
open(PIPE, '|-', "sqlplus user/password@server_details") or die "I cannot fork: $!";
# Print the query to PIPE?
print PIPE $squery;

Это был бы случай получения STDOUT из sqlplus и последующего его хранения с использованием сценария Perl (родительского)?

Я бы хотел сохранить его в массиве для последующего анализа, в основном.

Блок-схема:

Perl-скрипт (родительский) -> открыть канал в sqlplus (дочерний) -> напечатать запрос по каналу -> sqlplus выводит результаты на экран (STDOUT?) -> прочитать STDOUT в массив в скрипте Perl (родительский)

<ч />

Редактировать : Может случиться так, что разветвление процесса в sqlplus может быть нежизнеспособным при использовании этого метода, и я должен будет использовать DBI. Просто жду, когда кто-нибудь ответит ...

Ответы [ 3 ]

5 голосов
/ 03 февраля 2011

Забудьте о соскобах с экрана, Perl имеет исключительно громоздкий интерфейс базы данных .

3 голосов
/ 03 февраля 2011

Я думаю, что вы, вероятно, хотите IPC :: Run .Вы будете использовать функцию start, чтобы начать работу:

 my $h = start \@cat, \$in, \$out;

Вы бы присвоили свой запрос переменной $input и работали, пока не получите ожидаемый результат в переменной $output.

$in = "first input\n";

## Now do I/O.  start() does no I/O.
pump $h while length $in;  ## Wait for all input to go

## Now do some more I/O.
$in = "second input\n";
pump $h until $out =~ /second input/;

## Clean up
finish $h or die "cat returned $?";

Этот пример украден со страницы CPAN, которую вы должны посетить, если хотите больше примеров.

0 голосов
/ 03 февраля 2011

Если ваш запрос статический, подумайте о том, чтобы переместить его в собственный файл и загрузить и выполнить sqlplus.

open(my $pipe, '-|', 'sqlplus', 'user/password@server_details', '@/path/to/sql-lib/your-query.sql', 'query_param_1', 'query_param_2') or die $!;

while (<$pipe>) {
    print $_;
}
...