【问题标题】:Order of columns in Oracle view is ignoredOracle 视图中的列顺序被忽略
【发布时间】: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 语句的示例,将会很有帮助。哦,顺便说一句 - 您正在使用的表中的数据是否发生了很大变化?

标签: oracle view


【解决方案1】:

我认为“不可预测”类似于

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;

【讨论】:

    【解决方案2】:

    尝试不使用双引号作为列名。

    SELECT /*+ORDERED */ a.ID AS "ID",  => SELECT /*+ORDERED */ a.ID AS ID, 
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-02-18
      • 1970-01-01
      • 2018-07-23
      • 1970-01-01
      • 2017-11-30
      • 1970-01-01
      • 2015-04-03
      相关资源
      最近更新 更多