【发布时间】:2015-05-28 15:13:43
【问题描述】:
主要目标:我想将小块记录从“工作”表移动到存档。
准备:
create table working_tmp as select * from all_objects;
create table archive_tmp as select * from all_objects where 1=2;
计划:
- 将 working_tmp 中的记录删除到集合中。
- 将集合插入archive_tmp。
第一次尝试:
declare
type t_arr is table of working_tmp%rowtype;
v_data t_arr;
begin
delete from working_tmp
where owner = 'SYS'
returning
OWNER, OBJECT_NAME, SUBOBJECT_NAME, OBJECT_ID,
DATA_OBJECT_ID, OBJECT_TYPE, CREATED, LAST_DDL_TIME,
TIMESTAMP, STATUS, TEMPORARY, GENERATED,
SECONDARY, NAMESPACE, EDITION_NAME
bulk collect into v_data;
forall i in v_data.first..v_data.last
insert into archive_tmp values v_data(i);
end;
这是可行的,但我不喜欢大写的部分.. 如果有人稍后将一列添加到表中怎么办?
第二次尝试:
declare
type t_arr is table of working_tmp%rowtype;
v_data t_arr;
begin
delete from working_tmp v
where owner = 'SYS'
returning v.* bulk collect into v_data;
forall i in v_data.first..v_data.last
insert into archive_tmp values v_data(i);
end;
这不起作用..语法错误。
让我们试试动态:
declare
type t_arr is table of working_tmp%rowtype;
v_data t_arr;
v_col_list varchar2(32000);
begin
select listagg(column_name, ',') within group (order by column_id)
into v_col_list
from user_tab_cols
where table_name = 'WORKING_TMP';
execute immediate
'delete from working_tmp v where owner = ''SYS'' returning ' || v_col_list || ' returning :data'
returning bulk collect into v_data';
forall i in v_data.first..v_data.last
insert into archive_tmp values v_data(i);
end;
这个给了我'PLS-00429: RETURNING 子句不受支持的功能'
我可以选择,然后删除,然后插入。但是有没有办法用 2 个语句而不是 3 个语句来做到这一点?
是否可以从 DELETE 语句返回行类型? 我错过了什么吗?
【问题讨论】:
-
我在 12c SE 也有类似的机会。就我而言,我想更改主键中的一列。我正在删除旧记录,然后在更改的列中重新合并。这是同样的问题。我试过
RETURNING ROW而不是RETURNING v.*,没有运气。这种事情能做到吗? -
您可以在不移动任何数据的情况下重命名或更改列的数据类型。如果您需要详细信息或问题更复杂 - 创建一个问题。