2012-11-27 3 views
1

단순히이 작업을 수행하는 더 좋은 방법이 될 것 같지만 여전히 찾지 못했습니다. 그리고 나는 이것을 수행하는 방법을 사용할 수있는 유일한 사람이 아니라고 확신합니다 : 한 행에 하나의 필드 만 생성 한 SQL 쿼리를 실행 한 다음 해당 필드를 스칼라에 할당하십시오. (필자의 경우 쿼리 결과 둘 이상의 필드/행이 발생하면 스크립트가 중단되는 것보다 더 큰 문제가 생길 수 있습니다.)SQL 쿼리의 결과를 스칼라로 할당하기

my $timestamp; 
my $cmd = $dbh->prepare('SELECT cast(now() AS timestamp);') or die $!; 
$cmd->execute(); 
while (my @asd = $cmd->fetchrow_array) { $timestamp = $asd[0] } 

더러운,하지만 작동 : 예를 들어

는 SQL 서버에서 타임 스탬프, 하나는 사용할 수 얻을 수 있습니다. 하지만 특히 perl과 postgresql이 DBI를 통해 서로 통신 할 수있는 방법을 고려할 때, 4 줄을 사용하는 것이 단순한 할당을위한 것 같습니다. 물론, 나는 그것에 대한 서브 루틴을 쓸 수 있지만, 내가 $dbh->do()와 함께 데이터를 제출하는 것처럼 쉽게 데이터를 가져올 수있는 네이티브가 아닌가?

그리고 네, 저는 구글을 시도했습니다.

답변

2

보통 나는 물품.
+0

매력처럼 작동합니다! 둘 이상이 반환되지 않으면 첫 번째 행을 기본값으로 설정하는 장점이 있습니다. – Jarmund

+0

정말요? 나는 그것이 첫 행과 열을 잡았다 고 생각했다. – araqnid

+0

죄송합니다, 예, 우선. 그에 따라 편집, 그리고 지금은 아침에 커피를 마시고 있습니다. – Jarmund

0

fetchrow_array은 실제로 하나의 열에 대해서만 묻는 것처럼 스칼라 만 반환합니까?

+0

사실,하지만 여전히 사전에 준비/실행 쌍을 필요 : – Jarmund

1

항상 selectrow_array있다 :

selectrow_array이 유틸리티 방법은 단일 통화로 prepare, executefetchrow_array 결합

@row_ary = $dbh->selectrow_array($statement); 
@row_ary = $dbh->selectrow_array($statement, \%attr); 
@row_ary = $dbh->selectrow_array($statement, \%attr, @bind_values); 

.

그래서 이런 일이 :

my $timestamp = $dbh->selectrow_array('select cast(now() as timestamp)'); 

유사한 상황에 selectrow_arrayrefselectrow_hashref있다. perldoc DBI에서

1

: 당신에게 대부분의 방법을 얻을 것이다

"selectrow_arrayref" 

    $ary_ref = $dbh->selectrow_arrayref($statement); 
    $ary_ref = $dbh->selectrow_arrayref($statement, \%attr); 
    $ary_ref = $dbh->selectrow_arrayref($statement, \%attr, @bind_values); 

    This utility method combines "prepare", "execute" and 
    "fetchrow_arrayref" into a single call. It returns the first row of 
    data from the statement. The $statement parameter can be a previously 
    prepared statement handle, in which case the "prepare" is skipped. 

    If any method fails, and "RaiseError" is not set, "selectrow_array" 
    will return undef. 

. 여전히 오류 검사를해야하지만 어쨌든 그렇게 할 것입니다.

$value = $dbh->selectall_arrayref($sql)->[0]->[0]; 
관련 문제