如何在Oracle中获取数字作为别名

时间:2019-03-28 14:25:32

标签: sql oracle alias

我有以下查询:

Select 
  Y1 as Cast(v_FY0 - 5 - v_offset as char) 
from 
  TBLTMPLTS_LOAD_INCSTATEMT_RAW;

其中       v_FY0为NUMBER(10)     和v_OffSet Number(10);

执行后,我得到:v_FY0 =2018 and v_OffSet = 0;

因此该语句变为:

SELECT 
  Y1 as CAST(2018 - 5 - 0 AS CHAR) 
FROM 
  TBLTMPLTS_LOAD_INCSTATEMT_RAW;

基本上,我要实现的是从表TBLTMPLTS_LOAD_INCSTATEMT_RAW中选择列Y1时,列名应为上述表​​达式中给出的v_FY0和v_OffSet的计算值,并且我无法直接编写它,因为它在循环中运行在循环中,v_FY0和v_OffSet的值不同,从而根据v_FY0和v_OffSet的值每次更改列名。

但是我得到了错误:

  

ORA -00923:在预期位置找不到FROM关键字

如何解决这个问题?

编辑: 正如Kaushik Nayak所说,我上面提供的代码是下面所示的关键声明的一部分。我只删除了我认为导致该问题的部分,以使每个人都清楚理解。

v_SQL := '
-- ==========================================================
--  Main Unpivot Table -  To move years from column headings 
--  to rows values
-- ==========================================================

SELECT 
 CAST(FieldYear AS Number) FieldYear
