首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从临时表创建数据库表(代码)

从临时表创建数据库表(代码)
EN

Stack Overflow用户
提问于 2014-06-03 12:13:40
回答 4查看 2.3K关注 0票数 2

我有一张叫tt的临时桌子。我希望使用临时表创建一个具有相同字段名和类型的数据库表。

我不知道在Progress 4GL中该如何做。这有可能吗?

谢谢。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2014-06-04 05:51:32

简短回答:是

最安全的方法是通过代码来完成这一任务,即创建一个增量的df,然后加载它。这是一个非常不完全的开始,应该让你开始:

代码语言:javascript
复制
DEFINE TEMP-TABLE tt NO-UNDO
   FIELD ii AS INT
   FIELD cc AS CHAR
INDEX ttix IS UNIQUE PRIMARY ii.

DEF VAR hb     AS HANDLE NO-UNDO.
DEF VAR hf     AS HANDLE NO-UNDO.
DEF VAR ifield AS INT NO-UNDO.

hb = TEMP-TABLE tt:DEFAULT-BUFFER-HANDLE.

OUTPUT TO "tt.df".

PUT UNFORMATTED SUBSTITUTE( "ADD TABLE &1", QUOTER( hb:NAME ) ) SKIP.

DO  ifield = 1 TO hb:NUM-FIELDS:

   hf = hb:BUFFER-FIELD( ifield ).

   PUT UNFORMATTED 
      SUBSTITUTE( 
         "ADD FIELD &1 OF &2 AS &3", 
         QUOTER( hf:NAME ), 
         QUOTER( hb:NAME ), 
         hf:DATA-TYPE 
      ) SKIP.

   /* to do: add other field attributes like label, initial value, decimals, format */

END.         

/* to do: add indices */

OUTPUT CLOSE.

生成的df可以用以下内容加载:

代码语言:javascript
复制
RUN prodict/load_df.p ( "tt.df" ).
票数 5
EN

Stack Overflow用户

发布于 2014-06-03 12:48:10

虽然这可能是可能的,但这不是一个很好的主意。很可能你会损坏你的数据库。这可能导致数据丢失。您最好还是坚持使用所提供的工具,即使它们可能有一些问题。

备份第一

在应用任何更改之前,请始终备份!

单用数据库

您可以在“数据字典”中直接在线修改单个使用数据库(如果您是本地连接的)。这很直截了当。只需使用GUI添加表,它就是字段和索引。确保您提交了更改。

多用户数据库

多用户数据库可以脱机更改,也可以在线更改(稍微有限一些)。添加具有相应字段和索引的新表是可以在线进行的更改。脱机添加更改的方式与“单用数据库”完全相同。

在线更改需要更多的工作:

首先,您需要两个连接的数据库。在这种情况下,我会称它们为"live“和"development”。当涉及到模式时,"Development“将包含一个完美的"live”副本。它不需要有任何数据。数据库可以具有相同的名称,然后在连接到其中一个数据库时使用“逻辑名称”别名。

  1. 在“开发”中进行更改,就像在脱机数据库或单个使用数据库(使用数据字典)中所做的那样。确保您提交了更改。

  1. 输入数据管理工具。确保选择了“开发”作为默认数据库。转到Admin ->转储数据和定义->,创建增量.df文件。选择您的“活动”数据库作为比较数据库,并选择一个好的文件名(delta.df是默认的)。 创建的文件是"live“和"development”数据库之间的一个diff文件。明智的做法是检查它,以确保您没有掉任何桌子或诸如此类的错误。

  1. 现在选择“活动”数据库作为默认值,然后转到Admin ->加载数据和定义。在这里,您可以选择将更改添加到脱机(默认)或联机(选中“在线添加新对象”)。

一些模式更改将要求您再次编译源代码!

票数 2
EN

Stack Overflow用户

发布于 2016-02-11 18:31:26

使用@Stefan Drissen的例子,并做了一些修改。

代码语言:javascript
复制
{temp-tables.i}

def input param table-handle tt.

def var hb     as handle no-undo.
def var hf     as handle no-undo.
def var ifield as int no-undo.
def var vindex as char no-undo.
def var vi as int. 

hb = tt:default-buffer-handle.

output to value("/home/user/teste.df") append.

    put unformatted substitute( "ADD TABLE &1", quoter(hb:name)) skip.

    DO  ifield = 1 to hb:num-fields:

        hf = hb:buffer-field( ifield ).

       put unformatted
          substitute( 
             "ADD FIELD &1 OF &2 AS &3", 
             quoter( hf:name ), 
             quoter( hb:name ), 
             hf:data-type 
          ) skip.

       put unformatted 
           substitute(
               "FORMAT &1",
                   quoter(hf:format)
                   ) skip.

       put unformatted 
            substitute (
                "LABEL &1",
                    quoter( hf:name )
                    ) skip.

        put unformatted "ORDER " + string(ifield * 10) skip.

        if ifield < hb:num-fields then put unformatted skip (1).   

    end. 

    put unformatted skip(1).

    /*=== INDEX CREATION ===*/
    assign vindex = hb:index-information(1).

    if lookup("default",vindex) <= 0 
    then do:    
        put unformatted(
            substitute(
                "ADD INDEX &1 ON &2",
                    quoter(entry(01,vindex,",")),
                    quoter( hb:name ))) skip.

        if entry(02,vindex,",") = "1" 
        then put unformatted "UNIQUE" skip.

        if entry(03,vindex,",") = "1" 
        then put unformatted "PRIMARY" skip.

        do vi = 5 to 20 by 2:
            if num-entries(vindex,",") > vi 
            then put unformatted "INDEX-FIELD " entry(vi,vindex,",") " " (if entry(vi + 1,vindex,",") = "0" then "ASCENDING" else "DESCENDING") skip.
        end.   
    end.
    /*=== INDEX CREATION ===*/

    put unformatted skip(1).
output close.

要使其正常工作,只需在program.p上调用此代码即可。

代码语言:javascript
复制
run createDF.p(input table nameOfYourTempTable).
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24014933

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档