使用DBeaver 24.2执行Teradata脚本遇3932错误求助
问题:DBeaver执行Teradata脚本报错SQL 3932
使用DBeaver 24.2运行Teradata脚本时出现以下错误,但该脚本在Teradata SQL Assistant中可正常执行:
Error SQL [3932] [25000]: [Teradata Database] [TeraJDBC 20.00.00.34] [Error 3932] [SQLState 25000] Only an ET or null statement is legal after a DDL Statement.
执行的脚本如下:
CREATE MULTISET VOLATILE TABLE BASE_MOVIMENTO_MOVEL AS ( SELECT FMLD.* FROM P_MVM.VW_FAT_MVMT FMLD WHERE DT_MVMT_LNHA >= TRUNC(CAST(TO_DATE('01' || '/' || SUBSTR('202408', 5,2) || '/' || SUBSTR('202408', 0,5), 'DD/MM/YYYY') AS DATE)) AND DT_MVMT_LNHA <= LAST_DAY(CAST(TO_DATE('01' || '/' || SUBSTR('202408', 5,2) || '/' || SUBSTR('202408', 0,5), 'DD/MM/YYYY') AS DATE)) ) WITH DATA PRIMARY INDEX( DT_MVMT_LNHA ) ON COMMIT PRESERVE ROWS; ET; SELECT * FROM BASE_MOVIMENTO_MOVEL;
解决方法
1. 调整DBeaver批处理执行设置
Teradata要求DDL语句执行后必须用ET;结束事务,才能执行后续语句。DBeaver默认可能将整个脚本作为单个批处理发送,导致驱动无法正确识别事务边界:
- 右键点击Teradata连接,选择「编辑连接」
- 切换到「SQL编辑器」标签页,找到「SQL处理」区域
- 勾选「每条语句作为单独批处理执行」选项,确保语句分隔符为
; - 保存设置后重新执行脚本
2. 拆分脚本分步执行
如果调整设置无效,可以手动拆分脚本为两个部分分别执行:
- 第一部分执行DDL和事务结束语句:
CREATE MULTISET VOLATILE TABLE BASE_MOVIMENTO_MOVEL AS ( SELECT FMLD.* FROM P_MVM.VW_FAT_MVMT FMLD WHERE DT_MVMT_LNHA >= TRUNC(CAST(TO_DATE('01' || '/' || SUBSTR('202408', 5,2) || '/' || SUBSTR('202408', 1,4), 'DD/MM/YYYY') AS DATE)) AND DT_MVMT_LNHA <= LAST_DAY(CAST(TO_DATE('01' || '/' || SUBSTR('202408', 5,2) || '/' || SUBSTR('202408', 1,4), 'DD/MM/YYYY') AS DATE)) ) WITH DATA PRIMARY INDEX( DT_MVMT_LNHA ) ON COMMIT PRESERVE ROWS; ET;
- 第二部分执行查询语句:
SELECT * FROM BASE_MOVIMENTO_MOVEL;
3. 修正脚本索引错误
注意:Teradata的SUBSTR函数起始索引为1,原脚本中SUBSTR('202408', 0,5)会返回错误的年份值,应改为SUBSTR('202408', 1,4)以获取正确的年份部分。
内容的提问来源于stack exchange,提问作者Caio Aloe
相关产品推荐
相关产品推荐

