OpenEdge:替换静态Temp-table为动态Temp-table后能否使用静态查询?
问题:动态临时表与静态查询的兼容性及字段自动识别问题
我现有应用使用一个包含25个字段的静态临时表,现在要将其替换为数据库表,以此避免用户频繁在应用中添加字段——弃用静态临时表的核心原因是需要灵活地增删表字段。
当前使用的静态临时表定义如下:
define temp-table ttQuote no-undo field quote-date as date field risk as character field client-name as character field address as character field product-code as character field risk-num as integer field risk-version as integer field risk-det-num as integer field state as character.
这个临时表还有其他额外字段,程序会将不同表的值赋值给它的字段,并通过查询展示数据。
现在计划将此静态临时表替换为数据库表,通过动态临时表访问该数据库表,这似乎需要编写针对动态临时表的动态查询。我有两个问题:
- 使用动态临时表时,是否仍可使用静态查询,还是必须改用动态查询?
- 动态临时表是否能自动识别新增的字段?
恳请给出建议。
解答
1. 动态临时表无法使用静态查询,必须改用动态查询
静态查询是在编译阶段就绑定到固定的表/临时表结构的,而动态临时表是在运行时才创建的,编译阶段编译器无法感知它的结构,因此静态查询无法与动态临时表关联。你必须通过动态创建QUERY对象的方式来操作动态临时表,比如通过CREATE QUERY、QUERY-PREPARE、QUERY-OPEN等方法构建和执行查询。
2. 动态临时表可以自动识别数据库表的新增字段
只要你是基于数据库表的元数据动态生成临时表结构(比如使用CREATE-LIKE方法指向目标数据库表,或者通过LOAD方法加载数据库表定义),每次程序运行时都会读取当前数据库表的最新结构,新增或删除的字段会自动同步到动态临时表中,无需修改代码。
实操建议
- 动态生成临时表:直接基于目标数据库表创建动态临时表,确保结构与数据库表完全同步,示例代码:
DEFINE VARIABLE hTempTable AS HANDLE NO-UNDO. DEFINE VARIABLE hQuery AS HANDLE NO-UNDO. DEFINE VARIABLE hBuffer AS HANDLE NO-UNDO. /* 创建动态临时表,匹配数据库表结构 */ CREATE TEMP-TABLE hTempTable. hTempTable:CREATE-LIKE("PUB.Quote"). /* 替换为你的数据库表名 */ hTempTable:TEMP-TABLE-PREPARE("ttQuote"). hBuffer = hTempTable:DEFAULT-BUFFER-HANDLE. /* 创建并执行动态查询 */ CREATE QUERY hQuery. hQuery:SET-BUFFERS(hBuffer). hQuery:QUERY-PREPARE("FOR EACH ttQuote WHERE state = 'CA'"). /* 示例查询条件 */ hQuery:QUERY-OPEN(). /* 遍历查询结果 */ hQuery:GET-FIRST(). DO WHILE hQuery:QUERY-OFF-EQUAL = FALSE: /* 动态读取字段值,示例:获取client-name字段的值 */ MESSAGE "客户名称:" hBuffer:BUFFER-FIELD("client-name"):VALUE VIEW-AS ALERT-BOX. hQuery:GET-NEXT(). END. /* 清理资源 */ hQuery:QUERY-CLOSE(). DELETE OBJECT hQuery. DELETE OBJECT hTempTable.
- 动态处理字段赋值与展示:避免硬编码字段名,通过
BUFFER-HANDLE:NUM-FIELDS遍历所有字段,实现通用的赋值和展示逻辑。比如遍历字段时,用BUFFER-FIELD(i):NAME获取字段名,BUFFER-FIELD(i):VALUE读写值,这样新增字段后无需修改代码就能自动处理。
内容的提问来源于stack exchange,提问作者Latika Sharma
相关产品推荐
相关产品推荐

