【发布时间】:2015-12-21 06:57:59
【问题描述】:
我在使用过程创建视图时遇到问题,因为 Oracle 忽略了我指定的列的顺序。
我在循环中创建用于创建视图的命令文本(在每个循环中一个视图),在视图结束时我执行EXECUTE IMMEDIATE textOfCommand;
我尝试在选择之前添加/*+ORDERED */,但这没有帮助。 (我也尝试直接运行查询,而不是从程序)
生成的命令本身很好,column_id 也很好,但是在 oracle developer 或 geomedia 中被忽略了。我认为这将是查询优化的问题,因为查询中有几个连接。
我只是不明白为什么它如此不可预测,顺序有时很好,有时不是(如果我多次运行相同的命令)它不依赖于视图,它绝对是随机的,我不知道是什么是原因。 如果您有任何想法,请分享。谢谢
编辑:
我在 oracle developer 和 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
【问题讨论】:
-
您能否发布您的 CREATE VIEW 语句以及您的 EXECUTE IMMEDIATE 的结果?
-
你说的是列顺序还是行顺序关闭?
-
您可能需要在添加随机提示之前查看文档。 “ORDERED 提示指示 Oracle 按照它们在 FROM 子句中出现的顺序连接表。” docs.oracle.com/cd/E11882_01/server.112/e26088/…
-
ORDERED 提示告诉数据库按照查询指定的顺序执行连接 - 它与结果集中列的顺序没有任何关系(直接)。如果您可以编辑您的帖子并显示生成的 CREATE VIEW 语句的示例,将会很有帮助。哦,顺便说一句 - 您正在使用的表中的数据是否发生了很大变化?