ORA-32033:不支持的列别名

时间:2017-05-26 13:06:06

标签: oracle

我有一个正在使用oracle 12c而不是10g的查询。我不确定问题是什么: 我的疑问是:

WITH tab1(rn,begin_chq_num,chq_lvs_stat,chq_num_of_lvs,tes) AS
  (SELECT 1 rn,
    begin_chq_num,
    chq_lvs_stat,
    chq_num_of_lvs,
    SUBSTR(chq_lvs_stat,1,1) tes
  FROM tbaadm.chq_book_table
  WHERE del_flg != 'Y'
  AND acid      IN
    (SELECT acid
    FROM tbaadm.GENERAL_ACCT_MAST_TABLE
    WHERE foracid = '01411110171546'
    )
  UNION ALL
  SELECT rn + 1 rn,
    begin_chq_num,
    chq_lvs_stat,
    chq_num_of_lvs,
    SUBSTR(chq_lvs_stat,rn + 1,1) tes
  FROM tab1
  WHERE rn < chq_num_of_lvs
  )
SELECT
  CASE
    WHEN begin_chq_num = 1
    THEN rn
    ELSE begin_chq_num +(rn-1)
  END cheque_num,
  begin_chq_num
  ||'-'
  ||(chq_num_of_lvs+begin_chq_num-1) cheque_range,
  DECODE(tes, 'I', 'Issued', 'P', 'Cleared', 'U', 'Unused', 'S', 'Stopped', 'C', 'Cautioned', 'D', 'Destroyed', 'R', 'Returned Paid', 'T', 'Transfered') status
FROM tab1
ORDER BY chq_lvs_stat,
  rn;

错误是:

ORA-32033: unsupported column aliasing
32033. 00000 -  "unsupported column aliasing"
*Cause:    column aliasing in WITH clause is not supported yet
*Action:   specify aliasing in defintion subquery and retry

我应该做些什么不同?

1 个答案:

答案 0 :(得分:2)

在Oracle 10g中,sub-query factoring clause不支持列别名或递归子查询。您使用的语法显示在11gR2

您需要更改:

WITH tab1(rn,begin_chq_num,chq_lvs_stat,chq_num_of_lvs,tes) AS

要:

WITH tab1 AS

找到一个不使用递归子查询因子子句的不同解决方案。

我认为您可以在Oracle 10g中执行此操作:

WITH tab1 AS (
  SELECT l.COLUMN_VALUE rn,
         begin_chq_num,
         chq_lvs_stat,
         chq_num_of_lvs,
         SUBSTR(chq_lvs_stat,l.COLUMN_VALUE,1) tes
  FROM   tbaadm.chq_book_table t,
         TABLE(
           CAST(
             MULTISET(
               SELECT LEVEL
               FROM   DUAL
               CONNECT BY LEVEL <= LENGTH( t.chq_lvs_stat )
             )
             AS SYS.ODCINUMBERLIST
           )
         ) l
  WHERE  del_flg != 'Y'
  AND    acid IN ( SELECT acid
                   FROM   tbaadm.GENERAL_ACCT_MAST_TABLE
                   WHERE  foracid = '01411110171546'
                 )
)
SELECT CASE
         WHEN begin_chq_num = 1
         THEN rn
         ELSE begin_chq_num +(rn-1)
       END cheque_num,
       begin_chq_num
         ||'-'
         ||(chq_num_of_lvs+begin_chq_num-1) cheque_range,
       DECODE(
         tes,
         'I', 'Issued',
         'P', 'Cleared',
         'U', 'Unused',
         'S', 'Stopped',
         'C', 'Cautioned',
         'D', 'Destroyed',
         'R', 'Returned Paid',
         'T', 'Transfered'
       ) status
FROM   tab1
ORDER BY chq_lvs_stat, rn;