【问题标题】:Query a database table whose name is known only at runtime查询名称仅在运行时已知的数据库表
【发布时间】:2014-05-19 08:29:43
【问题描述】:

我在运行时得到一个数据库表名(让我们假设来自用户)。我需要查询表并返回几个字段(我知道)。如何做到这一点?

“FOR EACH”不接受其中的变量名。所以,我不能用它。

我已经完成了动态查询,尤其是 SET-BUFFERS() 方法。即使这样,我也需要知道表名。

我需要类似的东西:

DEF VAR tablename AS CHAR. 
tablename = somename.
FOR EACH tablename WHERE ....:
     ...
     ...
END.

有人可以指点我正确的方向吗?

【问题讨论】:

  • @ScubaManDan 进度数据库本身
  • 如果您不知道表的名称,似乎很难从中获取任何信息。您可以使用隐藏表_file 显示数据库中的所有表名,只需执行FOR EACH _file NO-LOCK: DISPLAY _file. END.
  • @Jensd 谢谢!但是,我在这里知道运行时的表名:(。我想在“FOR EACH”之类的查询中使用该名称(或任何其他用于此目的的东西)

标签: progress-4gl openedge


【解决方案1】:

您可以使用动态缓冲区进行动态查询。在这个例子中只需替换 cTableName 变量的值:

/* Replace _file with whatever field you're after */
DEFINE VARIABLE cTableName AS CHARACTER   NO-UNDO INIT "_file".

DEFINE VARIABLE hQuery  AS HANDLE      NO-UNDO.
DEFINE VARIABLE hBuffer AS HANDLE      NO-UNDO.

CREATE BUFFER hBuffer FOR TABLE cTableName.
CREATE QUERY hQuery.

hQuery:SET-BUFFERS(hBuffer).

hQuery:QUERY-PREPARE("FOR EACH " + cTableName).
hQuery:QUERY-OPEN().

REPEAT:
    hQuery:GET-NEXT().
    IF hQuery:QUERY-OFF-END THEN LEAVE.

    DISPLAY hBuffer:BUFFER-FIELD(1):BUFFER-VALUE.

    /* If you know the name of the field you can do: */
    /* DISPLAY hBuffer:BUFFER-FIELD("nameoffield"):BUFFER-VALUE. */

END.


/* Clean up */
hQuery:QUERY-CLOSE().
hBuffer:BUFFER-RELEASE().
DELETE OBJECT hBuffer.
DELETE OBJECT hQuery.

【讨论】:

  • @Jensd 啊!这就是我要找的。非常感谢你!我之前应该将我的知识扩展到动态缓冲区。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-10-03
  • 1970-01-01
  • 2019-02-23
  • 1970-01-01
  • 2011-11-28
相关资源
最近更新 更多