데이터베이스 쿼리가 결과를 반환하는지 어떻게 확인할 수 있습니까?

StackOverflow https://stackoverflow.com/questions/290133

  •  08-07-2019
  •  | 
  •  

문제

당사 웹 사이트는 Perl을 사용하여 HR 사람들이 공석을 웹 사이트에 게시 할 수있는 간단한 메커니즘을 제공합니다. 그것은 제 3자가 개발했지만, 그들은 오랫동안 연락을 시작했으며 슬프게도 우리는 사내에서 Perl 기술이 없습니다. 이것은 마케팅 사람들이 사내 IT 팀을 우회 할 때 일어나는 일입니다!

이 응용 프로그램을 간단하게 변경해야합니다. 현재 공석 페이지는 '우리는 현재 공석이 있는지 여부에 관계없이 다음과 같은 공석을 가지고 있습니다. 따라서이 줄이 적절한 시간에만 표시되도록 변경하고 싶습니다.

분명히 약간의 Perl을 배울 수는 있지만 우리는 이미 교체 사이트를 계획하고 있으며 Perl을 사용하지 않을 것입니다. 따라서이 기술을 가진 사람들에게는 솔루션이 사소하기 때문에 집중된 도움을 요청할 것이라고 생각했습니다.

아래는 공석을 나열하는 절차의 시작입니다.

