Teradata JDBC执行CREATE VOLATILE TABLE后查询报错求助
Teradata 3932错误原因及解决办法
问题场景
在Teradata Vantage Express服务器上,用Python的teradatasql库执行包含DDL和SELECT的复合SQL时触发报错,但用BTEQ分开执行相同语句却完全正常。
Python代码及报错
#!/usr/bin/env python3 import teradatasql query = """CREATE VOLATILE TABLE target_table AS ( select * FROM MY_DB.MY_TABLE ) WITH DATA ON COMMIT PRESERVE ROWS; SELECT * FROM target_table;""" con = teradatasql.connect(host="localhost", user="dbc", password="dbc") cur = con.cursor() cur.execute(query)
报错信息:
teradatasql.OperationalError: [Version 17.20.0.7] [Session 2988] [Teradata Database] [Error 3932] Only an ET or null statement is legal after a DDL Statement.
BTEQ执行正常示例
BTEQ -- Enter your SQL request or BTEQ command: CREATE VOLATILE TABLE target_table AS ( select * FROM MY_DB.MY_TABLE ) WITH DATA ON COMMIT PRESERVE ROWS; *** Table has been created. *** Total elapsed time was 1 second. BTEQ -- Enter your SQL request or BTEQ command: SELECT TOP 1 * FROM target_table; *** Query completed. One row found. 9 columns returned. *** Total elapsed time was 1 second. customer_id customer_token customer_branch customer_num -------------- ------------------------------ --------------- ------------ 8585 452004 83 808038
错误原因
Teradata数据库有严格的事务规则:DDL语句执行完成后,必须先提交事务(ET,Execute Transaction)或者执行空语句,才能继续执行其他SQL语句。
BTEQ工具会自动在每一条DDL语句执行后隐式完成事务提交,所以分开执行DDL和SELECT时不会触发错误;但Python的teradatasql将两个语句放在同一个execute调用中发送给数据库,中间没有插入事务提交操作,直接执行后续SELECT,违反了Teradata的规则,因此触发3932错误。
解决办法
方案1:拆分语句并显式提交
将DDL和SELECT拆分为两个独立的execute调用,中间通过连接对象的commit()方法提交事务:
#!/usr/bin/env python3 import teradatasql # 拆分DDL和SELECT语句 ddl_query = """CREATE VOLATILE TABLE target_table AS ( select * FROM MY_DB.MY_TABLE ) WITH DATA ON COMMIT PRESERVE ROWS;""" select_query = "SELECT * FROM target_table;" con = teradatasql.connect(host="localhost", user="dbc", password="dbc") cur = con.cursor() # 执行DDL并提交 cur.execute(ddl_query) con.commit() # 执行SELECT并获取结果 cur.execute(select_query) results = cur.fetchall() for row in results: print(row) cur.close() con.close()
方案2:使用多语句执行模式(部分驱动支持)
部分Teradata驱动支持通过特定配置启用多语句执行并自动处理事务,但显式拆分并提交是最稳妥、兼容性最好的方式,避免因驱动版本差异出现问题。
内容的提问来源于stack exchange,提问作者Ofir Cohen
相关产品推荐
相关产品推荐

