2014-03-12 46 views
0

我正在使用Perl(DBI:ODBC)连接到Teradata。正在执行的SQL语句是替换过程语句。 Teradata ODBC驱动程序不允许准备REPLACE PROCEDURE抛出异常。因此,而不是, 准备+执行我试图用做 $rownum = $con->do("replace procedure ... ");Perl DBI no prepare

的问题是,如果更换程序无法执行(语法错误,丢失对象),则ODBC驱动程序不产生错误。它只是返回记录集和错误列表。

因此,如果在替换过程中发生错误,那么$rownum值将不为零。 但DBI-> do不支持记录集的返回。 所以,目前的情况是: 1.我不能使用prepare + execute由于驱动程序不支持声明 2.我不能使用do,因为我不能得到错误列表(但是我可以识别这个错误受非零行影响的值)。

通常:如何获取无法准备的查询结果?

感谢, 迪马

+0

您是否在连接时尝试过使用odbc_err_handler?我似乎记得在那里放置一个闭包,并且会设置一个会给出错误的外部变量。查看perldoc DBD :: ODBC。 – albe

+0

如果您发布代码,也会有所帮助(删除密码和主机,如果有的话) – alexmac

+0

我不知道bout DBI:ODBC,但我不希望你能够准备DDL语句。有没有EXECUTE IMMEDIATE或类似的? – dnoeth

回答

0

力DBD :: ODBC使用SQLExecDirect的,而不是SQLPrepare的/ SQLExecute。 odbc_exec_direct

+0

是的,谢谢。没有看到您的链接。现在我有另一个问题的一部分。 DBD现在说:DBD :: ODBC不支持多次绑定一个命名参数......但我没有任何绑定,它只是混合了本地过程变量:Run_Id,例如这些命名参数。如何禁用此功能?谢谢 – user2125060

+0

$ con - > {odbc_ignore_named_placeholders} = 1;做这项工作。 @ bhoica非常感谢正确的链接:)。问候,迪马 – user2125060

+0

没问题。我应该知道,因为我维护DBD :: ODBC。 – bohica