文档首页 > > 工具指南> Migration Tool SQL语法迁移工具> Oracle语法迁移> DML> SELECT

SELECT

分享
更新时间: 2019/08/09 GMT+08:00

概述

Oracle的SELECT语句可以启动查询,使用一个可选的ORDER BY子句,该子句用于从数据库的一个或多个表中提取记录。

输入:SELECT

SELECT col1, col2
  FROM tab1;

输出

SELECT col1, col2
  FROM tab1;

子句顺序

HAVING子句必须出现在GROUP BY子句后面,而Oracle允许HAVING在GROUP BY子句之前或之后。在目标数据库中,HAVING子句被移至GROUP BY子句之后。

图1 输入:子句顺序
图2 输出:子句顺序

扩展Group By子句

指定GROUP BY子句可让数据库将所选行基于expr(s)的值分组。如果该子句包含CUBE,ROLLUP,或GROUPING SETS扩展项,则数据库除正则分组外还会进行超聚合分组。这些功能在DWS中不可用,可通过UNION ALL操作符实现。

图3 输入:扩展Group By子句
图4 输出:扩展Group By子句

使用GROUPING_ID和ROLLUP

GROUPING_ID会返回一个数字,该数字与关联到某行的GROUPING位向量相对应。GROUPING_ID仅适用于包含GROUP BY扩展项的SELECT语句,例如ROLLUP操作符和GROUPING函数。在包含多个GROUP BY表达式的查询中,要确定特定行的GROUP BY级别,需要使用多个GROUPING函数,这可能导致SQL语句变得复杂。在这种情况下,可使用GROUPING_ID避免语句复杂化。

括号中的表名

表名不需要在括号内指定,而Oracle允许使用括号。

图5 输入:括号中的表名
图6 输出:括号中的表名

UNIQUE关键字

UNIQUE关键字迁移为DISTINCT关键字

输入: SELECT UNIQUE

SELECT UNIQUE a.item_id id,
                     a.menu_id parent_id,a.serialno menu_order
                FROM ctp_menu_item_rel a WHERE  
    a.item_id IN(SELECT UNIQUE id FROM ctp_temp_item_table);

输出

SELECT DISTINCT a.item_id id,
   a.menu_id parent_id,a.serialno menu_order
     FROM ctp_menu_item_rel a WHERE  
       a.item_id IN(SELECT UNIQUE id FROM ctp_temp_item_table);

USERENV

输入CLIENT_INFO

返回用户会话信息。

SELECT 1
FROM   sp_ht ht
WHERE  ht.hth = pi_contract_number
       /*  AND ht.contract_status = 2  --delete by leinian 2014-03-03(ECO)  */
       AND ht.contract_status IN ( 1, 2 ) /*  add by leinian 2014-03-20(ECO)  */
       AND Nvl(ht.s3_pilot_flag, 'N') = 'N'
       AND NOT EXISTS (SELECT 1
                       FROM   asms.asms_lookup_values alv
                       WHERE  alv.type_code = 'HTLX_LOAN'
                              AND ht.htlx = alv.code)
       AND ht.duty_erp_ou_id = To_number(Nvl(Rtrim(Ltrim(Substr(Userenv(
                                                         'client_info'),
                                                         1,
                                                         8))), 218))
       AND ht.source_code = 'ECONTRACT'
       AND ht.needing_engineering_service IS NOT NULL
       AND ht.khm != '28060'
       AND ht.htlx != '111' ;

输出

