Как динамически форматировать заголовки столбцов с помощью переменных подстановки - PullRequest
0 голосов
/ 20 октября 2018

У меня есть таблица, в которой есть продукты, определяемые идентифицирующим кодом, который начинается с цифры и заканчивается буквой, такой как 1A, 3B, 7C и т. Д. В запросе собраны необходимые данные об этихс PIVOT заявлением.К сожалению, в Oracle нам не разрешено начинать псевдонимы с числа.До сих пор я успешно справлялся с запросом, выводя данные, которые по существу следующие:

SELECT * FROM MyTable
PIVOT ( COUNT(Product) FOR ProductName IN (&product_statement) )

, где переменная подстановки product_statement была динамически сгенерирована с помощью того же процесса, описанного здесь: Как установить LINESIZE и PAGESIZE с помощью переменной подстановки? .Это типичный результат:

NAME     | A1 | B3 | C7
Product A| 1  | 2  | 1   
Product B| 3  | 1  | 2   

Теперь я пытаюсь перевернуть эти заголовки продукта.Опять же, с помощью процесса подстановки переменных, я создал другую переменную с именем &column_statement, которая выглядит следующим образом (каждая строка отделена CHR(10)):

COLUMN A1 TEMP FORMAT A3 HEADING ‘1A’
COLUMN B3 TEMP FORMAT A3 HEADING ‘3B’
COLUMN C7 TEMP FORMAT A3 HEADING ‘7C’

Мой мыслительный процесс заключался в том, что я мог сделать следующее вSQL * Plus:

&column_statement

SELECT * FROM MyTable
PIVOT ( COUNT(Product) FOR ProductName IN (&product_statement) )
/

, но он дает мне следующее:

SP2-0734: unknown command beginning “&column_st…” – rest of line ignored.

NAME     | A1 | B3 | C7
Product A| 1  | 2  | 1   
Product B| 3  | 1  | 2   

Что мне нужно сделать, чтобы динамически установить заголовки столбцов?

1 Ответ

0 голосов
/ 21 ноября 2018

Я понял это, основываясь на предложении Уильяма Робертсона.Я поместил данные в файл SQL, а затем запустил тот файл, который я только что создал в скрипте.Это выглядит так:

SET HEADING OFF
SET PAGESIZE 0
SPOOL /file_location/column_headers.sql

-- SELECT statement to dynamically make the column header string. Example output:
-- COLUMN A1 TEMP FORMAT A3 HEADING ‘1A’
-- COLUMN B3 TEMP FORMAT A3 HEADING ‘3B’
-- COLUMN C7 TEMP FORMAT A3 HEADING ‘7C’

SPOOL OFF

SET HEADING ON
SET PAGESIZE 100
SET TERMOUT ON

@/file_location/column_headers.sql

-- Now run the other query that uses these headers
SELECT …

Я бы не назвал это самым элегантным решением, но оно определенно помогло и уменьшило множество жестко закодированных запросов.

...