Oracle如何快速选择和更新一个字段值并插入记录

Posted

技术标签:

【中文标题】Oracle如何快速选择和更新一个字段值并插入记录【英文标题】:Oracle how to select and update one field value and insert records quickly 【发布时间】:2021-02-24 22:44:45 【问题描述】:

我们有以下场景:

    创建表
    create table tt (id number, name varchar2(30), note varchar2(4));
    insert into tt values (1,'AC','m');
    insert into tt values (2,'Test','f');
    
    我们想从表 tt 中选择记录并通过更新一个字段值来插入另一条记录:
    INSERT INTO tt SELECT id, 'x1', note FROM tt where id=1; 
    

由于我们的表有很多列,我们希望找到一种方法来完成上述操作而不在 step2 的 sql 中列出所有列名。 有什么办法可以帮助解决吗?

【问题讨论】:

好像可以用MERGE.. 您必须指定源列和目标列,除非它们保证相同,在这种情况下您可以select *。但是,两个表多久可以保证以相同的顺序具有相同的列?很少,我想。 【参考方案1】:

您有很多方法可以让你的回应。 P>

我会尽量给你解释现在将出现我的第一个。 祝你在版本12C +工作。 如果是这样的情况下:

您有一个美丽的函数名的 LISTAGG STRONG> P>

此外,还具有表的 [DBA | ALL | SOURCE] _TAB_COLUMNS 强>

*如果您没有在12C工作+您必须连接ALL_TAB_COLUMNS领域成VARCHAR2查询,如: P>

CURSOR my_cursor IS SELECT COLUMN_NAME FROM ALL_TAB_COLUMNS WHERE TABLE_NAME = 'MY_TABLE';

可以明显订购它 P>

...
BEGIN
  FOR cur IN my_cursor LOOP
    v_fields := v_fields || ',' cur.COLUMN_NAME;
  END LOOP;
  EXECUTE IMMEDIATE 'SELECT ' || v_fields || ' FROM MY_TABLE';
END;

我不知道,但在v_field你可以删除最后一个逗号。 *

如果您可以访问到的 LISTAGG STRONG> P>

这是很容易。 P>

SELECT LISTAGG(COLUMN_NAME, ', ') WITHIN GROUP (ORDER BY COLUMN_ID) INTO v_fields
FROM ALL_TAB_COLUMNS
WHERE TABLE_NAME = <MY_TABLE>;

您可以订购任何东西,哪怕只是更换所有的订单由(NULL)圆括号,但不是空的。 其中v_field必须像VARCHAR2(2000) P>

现在,最后。你需要一些数组或集合有要修改的字段列表。 举例来说,如果你有一个像...: P>

v_field := 'col1, col2, col3, col3 ... coln'

和阵列v_varray := myvarray('col1', 'col3', colx); P>

BEGIN
  FOR i IN 1..v_varray.COUNT LOOP
    v_field := REPLACE(v_field, v_varray(i), v_array(i) * <MY_MODIFICATION>)
  END LOOP;
END;

通过这种方法,您必须检测您的关键领域。 您必须使用VARCHAR处理工作。 P>

我想帮你。 如果您需要更详细的联系我。 P>

问候。

【讨论】:

以上是关于Oracle如何快速选择和更新一个字段值并插入记录的主要内容,如果未能解决你的问题,请参考以下文章

如何从 MySQL 数据库中获取最后一个插入值并更新 Access 中的字段?

在 oracle 中使用游标插入和更新记录

如何分离在 Oracle 中为特定表插入、更新和删除记录的过程

mysql更新字段记录没有则添加

PL/SQL ORACLE:删除时触发更新

Oracle Forms 10g,多次插入和更新不起作用