You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

能否通过单次PL/SQL操作完成CNTRCT_NTFYUSER表的指定行插入?

能否通过一次PL/SQL操作完成指定数据插入需求?

当前CNTRCT_NTFYUSER表数据

CNTRCT_IDVERSION_NBRNOTIFY_TYPEOPRID
4561AExistingUser2
7891AExistingUser3
1232AExistingUser1

插入需求

  • 为所有ExistingUser#插入NOTIFY_TYPE为'E'和'R'的2行数据;
  • 为每个CNTRCT_ID分别插入OPRID为'NewUser1'和'NewUser2'、NOTIFY_TYPE为'E'和'R'的2行数据。

目标表数据

CNTRCT_IDVERSION_NBRNOTIFY_TYPEOPRID
4561AExistingUser2
4561EExistingUser2
4561RExistingUser2
4561ENewUser1
4561RNewUser1
4561ENewUser2
4561RNewUser2
7891AExistingUser3
7891EExistingUser3
7891RExistingUser3
7891ENewUser1
7891RNewUser1
7891ENewUser2
7891RNewUser2
1232AExistingUser1
1232EExistingUser1
1232RExistingUser1
1232ENewUser1
1232RNewUser1
1232ENewUser2
1232RNewUser2

解决方案:一次PL/SQL插入操作实现

可以通过单条INSERT语句结合子查询和集合生成完成需求,无需多次执行:

INSERT INTO CNTRCT_NTFYUSER (CNTRCT_ID, VERSION_NBR, NOTIFY_TYPE, OPRID)
-- 为现有用户添加E/R类型行
SELECT 
    c.CNTRCT_ID, 
    c.VERSION_NBR, 
    nt.NOTIFY_TYPE, 
    c.OPRID
FROM CNTRCT_NTFYUSER c
CROSS JOIN (
    SELECT 'E' AS NOTIFY_TYPE FROM DUAL
    UNION ALL
    SELECT 'R' AS NOTIFY_TYPE FROM DUAL
) nt
WHERE c.NOTIFY_TYPE = 'A'
UNION ALL
-- 为每个合同添加NewUser1/NewUser2的E/R类型行
SELECT 
    c.CNTRCT_ID, 
    c.VERSION_NBR, 
    nt.NOTIFY_TYPE, 
    nu.OPRID
FROM (
    SELECT DISTINCT CNTRCT_ID, VERSION_NBR 
    FROM CNTRCT_NTFYUSER
) c
CROSS JOIN (
    SELECT 'E' AS NOTIFY_TYPE FROM DUAL
    UNION ALL
    SELECT 'R' AS NOTIFY_TYPE FROM DUAL
) nt
CROSS JOIN (
    SELECT 'NewUser1' AS OPRID FROM DUAL
    UNION ALL
    SELECT 'NewUser2' AS OPRID FROM DUAL
) nu;

COMMIT;

逻辑说明

  1. 第一部分:通过CROSS JOIN将原表中每个A类型行对应的用户,与'E'、'R'类型拼接,生成对应插入行;
  2. 第二部分:先提取所有唯一的合同ID和版本号,再与'E'/'R'类型、'NewUser1'/'NewUser2'交叉连接,生成每个合同的新用户行;
  3. 整个操作通过单条INSERT语句完成,一次执行即可满足所有插入要求。

内容的提问来源于stack exchange,提问作者John Mathew

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.03 16:40:26