我有一个名为tt的临时表。我想使用temp-table创建一个具有相同字段名称和类型的数据库表。
我无法弄清楚如何在进度-4gl 中进行操作。这可能吗 ?
感谢。
答案 0 :(得分:4)
简答:是的
最安全的方法是通过代码来创建增量df,然后加载它。 这是一个非常局部的开始,应该让你去:
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可以加载:
RUN prodict/load_df.p ( "tt.df" ).
答案 1 :(得分:2)
虽然这可能是可能的,但这不是一个好主意。您可能会损坏您的数据库。这可能会导致数据丢失。即使可能存在一些问题,最好还是坚持使用提供的工具。
先备份
在应用任何更改之前始终备份!
单一用途数据库
您可以直接在数据字典中在线修改单个使用情况数据库(如果您已在本地连接)。这很直截了当。只需使用GUI添加表格,它的字段和索引。确保您提交更改。
多用户数据库
可以离线更改多用户数据库或在线更改(稍微有限)。添加具有相应字段和索引的新表是可以在线进行的更改。离线添加更改的方式与"单一使用数据库"完全相同。
在线更改需要更多工作:
首先,您需要两个连接的数据库。我打电话给他们"生活"和"开发"在这种情况下。 "开发"将包含一个完整的" live"说到架构。它不必包含任何数据。数据库可以具有相同的名称 - 然后您将使用"逻辑名称"连接其中一个时的别名。
在"开发中进行更改"就像在离线数据库或单一用法数据库中一样(使用数据字典)。确保您提交更改。
输入数据管理工具。确保你有"开发"被选为默认数据库。转到管理员 - >转储数据和定义 - >创建增量.df文件。选择你的" live"数据库作为比较数据库并选择一个好的文件名(delta.df是默认的)。
创建的文件是您的" live"之间的差异文件。和"开发"数据库。检查它是否明智,以确保您不会错误地丢弃任何表格或类似的东西。
现在选择" live"数据库默认并转到管理员 - >加载数据和定义。您可以在此处选择离线(默认)或在线添加更改(选中'在线添加新对象')。
某些架构更改需要您再次编译源代码!
答案 2 :(得分:1)
使用@Stefan Drissen的例子,做了一些修改。
{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。
上调用此代码即可run createDF.p(input table nameOfYourTempTable).
答案 3 :(得分:-2)
CREATE TABLE new_table AS(SELECT * FROM tt);
只需将new_table替换为您要提供的表名