Как передать функцию с динамическим именем столбцов? - PullRequest
0 голосов
/ 07 июля 2011

Мне нужно создать отчет, в котором будут отображаться расходы за последние 12 месяцев. Зависит от того, когда я выполню свой отчет, имя столбцов моего отчета изменится (например, если я выполню отчет в JUL, он должен получить двенадцать столбцов с затратами в июне, мае, апреле, марте. столбцы последние 12 месяцев).

Следующий код PL / SQL создает представление со столбцами динамического имени в зависимости от sysdate.

DECLARE

vSQL VARCHAR2(4000);

BEGIN

vSQL := 'CREATE OR REPLACE VIEW IFSAPP.RLDateTest AS SELECT 
            ip.part_no,
            IFSAPP.RD_PURCH_DEMAND_QTY_ISSUE_API.Get_Avr_Usage_Per_Month(ip.contract,ip.part_no ,to_char(sysdate, ''MM'')-1) ' || **SUBSTR(ADD_MONTHS(SYSDATE, -1),4,3)** ||
         ', IFSAPP.RD_PURCH_DEMAND_QTY_ISSUE_API.Get_Avr_Usage_Per_Month(ip.contract,ip.part_no ,to_char(sysdate, ''MM'')-2) ' || **substr(ADD_MONTHS(SYSDATE, -2),4,3)** || ' FROM ifsapp.inventory_part ip WHERE ip.contract = ''S03'' ';

EXECUTE IMMEDIATE vSQL;

END;

(|| SUBSTR (ADD_MONTHS (SYSDATE, -1), 4,3) || - псевдоним каждого столбца)

Смысл в том, что, как только я выполню свой отчет, он должен создать представление и показать все его строки. Для этого я подумал об использовании конвейера (для создания таблицы типов, состоящей из результата моего представления, и это позволило бы мне сделать SELECT * FROM TABLE (getView ())) в моем отчете.

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

Любая идея, как можно сделать это или любое другое решение, которое позволило бы мне использовать мой взгляд в избранном зачете?

Большое спасибо.

Ответы [ 3 ]

3 голосов
/ 07 июля 2011

Либо я полностью неправильно понял ваши требования, либо это полная чушь.Это очень редкая ситуация, когда вам нужно динамически выполнять любой DDL.Необходимость динамического создания VIEW очень подозрительно.

Однако вы не назвали свои столбцы в выбранной части, чтобы они получили неявные имена, и это может быть тем, что делает их «динамическими».Когда вы делаете какое-либо выражение в своих утверждениях select, всегда называйте их:

create or replace view v1 as 
select a + b as a_plus_b 
  from table t;

Не представляете, какое отношение к этому имеет конвейерная обработка.

0 голосов
/ 08 июля 2011

Я бы выбрал один вид / функцию, которая выбирает двенадцать столбцов как

month_minus_1, month_minus_2, .... month_minus_12

Тогда конечный клиент может сам определить заголовок столбца отчета. В противном случае жестко закодируйте 12 опций и просто запустите новый скрипт 1-го числа месяца через DBMS_SCHEDULER.

0 голосов
/ 08 июля 2011

Не указывайте в столбце имя какого-либо параметра.Дайте ему имя возвращаемого значения.В вашем случае это будет: "Avr_Usage_this_Month", "Avr_Usage_previous_Month".Теперь столбцы всегда имеют одинаковое имя.Намного проще использовать ваше представление сейчас.

Некоторые дополнительные замечания:

SUBSTR(ADD_MONTHS(SYSDATE, -1),4,3)
substr(ADD_MONTHS(SYSDATE, -2),4,3)

Не приведет ли это к тому же имени столбца, если вы не запустите его во второй день месяца?

Кроме того, всегда используйте явные строки формата даты.Вы не можете полагаться на эти утверждения, чтобы всегда возвращать название месяца.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...