【问题标题】:create table name with other table column and sequence number oracle使用其他表列和序列号创建表名 oracle
【发布时间】:2019-04-03 10:20:15
【问题描述】:

创建一个清晰的日志过程,每天删除并插入备份表,我需要做的是在备份表达到一定数量的行后,我希望我的工作(过程)创建一个新表相同的字段。

所以我有一个表配置,其中包含我需要备份的表,并且我有一个名为 pre_bck 的列,它具有我希望我的备份表具有的名称。

所以我想尝试创建一个从 'column'+the sequence number 创建表的过程

create table 'column_name'+sequence_id as select * from xyz where 1=0;

例如,如果表名是 abc 并且序列 ID 是 3,那么表名就是 abc3

我不知道我是否清楚,至于我假装实现什么,任何帮助将不胜感激。

【问题讨论】:

  • 甲骨文 MySQL。请不要垃圾邮件标记各种 RDBMS。
  • 你为什么要这样做?我能想到的唯一原因是更容易删除旧数据 - 那么您是否考虑过对单个表进行分区?但是您正在删除和插入...在创建新表后的第二天如何工作,是应该删除所有匹配的表,还是删除原始表并删除其他表?无论如何,这对我来说似乎是一个奇怪的设置......
  • 基本上我们希望将所有数据保留在备份中,一段时间后我们希望导出我们创建的那些表。我们的想法是始终让我们的原始表中的记录很少,以使我们的应用程序运行得更快。该方法是我被要求创建的方法。
  • @AlexPoole - 分区是企业版许可证的额外收费。很多地方没有这个选项。但是,自 11.2.0.4 以来,闪回数据归档一直是普通旧 EE 的一部分,这将是归档需求的更好解决方案。
  • “我需要做的是在备份表达到一定行数后,我希望我的工作(过程)创建一个具有相同字段的新表。” 。那么你怎么知道哪个表有任何给定的行呢?如果您无法检索数据,那么它就不是任何有意义的备份。

标签: sql oracle plsql oracle11g


【解决方案1】:

我赞同 Alex 和 Boneist 的观点,认为这可能不是一个好方法。

但是,回答您的问题:

将字符串的各个位粘合在一起的运算符是||,而不是其他语言中的+column_name || sequence_id

要在过程中执行 SQL,您可以使用 EXECUTE IMMEDIATE 'CREATE ...';

要从序列中选择,您需要使用CREATE SEQUENCE my_sequence; 创建它。获取值:my_sequence.nextval

遍历配置表中所有行的最简单方法是FOR IN ... LOOP

CREATE OR REPLACE PROCEDURE my_procedure IS
  stmt VARCHAR2(32000);
BEGIN
  FOR r IN (SELECT * FROM my_config_table ORDER BY xxx) LOOP
    stmt := 'CREATE TABLE ' || pre_bck || my_sequence.nextval || 
            ' AS SELECT * FROM xyz WHERE 1=0';
    EXECUTE IMMEDIATE stmt;
  END LOOP;
END my_procedure;
/

我不清楚xyz 部分是什么意思,但你肯定可以从这里得到它...

【讨论】:

  • 就是这样,xyz 只是原始表名的一个示例。谢谢,我会尝试使用它,看起来正是我需要的。如果由我决定,我会使用 Alex 和 Boneist 的方法,但不是。
  • 我可以在哪里使用 pre_bck,例如 table1.column1?
  • stmt的内容必须是合法的SQL。只需将您需要的部分放在一起。在CREATE TABLE 之后,应该是新表的名称。完整文档是here
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-08-16
  • 1970-01-01
  • 2020-09-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多