更新时间:2024-10-26 GMT+08:00

伪列

本节主要介绍Oracle伪列的迁移语法。迁移语法决定了关键字/功能的迁移方式。

伪列与表的列类似,但不存储在表中。用户可在伪列中进行SELECT操作,但无法插入、更新、或删除其中的值。

ROWID

ROWID伪列返回特定行的具体地址。

图1 输入:ROWID
图2 输出:ROWID

ROWNUM

对于查询返回的每行数据,ROWNUM伪列段会返回一个数字,表示Oracle从一个表或一组连接的行中选择行的顺序。选择的第一行的ROWNUM为1,第二行为2,以此类推。

图3 输入:ROWNUM
图4 输出:ROWNUM

输入ROWNUM,使用UPDATE

执行UPDATE时,如果使用了具有某个值(整数)的ROWNUM,系统将根据ROWNUM附近使用的运算符更新记录。

1
2
3
4
5
UPDATE SCMS_MSGPOOL_LST
             SET MSG_STD = '11'
           WHERE UNISEQNO = IN_OUNISEQNO
             AND MSG_TYP1 IN ('MT103', 'MT199')
             AND ROWNUM = 1;

输出

1
2
3
4
5
6
7
 UPDATE SCMS_MSGPOOL_LST
   SET MSG_STD = '11'
 WHERE (xc_node_id,ctid) in (select xc_node_id, ctid 
        from SCMS_MSGPOOL_LST 
        where UNISEQNO = IN_OUNISEQNO
        AND MSG_TYP1 IN ('MT103', 'MT199')
        LIMIT 1)

输入:ROWNUM,使用DELETE

执行DELETE时,如果使用了具有某个值(整数)的ROWNUM,系统将根据ROWNUM附近的运算符依次删除记录。

1
2
delete from test1 
where c1='abc' and rownum = 1;

输出

1
delete from test1 where (xc_node_id,ctid) in (select xc_node_id, ctid from test1 where c1='abc' limit 1);

输入:UPDATE,使用ROWNUM

使用ROWNUM迁移的UPDATE和DELETE脚本包含LIMIT,GaussDB(DWS)不支持。

1
2
3
4
5
UPDATE SCMS_MSGPOOL_LST
 SET MSG_STD = '11'
 WHERE UNISEQNO = IN_OUNISEQNO
 AND MSG_TYP1 IN ('MT103', 'MT199')
 AND ROWNUM = 1;

输出

1
2
3
4
5
6
7
8
UPDATE SCMS_MSGPOOL_LST
   SET MSG_STD = '11'
 WHERE (xc_node_id, ctid) = ( SELECT xc_node_id, ctid
           FROM SCMS_MSGPOOL_LST
          WHERE UNISEQNO = IN_OUNISEQNO
         AND MSG_TYP1 IN ('MT103', 'MT199') 
          LIMIT 1
       );

输入:DELETE,使用ROWNUM

1
2
3
4
5
DELETE FROM SPMS_APP_PUBLISH
 WHERE NOVA_NO = IN_NOVA_NO
   AND DELIVERY_TYPE = '1'
   AND PUBLISH_DATE = IN_PUBLISH_DATE
   AND ROWNUM = 1;

输出

1
2
3
4
5
6
7
8
DELETE FROM SPMS_APP_PUBLISH
 WHERE (xc_node_id, ctid) IN (SELECT xc_node_id, ctid
           FROM SPMS_APP_PUBLISH
          WHERE NOVA_NO = IN_NOVA_NO
         AND DELIVERY_TYPE = '1'
         AND PUBLISH_DATE = IN_PUBLISH_DATE 
          LIMIT 1
        );