2014-03-12 2 views
0

Perl (DBI : ODBC)을 사용하여 Teradata에 연결합니다. 실행중인 SQL 문은 procedure 문을 대체합니다. Teradata ODBC 드라이버가 예외 처리 예외 처리를 준비하도록 허용하지 않습니다. 그래서 대신 내가 $rownum = $con->do("replace procedure ... ");Perl DBI 준비 안 함

문제는 절차를 대체 할 경우 다음 ODBC 드라이버가 오류를 생성하지 않습니다 (개체가없는 구문 오류를) 실행되지 않을 수 있다는 것입니다 어떻게 사용하려고했습니다 실행 + 준비합니다. 단순히 오류 목록이있는 레코드 세트를 반환합니다.

따라서 교체 절차 중에 오류가 발생하면 $rownum 값은 0이 아닙니다. 그러나 DBI-> do는 레코드 세트의 반환을 지원하지 않습니다. 현재 상황은 입니다. 1. 드라이버가 지원하지 않는 문 때문에 준비 + 실행을 사용할 수 없습니다. 2. 오류 목록을 가져올 수 없기 때문에 사용할 수 없습니다 (단,이 오류를 식별 할 수 있음). 0이 아닌 행 영향을받은 값에 의해).

일반적으로 : 준비 할 수없는 쿼리의 결과를 가져 오는 방법은 무엇입니까?

덕분에, 디마

+0

연결할 때 odbc_err_handler를 사용해 보셨습니까? 나는 거기에 클로저를 두는 것을 기억하는 것처럼 보이는데, 에러를 줄 수있는 외부 변수를 설정할 것이다. perldoc DBD :: ODBC를보십시오. – albe

+0

코드를 게시 한 경우에도 도움이 될 것입니다 (암호 및 호스트가있는 경우 제거하십시오) – alexmac

+0

DBI : ODBC를 사용할 수 있는지 모르겠지만 DDL 문을 준비 할 수는 없을 것입니다. EXECUTE IMMEDIATE 또는 이와 유사한 것이 있습니까? – dnoeth

답변

0

포스 DBD :: ODBC 대신의 SQLPrepare/SQLExecute를의 SQLExecDirect를를 사용합니다. odbc_exec_direct

+0

예, 감사합니다. 귀하의 링크를 보지 못했습니다. 이제는 문제의 또 다른 부분이 있습니다. DBD는 이제 다음과 같이 말합니다 : DBD :: ODBC는 명명 된 매개 변수를 두 번 이상 바인딩하는 것을 지원하지 않습니다 ... 그러나 바인딩이 없으며, 단지 로컬 프로 시저 변수를 혼합합니다 : Run_Id, 예를 들어 이러한 명명 된 매개 변수. 이 기능을 비활성화하는 방법은 무엇입니까?감사합니다 – user2125060

+0

$ con -> {odbc_ignore_named_placeholders} = 1; 그 일을한다. @bhoica는 올바른 링크를 많이 주셔서 감사합니다 :). 감사합니다, Dima – user2125060

+0

괜찮습니다. 나는 DBD :: ODBC를 유지하면서 알아야한다. – bohica