You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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. 使用动态临时表时,是否仍可使用静态查询,还是必须改用动态查询?
  2. 动态临时表是否能自动识别新增的字段?
    恳请给出建议。
解答

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 11:45:44