备注
一般查询数据使用列做过滤,或者把某些数据缓存起来,都会使用到临时表。BOS中可以供使用的临时表包括会话级别临时,物理临时表和表变量。特别注意这些Oracle下是不能创建临时表的,否则会导致事务提交。
临时表的创建
1、表变量主要使用在查询数据,过滤条件数量大于50,小于500的情况
字符串类型的PkIds
var arrPkIds = lstPkIds.Distinct().ToArray(); //一定要去重复,否则存在重复值会报错
var paramName = "@FID";
//默认得到括起来的子查询,如果加参数false,则得到别名为b的子查询
var filter = StringUtils.GetSqlWithCardinality(arrPkIds.Length, paramName, 2);
var sqlParam = new SqlParam(paramName, KDDbType.udt_varchartable, arrPkIds);
长整形类型的PkIds
var arrPkIds = lstPkIds.Distinct().ToArray(); //一定要去重复,否则存在重复值会报错
var paramName = "@FID";
//默认得到括起来的子查询,如果加参数false,则得到别名为b的子查询
var filter = StringUtils.GetSqlWithCardinality(arrPkIds.Length, paramName, 1);
var sqlParam = new SqlParam(paramName, KDDbType.udt_inttable, arrPkIds);
2、会话级别临时表一般过滤条件数量大于500,使用临时表
首先要包含在SessionScope中,SessionScope确保里面的代码连接是相同的,所以创建的局部临时表可以在里面一直使用
using (Kingdee.BOS.App.Data.SessionScope scope = new SessionScope())
{
//得到临时表名
var tempTbName ="TM_tableName";
var tempTableName = DBUtils.CreateSessionTemplateTable(ctx, tempTbName, "(FID BIGINT)");
//然后把相关的过滤数据灌入到临时表中
。。。。。。。
//如果在会话中需要多次创建则需要删除临时表
DBUtils.DropSessionTemplateTable(this.Context, tempTableName);
}
3、物理临时表其实就是物理表,只不过表名是唯一的,用户之后最后删除,否则会也积也多,当然平台隔一段时间也会自动清理。
var tempTableName = TemporaryTableUtil.CreateTemporaryTableName(this.Context);
//创建临时表结构
。。。。。。。。
HashSet<string> hs =new HashSet<string>();
hs.Add(tempTableName);
//删除临时表
TemporaryTableUtil.DropTable(this.Context, hs);
推荐阅读
您的鼓励与嘉奖将成为创作者们前进的动力,如果觉得本文还不错,可以给予作者创作打赏哦!
请选择打赏金币数 *