, FieldType
, CASE FieldValue 
    WHEN '''' THEN NULL
    ELSE CAST (FieldValue AS Number(38,8))
  END FieldValue
FROM 
(SELECT ' || 
v_InsertType ||' AS FieldType
,Y1 as ' || CAST(v_FY0 - 5 - v_OffSet AS CHAR) || '
,Y2 as ' || CAST(v_FY0 - 4 - v_OffSet AS CHAR) || '
,Y3 as ' || CAST(v_FY0 - 3 - v_OffSet AS CHAR) || '
,Y4 as ' || CAST(v_FY0 - 2 - v_OffSet AS CHAR) || '
,Y5 as ' || CAST(v_FY0 - 1 - v_OffSet AS CHAR) || '
,Y6 as ' || CAST(v_FY0     - v_OffSet AS CHAR) || ' 
,Y7 as ' || CAST(v_FY0 + 1 - v_OffSet AS CHAR) || '
,Y8 as ' || CAST(v_FY0 + 2 - v_OffSet AS CHAR) || '
,Y9 as ' || CAST(v_FY0 + 3 - v_OffSet AS CHAR) || '
,Y10 as ' || CAST(v_FY0 + 4 - v_OffSet AS CHAR) || '
,Y11 as ' || CAST(v_FY0 + 5 - v_OffSet AS CHAR) || '
,Y12 as ' || CAST(v_FY0 + 6 - v_OffSet AS CHAR) || '
,Y13 as ' || CAST(v_FY0 + 7 - v_OffSet AS CHAR) || '
,Y14 as ' || CAST(v_FY0 + 8 - v_OffSet AS CHAR) || '
,Y15 as ' || CAST(v_FY0 + 9 - v_OffSet AS CHAR) || '
,Y16 as ' || CAST(v_FY0 + 10 - v_OffSet AS CHAR) || '
,Y17 as ' || CAST(v_FY0 + 11 - v_OffSet AS CHAR) || '
,Y18 as ' || CAST(v_FY0 + 12 - v_OffSet AS CHAR) || '
,Y19 as ' || CAST(v_FY0 + 13 - v_OffSet AS CHAR) || '
,Y20 as ' || CAST(v_FY0 + 14 - v_OffSet AS CHAR) || '
,Y21 as ' || CAST(v_FY0 + 15 - v_OffSet AS CHAR) || '
,Y22 as ' || CAST(v_FY0 + 16 - v_OffSet AS CHAR) || '
,Y23 as ' || CAST(v_FY0 + 17 - v_OffSet AS CHAR) || '
,Y24 as ' || CAST(v_FY0 + 18 - v_OffSet AS CHAR) || '
,Y25 as ' || CAST(v_FY0 + 19 - v_OffSet AS CHAR) || '
,Y26 as ' || CAST(v_FY0 + 20 - v_OffSet AS CHAR) || '
,Y27 as ' || CAST(v_FY0 + 21 - v_OffSet AS CHAR) || '
,Y28 as ' || CAST(v_FY0 + 22 - v_OffSet AS CHAR) || '
,Y29 as ' || CAST(v_FY0 + 23 - v_OffSet AS CHAR) || '
,Y30 as ' || CAST(v_FY0 + 24 - v_OffSet AS CHAR) || '
,Y31 as ' || CAST(v_FY0 + 25 - v_OffSet AS CHAR) || '
,Y32 as ' || CAST(v_FY0 + 26 - v_OffSet AS CHAR) || '
,Y33 as ' || CAST(v_FY0 + 27 - v_OffSet AS CHAR) || '
,Y34 as ' || CAST(v_FY0 + 28 - v_OffSet AS CHAR) || '
,Y35 as ' || CAST(v_FY0 + 29 - v_OffSet AS CHAR) || '

FROM ' || 
    v_tblInsertType || ') UP
UNPIVOT
(FieldValue FOR FieldYear IN 
(' || CAST(v_FY0 - 5 - v_OffSet AS CHAR) || '
,' || CAST(v_FY0 - 4 - v_OffSet AS CHAR) || '
,' || CAST(v_FY0 - 3 - v_OffSet AS CHAR) || '
,' || CAST(v_FY0 - 2 - v_OffSet AS CHAR) || '
,' || CAST(v_FY0 - 1 - v_OffSet AS CHAR) || '
,' || CAST(v_FY0     - v_OffSet AS CHAR) || '
,' || CAST(v_FY0 + 1 - v_OffSet AS CHAR) || '
,' || CAST(v_FY0 + 2 - v_OffSet AS CHAR) || '
,' || CAST(v_FY0 + 3 - v_OffSet AS CHAR) || '
,' || CAST(v_FY0 + 4 - v_OffSet AS CHAR) || '
,' || CAST(v_FY0 + 5 - v_OffSet AS CHAR) || '
,' || CAST(v_FY0 + 6 - v_OffSet AS CHAR) || '
,' || CAST(v_FY0 + 7 - v_OffSet AS CHAR) || '
,' || CAST(v_FY0 + 8 - v_OffSet AS CHAR) || '
,' || CAST(v_FY0 + 9 - v_OffSet AS CHAR) || '
,' || CAST(v_FY0 + 10 - v_OffSet AS CHAR) || '
,' || CAST(v_FY0 + 11 - v_OffSet AS CHAR) || '
,' || CAST(v_FY0 + 12 - v_OffSet AS CHAR) || '
,' || CAST(v_FY0 + 13 - v_OffSet AS CHAR) || '
,' || CAST(v_FY0 + 14 - v_OffSet AS CHAR) || '
,' || CAST(v_FY0 + 15 - v_OffSet AS CHAR) || '
,' || CAST(v_FY0 + 16 - v_OffSet AS CHAR) || '
,' || CAST(v_FY0 + 17 - v_OffSet AS CHAR) || '
,' || CAST(v_FY0 + 18 - v_OffSet AS CHAR) || '
,' || CAST(v_FY0 + 19 - v_OffSet AS CHAR) || '
,' || CAST(v_FY0 + 20 - v_OffSet AS CHAR) || '
,' || CAST(v_FY0 + 21 - v_OffSet AS CHAR) || '
,' || CAST(v_FY0 + 22 - v_OffSet AS CHAR) || '
,' || CAST(v_FY0 + 23 - v_OffSet AS CHAR) || '
,' || CAST(v_FY0 + 24 - v_OffSet AS CHAR) || '
,' || CAST(v_FY0 + 25 - v_OffSet AS CHAR) || '
,' || CAST(v_FY0 + 26 - v_OffSet AS CHAR) || '
,' || CAST(v_FY0 + 27 - v_OffSet AS CHAR) || '
,' || CAST(v_FY0 + 28 - v_OffSet AS CHAR) || '
,' || CAST(v_FY0 + 29 - v_OffSet AS CHAR) || '
)
)AS unpvt

Execute immediate v_SQL;

但是我遇到了错误-ORA-00923:在期望的位置找不到FROM关键字。

1 个答案:

答案 0 :(得分:1)

结果集中的列名称是标识符。准备SQL语句时必须指定/知道标识符。不能通过语句执行或在执行过程中动态修改列名(列别名)。

满足这种要求的标准方法是运行两个 SQL语句。第一条语句的结果可用于生成第二条SQL语句的文本。


编辑

在完整的代码(在问题的最新编辑中添加)中,似乎为v_SQL赋值的语句中缺少最后一个单引号。

似乎我们希望EXECUTE IMMEDIATE是一个单独的语句,而不是分配给v_SQL的值的一部分。

在最初的问题中,(对我而言)尚不清楚该问题是否在PL / SQL块的上下文中,即v_offset是对PL / SQL变量的引用,而不是对列的引用。

要进行调试,请考虑在分配后立即将DBS_OUTPUT-ing v_SQL的值。