如何用替换变量动态设置列标题的格式

时间:2018-10-19 22:21:41

标签: sql oracle sqlplus

我有一个表,该表的产品由标识码定义,该标识码以数字开头,并以字母{1A3B7C等结尾。查询会进行汇编使用PIVOT语句获取有关这些所需的数据。不幸的是,在Oracle中,我们不允许以数字开头的别名。到目前为止,我已经通过输出基本上如下的数据成功地使查询得以解决:

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

其中替换变量product_statement是在与此处描述的相同过程How do I set LINESIZE and PAGESIZE with a substitution variable?的帮助下动态生成的。这是一个有代表性的结果:

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 :(得分:0)

我根据威廉·罗伯逊的建议弄清楚了。我将数据后台处理到一个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 …

我不会说这是最优雅的解决方案,但是它绝对可以解决问题,并且减少了很多硬编码查询。