Как получить число в качестве псевдонима в oracle

#sql #oracle #alias

#sql #Oracle #псевдоним

Вопрос:

У меня есть следующий запрос:

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

где
v_FY0 — это ЧИСЛО (10)
и номер v_OffSet(10);

После выполнения я получаю: v_FY0 =2018 and v_OffSet = 0;

Таким образом, утверждение становится:

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

В принципе, чего я пытаюсь достичь, так это того, что при выборе столбца Y1 из таблицы TBLTMPLTS_LOAD_INCSTATEMT_RAW именем столбца должно быть вычисленное значение v_FY0 и v_OffSet, как указано в приведенном выше выражении, и я не могу записать это напрямую, поскольку оно выполняется в цикле, а в цикле есть разные значения для v_FY0 и v_OffSet, тем самым каждый раз изменяя имя столбца в зависимости от значений v_FY0 и v_OffSet.

Но я получаю сообщение об ошибке:

ORA -00923: ключевое слово FROM не найдено там, где ожидалось

Как это решить?

РЕДАКТИРОВАТЬ: Как сказал Каушик Наяк, код, который я представил выше, является частью инструкции unpivot, показанной ниже.Я удалил только ту часть, которая, по моему мнению, вызывала проблему, чтобы все четко поняли.

 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. Невозможно. Псевдоним столбца должен быть «постоянным»

2. Похоже, что ваш вопрос, вероятно, связан с поворотом (может быть динамическим), но сформулирован иначе, указав подмножество реальной проблемы. Покажите несколько примеров строк вашей таблицы с несколькими дополнительными записями и сообщите нам желаемый результат, это может быть понятно. Это может приблизить вас, если не к полному решению.

3. Если вам нужны динамические имена столбцов, вы также можете захотеть посмотреть на DBMS_SQL.

4. @KaushikNayak Я скопировал весь код сюда.

Ответ №1:

Имена столбцов в результирующем наборе являются идентификаторами. Идентификаторы должны быть указаны / известны во время подготовки инструкции SQL. Невозможно динамически изменять имена столбцов (псевдонимы столбцов) во время выполнения инструкции.

Нормативный подход к удовлетворению требований такого типа заключается в выполнении двух инструкций SQL. Результаты первого оператора могут быть использованы при генерации текста второго оператора SQL.


Редактировать

В полном коде (добавленном в недавнем редактировании вопроса), похоже, что в инструкции, которая присваивает значение v_SQL , отсутствует заключительная одинарная кавычка.

Похоже, что мы хотели бы, чтобы EXECUTE IMMEDIATE это был отдельный оператор, а не часть значения, присвоенного v_SQL .

В исходном вопросе было неясно (для меня), что проблема была в контексте блока PL / SQL, т.е. v_offset Является ссылкой на переменную PL / SQL, а не на столбец.

Для отладки рассмотрите возможность DBMS_OUTPUT-ввода значения v_SQL сразу после присвоения.