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>
可以明显订购它 P>
我不知道,但在v_field你可以删除最后一个逗号。
* 如果您可以访问到的 LISTAGG STRONG> P>
这是很容易。 P>
您可以订购任何东西,哪怕只是更换所有的订单由(NULL)圆括号,但不是空的。
其中v_field必须像VARCHAR2(2000) P>
现在,最后。你需要一些数组或集合有要修改的字段列表。
举例来说,如果你有一个像...: P>
和阵列 通过这种方法,您必须检测您的关键领域。
您必须使用VARCHAR处理工作。 P>
我想帮你。
如果您需要更详细的联系我。 P>
问候。CURSOR my_cursor IS SELECT COLUMN_NAME FROM ALL_TAB_COLUMNS WHERE TABLE_NAME = 'MY_TABLE';
...
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;
SELECT LISTAGG(COLUMN_NAME, ', ') WITHIN GROUP (ORDER BY COLUMN_ID) INTO v_fields
FROM ALL_TAB_COLUMNS
WHERE TABLE_NAME = <MY_TABLE>;
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;
【讨论】:
以上是关于Oracle如何快速选择和更新一个字段值并插入记录的主要内容,如果未能解决你的问题,请参考以下文章
如何从 MySQL 数据库中获取最后一个插入值并更新 Access 中的字段?