如何在R中获取Teradata执行UPDATE语句后的成功返回消息?
解决方案
方案1:保留现有RODBC依赖,通过Teradata系统变量获取原生受影响行数
Teradata执行任意DML语句后,会自动将受影响行数存入全局临时变量ACTIVITY_COUNT,你可以在UPDATE语句执行后立即查询该变量获取原生返回值,性能远高于前后统计全表行数的方案,拿到的数值和TD客户端返回的「xxx行已更新」完全一致。
操作步骤:
- 把原来单次调用
sqlQuery发送UPDATE语句的逻辑,改成连续执行两句SQL:- 首先执行你的UPDATE业务语句
- 紧接着执行
SELECT ACTIVITY_COUNT AS affected_rows;
- R侧代码示例:
# 现有连接对象假设为td_conn update_sql <- "UPDATE your_table SET col1 = 'xxx' WHERE condition;" row_count_sql <- "SELECT ACTIVITY_COUNT AS affected_rows;" # 先执行UPDATE,加believeNRows=FALSE避免RODBC误判返回 sqlQuery(td_conn, update_sql, believeNRows = FALSE) # 再查询受影响行数 affected_rows <- sqlQuery(td_conn, row_count_sql)$affected_rows[1]
如果语句执行失败,sqlQuery会返回错误信息,可以结合tryCatch捕获;执行成功的话就能拿到对应行数,0代表没有匹配到更新条件的行,大于0就是实际更新行数。
方案2:换用odbc包,直接获取返回值
如果可以调整依赖包,CRAN官方维护的odbc包对DML操作的支持更友好,其提供的dbExecute函数执行INSERT/UPDATE/DELETE这类写操作时,返回值就是原生的受影响行数,不需要额外加SQL查询:
操作步骤:
- 先安装加载odbc包,用
dbConnect建立Teradata连接,连接参数和RODBC基本一致 - 直接调用
dbExecute执行UPDATE语句即可拿到行数:
library(DBI) library(odbc) # 建立TD连接 td_conn <- dbConnect(odbc(), Driver = "Teradata", DBCName = "你的TD服务器地址", UID = "用户名", PWD = "密码", Database = "默认库名") # 执行UPDATE,返回值就是受影响行数 affected_rows <- dbExecute(td_conn, "UPDATE your_table SET col1 = 'xxx' WHERE condition;") # 用完关闭连接 dbDisconnect(td_conn)
该方案逻辑更简洁,不需要额外修改SQL语句,性能最优。
内容的提问来源于stack exchange,提问作者Dana
相关产品推荐
相关产品推荐

