• 设为首页
  • 收藏本站
  • 积分充值
  • VIP赞助
  • 手机版
  • 微博
  • 微信
    微信公众号 添加方式:
    1:搜索微信号(888888
    2:扫描左侧二维码
  • 快捷导航
    福建二哥 门户 查看主题

    oracle临时表WITH AS用法详解

    发布者: 网神之王 | 发布时间: 2025-6-18 09:28| 查看数: 112| 评论数: 0|帖子模式

    临时表分类

    oracle临时表分为会话级临时表和事务级临时表;
    会话级的临时表只与当前会话相关,只要当前会话还存在,临时表中的数据就还存在,一旦退出当前会话,临时表中的数据也随之被丢弃;
    而且不同会话中临时表数据是不同的,当前会话只能对当前会话的数据进行操作,无法对别的会话的数据进行操作。
    而事务级临时表,只在当前事务有效,一旦进行commit事务提交之后,临时表内的数据就会随着前一个事务的结束而删除。

    会话级临时表
    1. –创建会话级临时表

    2. create global temporary table temp_session(
    3. id number,
    4. ename varchar2(15)
    5. )on commit preserve rows;

    6. –向临时表中插入数据

    7. insert into temp_session values(1001,‘张三');
    8. select * from temp_session;
    复制代码
    preserve rows:表示在会话结束后清除临时表的数据。
    注:会话级临时表在当前会话插入的数据,只在当前会话可以进行操作。

    事务级临时表
    1. –创建事务级临时表

    2. create global temporary table temp_trans(
    3. id number,
    4. ename varchar2(15)
    5. )on commit delete rows;

    6. –向事务级临时表内插入数据

    7. insert into temp_trans values(1001,‘李四');
    8. select * from temp_trans;
    复制代码
    注:在数据没有提交时,表示该事务还没有结束,此时是可以查到表内数据的:

    实际使用案例

    案例1:
    1. with temp as
    2. (select * from PL_PLAN_INFO
    3. where PL_PROJECT_MAIN_ID = '1639112109721649152')

    4. select * from temp
    5. connect by prior ORDER_NO = PARENT_ID
    6. start with ORDER_NO = '1'
    复制代码
    案例2:
    1. WITH temp001 AS (
    2. SELECT
    3.         main.PL_PROJECT_MAIN_ID,
    4.         info.PL_PLAN_INFO_ID,
    5.         info.TASK_NAME,
    6.         info.ORDER_NO,
    7.         detail.BEGIN_TIME,
    8.         detail.OVER_TIME
    9. FROM
    10.         PL_PROJECT_MAIN main
    11.         LEFT JOIN PL_PLAN_INFO info ON main.PL_PROJECT_MAIN_ID = info.PL_PROJECT_MAIN_ID
    12.         AND info.PARENT_ID = '0'
    13.         LEFT JOIN PL_PLAN_DETAIL detail ON info.PL_PLAN_INFO_ID = detail.PL_PLAN_INFO_ID
    14. WHERE
    15.         main.PROJECT_PHASE NOT IN ( '1', '2', '3' )
    16.         AND info.ORDER_NO = '1'
    17.         ),
    18.         temp002 AS (
    19. SELECT
    20.         main.PL_PROJECT_MAIN_ID,
    21.         info.PL_PLAN_INFO_ID,
    22.         info.TASK_NAME,
    23.         info.ORDER_NO,
    24.         detail.BEGIN_TIME,
    25.         detail.OVER_TIME
    26. FROM
    27.         PL_PROJECT_MAIN main
    28.         LEFT JOIN PL_PLAN_INFO info ON main.PL_PROJECT_MAIN_ID = info.PL_PROJECT_MAIN_ID
    29.         AND info.PARENT_ID = '0'
    30.         LEFT JOIN PL_PLAN_DETAIL detail ON info.PL_PLAN_INFO_ID = detail.PL_PLAN_INFO_ID
    31. WHERE
    32.         main.PROJECT_PHASE NOT IN ( '1', '2', '3' )
    33.         AND info.ORDER_NO = '2'
    34.         ),
    35.         temp003 AS (
    36. SELECT
    37.         main.PL_PROJECT_MAIN_ID,
    38.         info.PL_PLAN_INFO_ID,
    39.         info.TASK_NAME,
    40.         info.ORDER_NO,
    41.         detail.BEGIN_TIME,
    42.         detail.OVER_TIME
    43. FROM
    44.         PL_PROJECT_MAIN main
    45.         LEFT JOIN PL_PLAN_INFO info ON main.PL_PROJECT_MAIN_ID = info.PL_PROJECT_MAIN_ID
    46.         AND info.PARENT_ID = '0'
    47.         LEFT JOIN PL_PLAN_DETAIL detail ON info.PL_PLAN_INFO_ID = detail.PL_PLAN_INFO_ID
    48. WHERE
    49.         main.PROJECT_PHASE NOT IN ( '1', '2', '3' )
    50.         AND info.ORDER_NO = '3'
    51.         ),
    52.         temp004 AS (
    53. SELECT
    54.         main.PL_PROJECT_MAIN_ID,
    55.         info.PL_PLAN_INFO_ID,
    56.         info.TASK_NAME,
    57.         info.ORDER_NO,
    58.         detail.BEGIN_TIME,
    59.         detail.OVER_TIME
    60. FROM
    61.         PL_PROJECT_MAIN main
    62.         LEFT JOIN PL_PLAN_INFO info ON main.PL_PROJECT_MAIN_ID = info.PL_PROJECT_MAIN_ID
    63.         AND info.PARENT_ID = '0'
    64.         LEFT JOIN PL_PLAN_DETAIL detail ON info.PL_PLAN_INFO_ID = detail.PL_PLAN_INFO_ID
    65. WHERE
    66.         main.PROJECT_PHASE NOT IN ( '1', '2', '3' )
    67.         AND info.ORDER_NO = '4'
    68.         ),
    69.         temp005 AS (
    70. SELECT
    71.         main.PL_PROJECT_MAIN_ID,
    72.         info.PL_PLAN_INFO_ID,
    73.         info.TASK_NAME,
    74.         info.ORDER_NO,
    75.         detail.BEGIN_TIME,
    76.         detail.OVER_TIME
    77. FROM
    78.         PL_PROJECT_MAIN main
    79.         LEFT JOIN PL_PLAN_INFO info ON main.PL_PROJECT_MAIN_ID = info.PL_PROJECT_MAIN_ID
    80.         AND info.PARENT_ID = '0'
    81.         LEFT JOIN PL_PLAN_DETAIL detail ON info.PL_PLAN_INFO_ID = detail.PL_PLAN_INFO_ID
    82. WHERE
    83.         main.PROJECT_PHASE NOT IN ( '1', '2', '3' )
    84.         AND info.ORDER_NO = '5'
    85.         )
    86.        
    87.        
    88.        
    89.         SELECT DISTINCT
    90.        
    91.                 (
    92.                 CASE

    93.                     WHEN to_char(BEGIN_TIME1,'yyyyMMdd') <= to_char(sysdate,'yyyyMMdd') AND to_char(OVER_TIME1,'yyyyMMdd') >= to_char(sysdate,'yyyyMMdd') THEN TASK_NAME1
    94.                     WHEN to_char(BEGIN_TIME2,'yyyyMMdd') <= to_char(sysdate,'yyyyMMdd') AND to_char(OVER_TIME2,'yyyyMMdd') >= to_char(sysdate,'yyyyMMdd') THEN TASK_NAME2
    95.                     WHEN to_char(BEGIN_TIME3,'yyyyMMdd') <= to_char(sysdate,'yyyyMMdd') AND to_char(OVER_TIME3,'yyyyMMdd') >= to_char(sysdate,'yyyyMMdd') THEN TASK_NAME3
    96.                     WHEN to_char(BEGIN_TIME4,'yyyyMMdd') <= to_char(sysdate,'yyyyMMdd') AND to_char(OVER_TIME4,'yyyyMMdd') >= to_char(sysdate,'yyyyMMdd') THEN TASK_NAME4
    97.                     WHEN to_char(BEGIN_TIME5,'yyyyMMdd') <= to_char(sysdate,'yyyyMMdd') AND to_char(OVER_TIME5,'yyyyMMdd') >= to_char(sysdate,'yyyyMMdd') THEN TASK_NAME5
    98.                     END
    99.                 ) AS taskName,
    100.                                                                
    101.                                                                
    102.        
    103.         a.PL_PROJECT_MAIN_ID,
    104.         a.PL_PROJECT_NAME,
    105.         a.PL_PROJECT_NO,
    106.         (
    107. CASE
    108.        
    109.         WHEN a.PL_PROJECT_ATTRIBUTE = '1' THEN
    110.         b.BUSI_INFO_ID
    111.         WHEN a.PL_PROJECT_ATTRIBUTE = '2' THEN
    112.         c.BUSI_INFO_ID
    113.         WHEN a.PL_PROJECT_ATTRIBUTE = '7' THEN
    114.         d.BUSI_INFO_ID
    115.         WHEN a.PL_PROJECT_ATTRIBUTE = '6' THEN
    116.         e.BUSI_INFO_ID
    117.         WHEN a.PL_PROJECT_ATTRIBUTE = '3' THEN
    118.         f.BUSI_INFO_ID
    119.         WHEN a.PL_PROJECT_ATTRIBUTE = '4' THEN
    120.         g.BUSI_INFO_ID
    121.         WHEN a.PL_PROJECT_ATTRIBUTE = '8' THEN
    122.         h.BUSI_INFO_ID
    123.         WHEN a.PL_PROJECT_ATTRIBUTE = '5' THEN
    124.         i.BUSI_INFO_ID
    125. END
    126.         ) AS busiInfoId,
    127.         (
    128.         CASE
    129.                        
    130.                         WHEN ( a.PROJECT_PHASE NOT IN ( '1', '2', '3', '8' ) AND a.CHANGE_STATUS NOT IN ( '5', '6' ) ) THEN
    131.                         '0'
    132.                         WHEN ( a.PROJECT_PHASE != '8' AND a.CHANGE_STATUS = '5' ) THEN
    133.                         '1'
    134.                         WHEN ( a.PROJECT_PHASE != '8' AND a.CHANGE_STATUS = '6' ) THEN
    135.                         '2'
    136.                         WHEN PROJECT_PHASE = '8' THEN
    137.                         '3'
    138.                 END
    139.                 ) AS plProjectStatus,
    140.                 j.PRO_MEMBER_ORG_ID AS sysOrgId,
    141.                 j.PRO_MEMBER_ORG_NAME AS sysOrgName,
    142.                 j.PRO_MEMBER_NAME,
    143.                 j.PRO_MEMBER_ID,
    144.                 k.CREATION_DATE,
    145.                 a.PL_PROJECT_REAL_OVER_TIME AS proOverTime,
    146.                 NVL(
    147.                         n.CALCULATE_TYPE,
    148.                 ( CASE WHEN j.PRO_MEMBER_ORG_NAME = '测控中心' THEN 'B' WHEN j.PRO_MEMBER_ORG_NAME = '保障设备中心' THEN 'B' ELSE 'A' END )) AS calculateType,
    149.                 n.DELIVERY_LIMIT,
    150.                 n.CONTRACT_END,
    151.                 n.BUSI_CONTRACT_OUT_INFO_ID,
    152.                 n.ADJUST_SUM
    153.         FROM
    154.                 PL_PROJECT_MAIN a
    155.                 LEFT JOIN PL_PRO_INFO_TECH b ON a.PL_PROJECT_MAIN_ID = b.PL_PROJECT_MAIN_ID
    156.                 LEFT JOIN PL_PRO_INFO_REPAIR c ON a.PL_PROJECT_MAIN_ID = c.PL_PROJECT_MAIN_ID
    157.                 LEFT JOIN PL_PRO_INFO_PLANEM d ON a.PL_PROJECT_MAIN_ID = d.PL_PROJECT_MAIN_ID
    158.                 LEFT JOIN PL_PRO_INFO_MEASURE e ON a.PL_PROJECT_MAIN_ID = e.PL_PROJECT_MAIN_ID
    159.                 LEFT JOIN PL_PRO_INFO_GOODS f ON a.PL_PROJECT_MAIN_ID = f.PL_PROJECT_MAIN_ID
    160.                 LEFT JOIN PL_PRO_INFO_APP g ON a.PL_PROJECT_MAIN_ID = g.PL_PROJECT_MAIN_ID
    161.                 LEFT JOIN PL_PRO_INFO_AIRREPAIR h ON a.PL_PROJECT_MAIN_ID = h.PL_PROJECT_MAIN_ID
    162.                 LEFT JOIN PL_PRO_INFO_AIRBORNE i ON a.PL_PROJECT_MAIN_ID = i.PL_PROJECT_MAIN_ID
    163.                 LEFT JOIN PL_PRO_MEMBER j ON j.PL_PROJECT_MAIN_ID = a.PL_PROJECT_MAIN_ID
    164.                 AND j.PRO_ROLE = 0
    165.                 LEFT JOIN WF_FLOW_CLIENT_RUN k ON j.PL_PROJECT_MAIN_ID = k.BUSINESS_KEY_
    166.                 LEFT JOIN PL_PLAN_INFO l ON l.PARENT_ID = '0'
    167.                 AND l.PL_PROJECT_MAIN_ID = a.PL_PROJECT_MAIN_ID
    168.                 LEFT JOIN PL_PLAN_DETAIL m ON l.PL_PLAN_INFO_ID = m.PL_PLAN_INFO_ID
    169.                 LEFT JOIN PL_PRO_PAY_INFO n ON n.PL_PROJECT_MAIN_ID = a.PL_PROJECT_MAIN_ID
    170.                 AND n.PAY_STATUS = 1
    171.                 LEFT JOIN (
    172.                 SELECT
    173.                                                 temp001.PL_PROJECT_MAIN_ID,
    174. temp001.TASK_NAME TASK_NAME1,temp001.ORDER_NO ORDER_NO1,temp001.BEGIN_TIME BEGIN_TIME1,temp001.OVER_TIME OVER_TIME1,
    175. temp002.TASK_NAME TASK_NAME2,temp002.ORDER_NO ORDER_NO2,temp002.BEGIN_TIME BEGIN_TIME2,temp002.OVER_TIME OVER_TIME2,
    176. temp003.TASK_NAME TASK_NAME3,temp003.ORDER_NO ORDER_NO3,temp003.BEGIN_TIME BEGIN_TIME3,temp003.OVER_TIME OVER_TIME3,
    177. temp004.TASK_NAME TASK_NAME4,temp004.ORDER_NO ORDER_NO4,temp004.BEGIN_TIME BEGIN_TIME4,temp004.OVER_TIME OVER_TIME4,
    178. temp005.TASK_NAME TASK_NAME5,temp005.ORDER_NO ORDER_NO5,temp005.BEGIN_TIME BEGIN_TIME5,temp005.OVER_TIME OVER_TIME5

    179.                 FROM
    180.                         temp001
    181.                         LEFT JOIN temp002 ON temp001.PL_PROJECT_MAIN_ID = temp002.PL_PROJECT_MAIN_ID
    182.                         LEFT JOIN temp003 ON temp001.PL_PROJECT_MAIN_ID = temp003.PL_PROJECT_MAIN_ID
    183.                         LEFT JOIN temp004 ON temp001.PL_PROJECT_MAIN_ID = temp004.PL_PROJECT_MAIN_ID
    184.                         LEFT JOIN temp005 ON temp001.PL_PROJECT_MAIN_ID = temp005.PL_PROJECT_MAIN_ID
    185.                 ) temp ON a.PL_PROJECT_MAIN_ID = temp.PL_PROJECT_MAIN_ID
    186.         WHERE
    187.                 a.PROJECT_PHASE NOT IN ( '1', '2', '3' )
    188.         ORDER BY
    189.         nlssort( a.PL_PROJECT_NAME, 'NLS_SORT = SCHINESE_PINYIN_M' ),
    190. a.PL_PROJECT_NO
    复制代码
    总结

    以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

    来源:https://www.jb51.net/database/330973jvz.htm
    免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

    最新评论

    QQ Archiver 手机版 小黑屋 福建二哥 ( 闽ICP备2022004717号|闽公网安备35052402000345号 )

    Powered by Discuz! X3.5 © 2001-2023

    快速回复 返回顶部 返回列表