2014-09-16 3 views
1

Ниже приведен сценарий Perl, который я написалЧто с этим PERL скрипт

my $COUNT_1; 
my $parameter1 = 'PU_CLERK'; 
$COUNT_1 = `sqlplus -s hr/password\@dbname\@sql_script.sql $parameter1`; 

SQL SCRIPT:

select count(*) from employees 
where job_id <> '&1' 
and salary > 9000 
and commission_pct is not null 
order by first_name desc 
/
exit; 

Когда я запускаю этот запрос, передавая аргумент & 1 она дает мне строка с сообщением об ошибке. Но когда я запускаю один и тот же запрос по жесткому кодированию, я получаю вывод правильно (счет равен 15, что является правильным ответом).

select count(*) from employees 
where job_id <> 'PU_CLERK' 
and salary > 9000 
and commission_pct is not null 
order by first_name desc 
/
exit; 

Я не могу понять, где я иду не так. Как передать параметры в Perl. Мы использовали тот же путь в сценарии оболочки, и он работал абсолютно нормально.

EDIT:

Это им сообщение об ошибке получения

perl call_sql.pl 
value of first variable isold 2: whe 
re job_id <> '&1' 
new 2: where job_id <> 'PU_CLERK' 
    15 

Таким образом, ее в основном не печатает значение 15 его печати все те строки, также, когда я использую «& 1» в моем сценарии SQL

EDIT2:

Привет, ребята, наконец, он работает. В моем sql-коде вместо того, чтобы давать '& 1' я дал '$ 1' Теперь я хочу знать, что $ 1 имеет какое-то значение в Perl? Спасибо ..

+4

Почему бы не использовать модуль ['DBI'] (https://metacpan.org/pod/DBI)? – TLP

+0

Если вы вызываете внешнюю программу из perl, вы не можете просто ввести команду. Вам нужно каким-то образом выполнить его. См. [Как выполнять внешние программы] (http://www.perlhowto.com/executing_external_commands). –

+0

Привет, TLP Я не знаю, как использовать DBI :( – user2647888

ответ

4

Я не знаю, ответьте на вашу текущую проблему, но использование модуля DBI - лучшее решение, поэтому я написал образец сценария, чтобы вы начали. Возможно, вам придется настроить некоторые вещи, чтобы заставить его работать.

use strict; 
use warnings; 
use DBI; 

my $dbname = "mydb"; 
my $user = "foo"; 
my $passwd = "bar"; 

my $dbh  = DBI->connect("dbi:Oracle:$dbname", $user, $passwd) 
        or die $DBI::errstr; 

my $parameter1 = 'PU_CLERK'; 

my $statement = "select count(*) from employees 
where job_id <> ? 
and salary > 9000 
and commission_pct is not null 
order by first_name desc"; 
my $sth  = $dbh->prepare($statement) or die $dbh->errstr; 
$sth->execute($parameter1) or die $sth->errstr; 

while (my $row = $sth->fetchrow_arrayref) { 
    print "@$row"; # or whatever you want to do with it 
} 

$dbh->disconnect or warn $dbh->errstr; 
+0

Большое спасибо TLP. – user2647888

+0

Добро пожаловать. – TLP

3

Это не имеет ничего с perl.

Доказательство сделать скрипт, скажем mytest.sh со следующим содержанием:

#!/bin/bash 

echo "$0: Got $# args" >&2 #to stderr 
i=0 
for arg 
do 
    let i++ 
    echo "$0: arg($i)=$arg=" >&2 #to stderr 
done 
echo "15" #result to stdout 

сделать его исполняемым с chmod 755 mytest.sh

Теперь измените PERL скрипт как:

my $COUNT_1; 
my $parameter1 = 'PU_CLERK'; 
$COUNT_1 = `./mytest.sh -s hr/password\@dbname\@sql_script.sql $parameter1`; 
print "script returned: $COUNT_1\n"; 

перспективе его

$ perl script.pl 

Результат:

./mytest.sh: Got 3 args 
./mytest.sh: arg(1)=-s= 
./mytest.sh: arg(2)=hr/[email protected]@sql_script.sql= 
./mytest.sh: arg(3)=PU_CLERK= 
script returned: 15 

например, perl

  • правильно запустить внешний скрипт
  • правильно передает аргументы к нему
  • так, поиск ошибки в sqlplus doccumentation ...
+0

да jm666 им запускать его из windows actaully. – user2647888

+0

@ user2647888 К сожалению, я не могу сделать файл windows.cmd для его проверки – jm666

Смежные вопросы