oracle 复制一条记录只改变主键不写全部列名

场景:表TEST中有C1,C2,C3...字段,其中C1为主键,先需要复制表TEST中一条(C1='1'的)记录,修改主键列C1和需要变更的列后,再插入到表TEST中。

procedure P_TEST 执行过程:

create or replace procedure P_TEST(P_EXT_COLS IN VARCHAR2 --需要变更的列
                               ) IS
  VSQL   VARCHAR2(200); --动态SQL
  V_COLS VARCHAR2(200); --自动SELECT出来的列
begin
  DELETE FROM TEST WHERE C1 <> '1';--执行前 还原测试表数据
  --获取表TEST 除了需要变更的列以外的所有列
  SELECT WMSYS.WM_CONCAT(T.COLUMN_NAME) INTO V_COLS FROM USER_TAB_COLUMNS t WHERE t.table_name = 'TEST' AND INSTR(P_EXT_COLS, T.COLUMN_NAME) = 0;
  --SYS_GUID(),XXX对应需要变更的列
  VSQL := 'INSERT INTO TEST (' || P_EXT_COLS || ',' || V_COLS ||') SELECT SYS_GUID(),''XXX'','||V_COLS||' FROM TEST WHERE C1=''1''';
  EXECUTE IMMEDIATE VSQL;
  COMMIT;
end;

测试存储过程:

SQL> SELECT C1,C2,C3 FROM TEST;
 
C1                                         C2                                         C3
------------------------------------------ ------------------------------------------ ------------------------------------------
1                                          2                                          3
0038D118A2C84E288D1021DC2C9B6E76           2                                          3
 
SQL> EXEC P_TEST('C1,C2');
 
PL/SQL procedure successfully completed
 
SQL> SELECT C1,C2,C3 FROM TEST;
 
C1                                         C2                                         C3
------------------------------------------ ------------------------------------------ ------------------------------------------
1                                          2                                          3
56AEB018A375472BA34F5A3EE3E674C9           XXX                                        3
 
SQL> EXEC P_TEST('C1,C3');
 
PL/SQL procedure successfully completed
 
SQL> SELECT C1,C2,C3 FROM TEST;
 
C1                                         C2                                         C3
------------------------------------------ ------------------------------------------ ------------------------------------------
1                                          2                                          3
E4B7CF5D949542F0BA2A04AF21518AF5           2                                          XXX

 

转载于:https://www.cnblogs.com/kcypt/p/4000540.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值