代码之家  ›  专栏  ›  技术社区  ›  Prefijo Sustantivo

防止sqldeveloper在视图中扩展asterisc通配符

  •  1
  • Prefijo Sustantivo  · 技术社区  · 6 年前

    我有两个视图,第二个视图取决于第一个视图中的数据,并从不同的表中添加一些列。

    在sql developer中,我将视图定义如下:

    view1:     
    
    select col11, col12, col13, col14, col15, col15, col16, col17 
    from table1
    
    view2:
    select  view1.*, col22, col23
    from view1 join table2 on view1.col11 = table2.col21
    

    但保存后,sqldeveloper将第二个视图的“view1.*”部分扩展到列的显式列表,因此view2最终被重写为:

    select  view1.col11, view1.col12, view1.col13, view1.col14, view1.col15, view1.col15, view1.col16, view1.col17, col22, col23
    from view1 join table2 on view1.col11 = table2.col21
    

    这是很难阅读和保持的。

    有没有办法防止这种行为?

    谢谢

    1 回复  |  直到 6 年前
        1
  •  4
  •   thatjeffsmith    6 年前

    这不是SQL开发人员所做的 那个 ,这是数据库。

    您可以使用*语法创建视图,但数据库将始终将其转换为完全限定的选择列表。

    CREATE VIEW LOCS
    AS select * from locations;
    

    现在向DB询问DDL,您可以得到

    CREATE OR REPLACE FORCE EDITIONABLE VIEW "HR"."LOCS" (
        "LOCATION_ID",
        "STREET_ADDRESS",
        "POSTAL_CODE",
        "CITY",
        "STATE_PROVINCE",
        "COUNTRY_ID"
    ) AS
        SELECT
            "LOCATION_ID",
            "STREET_ADDRESS",
            "POSTAL_CODE",
            "CITY",
            "STATE_PROVINCE",
            "COUNTRY_ID"
        FROM
            locations;
    

    视图是在运行时定义的,它将采用现有列列表,并假设您希望视图中的列名与从中提取这些列的基础对象中的列名相同。

    Docs -

    视图创建时定义查询的扩展 已创建,Oracle数据库在顶级视图中展开任何通配符(*) 查询列列表。结果查询存储在数据中 词典所有子查询都保持不变。中的列名 扩展列列表用引号括起来,以说明 基本对象的列最初是 使用引号输入,并要求查询按语法进行 对的