Oracle视图中的列顺序将被忽略

时间:2011-12-21 15:06:39

标签: oracle view

使用过程创建视图时遇到问题,因为Oracle忽略了我指定的列的顺序。

我创建了用于在循环中创建视图的命令文本(在每个循环中的一个视图中),在视图结束时执行EXECUTE IMMEDIATE textOfCommand;

我尝试在选择之前添加/*+ORDERED */,但这没有帮助。 (我也尝试直接运行查询,而不是从程序运行)

生成的命令本身很好,column_id也很好,但在oracle开发人员或geomedia中会被忽略。我认为这将优化查询,因为查询中有几个连接。

我只是无法理解为什么它是如此不可预测,顺序有时是好的,有时候不是(如果我多次运行相同的命令)它不依赖于视图,它绝对是随机的,我无法弄清楚是什么是原因。 如果您有任何想法,请分享。感谢

编辑:

我遇到了oracle开发人员和geomedia中显示的列(而不是行)的顺序问题。当我单击Oracle开发人员中的“列”选项卡时,可以看到具有良好COLUMN_ID的所有视图列,但此列不对它们进行排序。我认为这只是oracle开发人员显示它的方式,但其他软件也有问题。如果我运行select命令,顺序是好的。我不介意oracle开发人员的订单,但问题是客户的软件(geomedia)。

这是生成的sql的检查,它由过程创建,然后在过程中每个循环结束时由EXECUTE IMMEDIATE命令运行。 : (大约有100个这样的视图。表,列和命令取自一个配置表,它指定了所有这些。我使用GDOSYS.GPICKLISTS来识别FK和应该连接的表)

CREATE OR REPLACE FORCE VIEW "SOME_VIEW" AS 
SELECT /*+ORDERED */ a.ID AS "ID", 
a8.TEXT_EN AS "COLUMN_NAME_1", 
a.COLUMN_NAME_2 AS "COLUMN_NAME_2", 
a.COLUMN_NAME_3 AS "COLUMN_NAME_3", 
to_char(a.COLUMN_NAME_4,'yyyymmdd') AS "COLUMN_NAME_4", 
to_char(a.COLUMN_NAME_5,'yyyymmdd') AS "COLUMN_NAME_5", 
to_char(a.COLUMN_NAME_6,'yyyymmdd') AS "COLUMN_NAME_6", 
to_char(a.COLUMN_NAME_7,'yyyymmdd') AS "COLUMN_NAME_7", 
a.COLUMN_NAME_8 AS "COLUMN_NAME_8", 
a.COLUMN_NAME_9 AS "COLUMN_NAME_9", 
a.COLUMN_NAME_10 AS "COLUMN_NAME_10", 
to_char(a.COLUMN_NAME_11,'yyyymmdd') AS "COLUMN_NAME_11", 
a9.TEXT_EN AS "COLUMN_NAME_12", 
a10.TEXT_EN AS "COLUMN_NAME_13", 
a.COLUMN_NAME_14 AS "COLUMN_NAME_14", 
a11.TEXT_EN AS "COLUMN_NAME_15", 
FROM SOME_TABLE a 
LEFT JOIN IENC.TABLE1 a8 on a8.id = a.COLUMN_NAME_1 
LEFT JOIN IENC.TABLE2 a9 on a9.id = a.COLUMN_NAME_12 
LEFT JOIN IENC.TABLE3 a10 on a10.id = a.COLUMN_NAME_13 
LEFT JOIN IENC.TABLE4 a11 on a11.id = a.COLUMN_NAME_15 

1 个答案:

答案 0 :(得分:0)

我认为什么是“不可预测的”就像是

SELECT column_name, data_type, column_id
FROM user_tab_cols
WHERE table_name = 'SOME_VIEW';

如果要按某列排序行,则必须明确添加ORDER BY子句。

SELECT column_name, data_type, column_id
FROM user_tab_cols
WHERE table_name = 'SOME_VIEW'
ORDER BY column_id;