2013-09-06 4 views
2

필자는 hdbsql에 SAP HANA의 명령 줄 도구를 연결하는 perl 스크립트를 작성했습니다. Hdbsql to SAP Hana는 sqlplus를 Oracle에 제공합니다.

hdbsql에서 sql 쿼리를 실행하는 데 백틱을 사용하고 있는데 배열의 쿼리 결과를 캡처하고 있습니다. 다음은이 작업을 수행하는 코드 조각입니다.

my $sql_statement = 'SELECT some_column FROM some_table WHERE 
        some_condition'; 

my $hdb_sql = "/PROGRA~1/sap/hdbclient/hdbsql.exe"; 

my $connection = "-i 11 -n 100.450.10.20:31115 -u myUser -p myPwd -j -F 
        \"|\""; 

my @queryResults = `$hdb_sql $connection $sql_statement`; 

여기서 내가 문제를 겪고있는 곳입니다. 쿼리가 성공적으로 실행되면 hdbsql 반환 코드는 0이고 반환 코드는 perl 변수 "$?"에 저장됩니다. 또한 오류이의 경우 zero.But되어 내가 관찰 한 것입니다 : 쿼리가 난 다음을 얻을 일부 구문 문제가

오류 메시지입니다 :

* 257: sql syntax error: incorrect syntax near "SELECTS": line 1 col 1 (at 
pos 1) SQLSTATE: HY000 

우리가 볼 것을 하나의 SQL 오류 코드는 위의 메시지에서 257입니다. 그러나 만약 내가 펄 변수 "$?"를 출력한다. 오류/리턴 코드로 256을 제공합니다. 마찬가지로

, 잘못된 열 이름을

  • 하나의 SQL 오류 코드는 260이지만 펄이 코드가 집계 누락 또는 하나의 SQL 오류 코드를 그룹화 1024
  • 을 276 만 입니다 반환 펄 리턴 코드는 함수 하나의 SQL 오류 코드가 316 하지만 펄 리턴 코드가 잘못 테이블 이름 하나를 들어 15360.
  • 인에서 인수의 잘못된 번호는 5120
  • 입니다

    가 왜 오류 코드가 그 것이다 ... SQL 오류 코드는 259이지만 펄은 코드 등 768

이며 반환 "$?" 실제로 하나 이상의 SQL 반환 코드와 차이가 있습니까? 내 스크립트에서 나는 실제 하나 오류 코드를 인쇄하고 싶다. 내가 펄에서 어떻게해야 할까? 두 코드 사이에 수학적 관계가 있습니까?

저는 이것을 백과 사전을 사용하는 데 열중하고 있습니다. 시스템(), perl 파이프, perl DBI 또는 다른 모듈을 사용하여 hdbsql 쿼리를 실행하고 싶지 않습니다.

나는이 포럼에서 묻는 비슷한 질문을 여러 차례 보았지만 나의 경우에 대해서는별로 도움이되지 않았다.

의견/답변에 감사드립니다. 고맙습니다!!!!

+0

약간 관련 : http://stackoverflow.com/questions/18640737/why-arent-i-picking-up-the-exit-status-from-my-child-process/ 18641283 # 18641283 – mob

답변

2

$? (이 역 따옴표 후 $?의 할당에 적용 wait뿐만 아니라하더라도) 256의 배수가 perldoc -f system를 참조 일반적이다.

exit (및 POSIX::_exit) 함수는 0에서 255 범위의 입력을 예상합니다. 이는 운영 체제 규칙이며 Perl의 제한 사항이 아닙니다. 해당 범위를 벗어나는 인수를 전달하면 Perl이나 운영 체제에서는 exit($arg % 256)을 호출 한 것처럼 처리합니다.

그래서 무슨 일이 일어나고 있는지 생각해보십시오. hana sql이 시스템 오류 코드 exit을 호출한다는 것입니다. 이 오류 코드는 일반적으로 255보다 커서 운영 체제로 다시 전파되는 종료 코드는 hana error code % 256입니다.

펄이 에러 코드를 수신하고 $?에 값을 할당하는 경우, 그것이 ( perldoc -f system에서 설명) (256)에 의해 그 값을 곱하고, 그래서 하나의 SQL 코드 $? 관계 아마도 같은이다

:

$? = (<hana-sql-code> % 256) * 256 

이상의 pedantically

$? = (<hana-sql-code> & 255) << 8 
+0

안녕하세요. "폭도"와 "이케 가미"감사합니다! 왜 두 코드가 다른지 알 겠어. 내가 너를 이해했다면, 나는 "$? 나는 원래의 하나 오류 코드를 얻을 수 없다. 권리 ?? – Chiseled

+0

아닙니다. 원래의 에러 코드는'$?/256 + 256' (hana 코드가 항상 257-511 범위에 있다고 가정) – mob

+0

hana sql 오류 코드 범위는 1에서 4105까지이며 연속적이지 않습니다. – Chiseled