SELECT
          1
     FROM
          sp_ht ht
     WHERE
          ht.hth = pi_contract_number /*   AND ht.contract_status = 2  --delete by leinian 2014-03-03(ECO)   */
          AND ht.contract_status IN (
               1
               ,2
          ) /*   add by leinian 2014-03-20(ECO)   */
          AND Nvl( ht.s3_pilot_flag ,'N' ) = 'N'
          AND NOT EXISTS (
               SELECT
                         1
                    FROM
                         asms.asms_lookup_values alv
                    WHERE
                         alv.type_code = 'HTLX_LOAN'
                         AND ht.htlx = alv.code
          )
          AND ht.duty_erp_ou_id = To_number( Nvl( Rtrim( Ltrim( SUBSTR( MIG_ORA_EXT.USERENV ( 'client_info' ) ,1 ,8 ) ) ) ,218 ) )
          AND ht.source_code = 'ECONTRACT'
          AND ht.needing_engineering_service IS NOT NULL
          AND ht.khm != '28060'
          AND ht.htlx != '111' ;

USERENV('CLIENT_INFO)

包中的函数转换后,不删除结束后的函数标记。4. sad_lookup_contract_pkg.bdy中的svproduct_is_for_pa函数被使用。

USERENV('CLIENT_INFO')

过程中使用的USERENV。迁移过程因工具而失败。

SELECT 1
FROM   sp_ht ht
WHERE  ht.hth = pi_contract_number
/*  AND ht.contract_status = 2  --delete by leinian 2014-03-03(ECO)  */
AND ht.contract_status IN ( 1, 2 ) /*  add by leinian 2014-03-20(ECO)  */
AND Nvl(ht.s3_pilot_flag, 'N') = 'N'
AND NOT EXISTS (SELECT 1
FROM   asms.asms_lookup_values alv
WHERE  alv.type_code = 'HTLX_LOAN'
AND ht.htlx = alv.code)
AND ht.duty_erp_ou_id = To_number(Nvl(Rtrim(Ltrim(Substr(Userenv(
'client_info'),
1,
8))), 218))
AND ht.source_code = 'ECONTRACT'
AND ht.needing_engineering_service IS NOT NULL
AND ht.khm != '28060'
AND ht.htlx != '111'

输入

Error message :client_info argument for USERENV function is not supported by the Migration Tool.

4_sad_lookup_contract_pkg

================================
CREATE OR REPLACE PACKAGE BODY SAD.sad_lookup_contract_pkg IS
 FUNCTION svproduct_is_for_pa(pi_contract_number IN VARCHAR2) RETURN VARCHAR2 IS
    l_flag VARCHAR2(1) := 'N';
  BEGIN
    FOR rec_lookup IN (SELECT 1
       FROM asms.asms_lookup_values alv
      WHERE alv.type_code = 'HTLX_LOAN'
        AND alv.duty_erp_ou_id = to_number(nvl(rtrim(ltrim(substr(userenv('client_info'), 1, 8))), 218))
                      )
    LOOP
      l_flag := 'Y';
    END LOOP;

    RETURN l_flag;
  END svproduct_is_for_pa;
END sad_lookup_contract_pkg;
/  

输出

CREATE OR replace FUNCTION sad_lookup_contract_pkg.Svproduct_is_for_pa ( 
pi_contract_number IN VARCHAR2) 
RETURN VARCHAR2 
IS 
  l_flag VARCHAR2 ( 1 ) := 'N'; 
BEGIN 
    FOR rec_lookup IN (SELECT 1 
                       FROM   asms.asms_lookup_values alv 
                       WHERE  alv.type_code = 'HTLX_LOAN' 
                              AND alv.duty_erp_ou_id = To_number(Nvl( 
                                                       Rtrim(Ltrim(Substr( 
                                  mig_ora_ext.Userenv ( 
                                  'client_info'), 1, 8)) 
                                                       ), 
                                                                            218) 
                                                       )) 
    LOOP 
        l_flag := 'Y'; 
    END LOOP; 

    RETURN l_flag; 
END; 

/ 
分享:

    相关文档

    相关产品

文档是否有解决您的问题?

提交成功!

非常感谢您的反馈,我们会继续努力做到更好!

反馈提交失败,请稍后再试!

*必选

请至少选择或填写一项反馈信息

字符长度不能超过200

提交反馈 取消

如您有其它疑问,您也可以通过华为云社区问答频道来与我们联系探讨

跳转到云社区