sub list {
  require HTTP::Date;
  import HTTP::Date;

  my $date = [split /\s+/, HTTP::Date::time2iso(time())]->[0];

  my $dbh = DBI->connect($dsn, $user, $password)
    || die "cannot connect to $database: $!\n";

  my $sql = <<EOSQL;
SELECT * FROM $table where expiry >= '$date' order by expiry
EOSQL

  my $sth = $dbh->prepare($sql);
  $sth->execute();


  while (my $ref = $sth->fetchrow_hashref()) {
    my $temp  = $template;
    $temp     =~ s#__TITLE__#$ref->{'title'}#;

    my $job_spec = $ref->{'job_spec'};

...etc...

핵심 라인은입니다 while (my $ref = $sth->fetchrow_hashref()) {. 나는 이것이 '반환 된 레코드 세트에서 다른 공석을 뽑을 수있는 동안 ...'라고 말하고 있다고 생각합니다. 이 줄 앞에 인쇄문을 놓으면 항상 표시됩니다. 이 라인 후에는 모든 공석에 대해 반복되었습니다.

반환 된 레코드 세트를 조기에 움직이지 않고 공석이 표시되어 있는지 어떻게 결정합니까?

항상 while 루프 내에서 코드를 복사하여 If () 문 (while 루프 앞) 내에 배치 할 수 있습니다. 그러나 나는 단지 더 간단한 접근을 선호합니다 If any records then print "We currently have.." line. 불행히도, 나는이 간단한 라인조차도 코딩 할 단서가 없었습니다.

내 멍청한 설명을 고려할 때도 사소한 문제라고 말했습니다!

티아

크리스

도움이 되었습니까?

해결책

정말 간단한 방법은 다음과 같습니다.

$sth->execute();

my $first = 1;
while (my $ref = $sth->fetchrow_hashref()) {
    if( $first ) {
        print "We currently have the following vacancies:\n";
        $first = 0;
    }
    my $temp  = $template;
    ...
}
if( $first ) {
    print "No vacancies found\n";
}

다른 팁

MySQL을 사용하는 경우 "행"메소드가 잘 작동합니다.

$sth->execute();

if($sth->rows) {
  print "We have data!\n";
}

while(my $ref = $sth->fetchrow_hashref()) {
...
}

이 방법과 일부 경고는 "perldoc dbi"에 광범위한 상세하게 기록되어 있습니다. 항상 "perldoc"으로 시작하십시오.

데이터베이스 질문이기 때문에 이것은 PERL 질문이 아니며, 결과가있을 때까지 얼마나 많은 결과가 있는지 알 수있는 좋은 방법이 없습니다. 여기에는 두 가지 선택이 있습니다.

  1. "select count (*)"를 수행하는 쿼리를 수행하여 얼마나 많은 행이 있는지 확인한 다음 실제 행을 얻거나 다른 쿼리를 수행하거나 다른 쿼리를 수행하십시오.
  2. 쿼리를 수행하고 결과를 해시에 저장 한 다음 해시에 몇 개의 항목 수를 세고 해시를 통해 결과를 인쇄하십시오.

예를 들어, 내 머리 꼭대기에서 :

my @results = ();
while (my $ref = $sth->fetchrow_hashref()) {
   push @results, $ref;
}

if ($#results == 0) {
  ... no results
} else {
  foreach $ref (@results) {
    my $temp = $template;
    ....
 }

모든 사람이 헤더가 Graeme의 솔루션에 인쇄되었는지에 대한 반복 테스트를 최적화하려고하기 때문에이 사소한 변형을 제시합니다.

$sth->execute();

my $ref = $sth->fetchrow_hashref();
if ($ref) {
  print "We currently have the following vacancies:\n";
  while ($ref) {
    my $temp  = $template;
    ...
    $ref = $sth->fetchrow_hashref();
  }
} else {
    print "No vacancies found\n";
}

쿼리는 a 고르다, 당신은 이용할 수 없습니다 또는 실행하다 그 자체.

그러나 다른 쿼리를 추가하여 쿼리를 선택할 행 (즉, 공석) 수를 사전 계산할 수 있습니다.

# Retrieve how many vacancies are currently offered:
my $query = "SELECT COUNT(*) AS rows FROM $table WHERE expiry >= ?";
$sth = $dbh->prepare($query);
$sth->execute($date);
$numVacancies = $numinfo->fetchrow_arrayref()->[0];

# Debug:
print "Number of vacancies: " . $numVacancies . "\n";

if ( $numVacancies == 0 ) { # no vacancy found...
    print "No vacancies found!\n";
}
else { # at least a vacancy has been found...
    print "We currently have the following vacancies:\n";

    # Retrieve the vacancies:
    my $sql = "SELECT * FROM $table where expiry >= '$date' ORDER BY expiry";
    my $sth = $dbh->prepare($sql);
    $sth->execute();

    ...
}

또는 유사하게 대신 "준비하다" 그리고 "실행하다" 쿼리를 한 다음 사용합니다 "fetchrow_array", 당신은 한 번의 통화로 모든 것을 할 수 있습니다. selectow_array:

# Retrieve how many vacancies are currently offered:
my $query = "SELECT COUNT(*) AS rows FROM $table WHERE expiry >= ?"; 
my $numVacancies = $dbh->selectrow_array($query, undef, $date);

# Debug:
print "Number of vacancies: " . $numVacancies . "\n";

그리고 또한 마찬가지입니다 selectall_arrayref:

# Retrieve how many vacancies are currently offered:
my $query = "SELECT COUNT(*) AS rows FROM $table WHERE expiry >= ?";
my $numVacancies = $dbh->selectall_arrayref($query, {Slice => {}}, $date);

# Debug:
print "Number of vacancies: " . @$numVacancies[0]->{rows} . "\n";

그러나 사용하는 경우 selectow_array 또는 selectall_arrayref, 원래 쿼리 결과에서 직접 공석 수를 검색 할 수도 있습니다.

# Retrieve the vacancies:
my $sql = "SELECT * FROM $table where expiry >= ? ORDER BY expiry";
my $vacancies = $dbh->selectall_arrayref($sql, {Slice => {}}, $date);

# Debug:
print "Number of vacancies: " . scalar @{$vacancies} . "\n";

좀 더 효율적인 방법 (루프 내부의 조건부를 피하기), 페이지가 약간 출력되는 방식을 변경하는 것이 마음에 들지 않으면 (한 번에 한 번에 한 번이 아닌 한 번에) 변수를 유지할 수 있습니다. 루프 직전 출력 :

my $output = '';

그런 다음 루프 내부에서 인쇄문을 변경하여 다음과 같이 보이도록 변경하십시오.

$output .= "whatever we would have printed";

그런 다음 루프 후 :

if ($output eq '')
{
  print 'We have no vacancies.';
}
else
{
  print "We currently have the following vacancies:\n" . $output;
}

다른 쿼리 만 추가하십시오. 이와 같은 것 :

# count the vacancies    
$numinfo = $dbh->prepare("SELECT COUNT(*) FROM $table WHERE EXPIRY >= ?");
$numinfo->execute($date);
$count = $numinfo->fetchrow_arrayref()->[0];

# print a message
my $msg = '';
if   ($count == 0) $msg = 'We do not have any vacancies right now';
else               $msg = 'We have the following vacancies';
print($msg);
use Lingua::EN::Inflect 'PL';

$sth->execute();
my $results = $sth->fetchall_arrayref( {}, $max_rows );

if (@$results) {
    print "We currently have the following ", PL("vacancy",scalar @$results), ":\n";

    for my $ref (@$results) {
        ...
    }
}

Perldoc DBI :

 For a non-"SELECT" statement, "execute" returns the number of rows
 affected, if known. If no rows were affected, then "execute"
 returns "0E0", which Perl will treat as 0 but will regard as true.

따라서 답은 $ sth-> execute ()의 반환 값을 확인하는 것입니다.

 my $returnval = $sth->execute;
 if (defined $returnval && $returnval == 0) {
     carp "Query executed successfully but returned nothing";
     return;
 }
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top