【问题标题】:IF/THEN To return if Column is a PrimaryKey or NotIF/THEN 返回 Column 是否为 PrimaryKey
【发布时间】:2020-10-21 01:29:06
【问题描述】:

希望您能提供帮助。我们有一个名为 SystemTableColumns 的表,它旨在为各种数据字典提供服务,以容纳数据库中所有表的所有列信息。我们创建了一个过程来收集我们需要的所有数据,除了 InPrimaryKey。据我们所知,这意味着如果列是主键,则为布尔值 (TRUE|FALSE)。我们还没有弄清楚这样做的魔力。

我们意识到查看 ALL_CONSTRAINTS 中的 Contraint_Type 以查找 P 将是一个 IF 语句。但我们无法弄清楚如何在不显示所有其他约束的重复行的情况下返回它,如果您返回 Contraint_Type。

以下是书面程序:

CREATE TABLE SystemTableColumns(
    TableName VARCHAR2(30) NOT NULL,
    ColumnName VARCHAR2(30) NOT NULL,
    ObjectType VARCHAR2(18),
    FieldType VARCHAR2(106),
    FieldTypeLength NUMBER NOT NULL,
    InPrimaryKey VARCHAR(10),
    CreateDate DATE  NOT NULL,
    LastModifiedDate DATE NOT NULL,
    ColumnID NUMBER,
    ObjectID NUMBER  NOT NULL
);
/

CREATE OR REPLACE PROCEDURE p_systemtablecolumns_info IS
    BEGIN
        INSERT INTO SystemTableColumns
            SELECT 
            T.Table_Name TableName,
            T.Column_Name ColumnName,
            A.Object_Type ObjectType,
            T.Data_Type FieldType,
            T.Data_Length FieldTypeLength,
            C.Constraint_Type InPrimaryKey,
            A.Created CreateDate,
            A.Last_DDL_Time LastModifiedDate,
            T.Column_ID,
            A.Object_ID
        FROM All_Tab_Columns T,All_Objects A
        WHERE T.Owner = A.Owner
        AND T.Table_Name = A.Object_Name
        AND T.Table_Name = C.Table_Name
        AND C.Constraint_Type = PK_Type
        MINUS
        SELECT 
            S.TableName,
            S.ColumnName,
            S.ObjectType,
            S.FieldType,
            S.FieldTypeLength,
            S.InPrimaryKey,
            S.CreateDate,
            S.LastModifiedDate,
            S.ColumnID,
            S.ObjectID
        FROM SystemTableColumns S;
        IF PK_Type  = 'P' THEN INSERT INTO SystemTableColumns (IsPrimaryKey) VALUES ('TRUE');
            ELSE INSERT INTO SystemTableColumns (IsPrimaryKey) VALUES ('FALSE');
            END IF;
        COMMIT;
    END;



BEGIN
        -- Call the procedure
         P_systemtablecolumns_info;
END;

期望的结果:

【问题讨论】:

  • 您使用的是什么数据库?你知道INFORMATION_SCHEMA 吗?
  • SQL Developer...记住这是一项任务,我们需要创建 SystemTableColumns 并使用一个过程来填充
  • “记住”。你从来没有提过这个。完成这项实际工作的正确方法是使用 INFORMATION_SCHEMA。所以你问的是一个关于连接的一般问题,而不是存储过程或 PK 或任何东西。您需要为All_Tab_ColumnsAll_Objects 提供定义,包括关系等,而不是目的地!
  • 您可能需要将您的条件移动到select 并尝试使用case when PK_Type = 'P' THEN 'true' else 'false' end 作为您的表达式
  • @LoztInSpace 大部分课程都是'这不是人们实际这样做的方式' 我只是想通过它,因为这是我毕业前的最后一堂课。感谢您的帮助,您对 PK_Type = 'P' 的看法是正确的......这也是我发现的,我只是无法成功地让它工作。

标签: mysql sql stored-procedures


【解决方案1】:

而不是尝试插入 PK_type 最后为什么不只是在选择它时将其更改为 true 和 false 然后插入到您想要存储数据的表中,就像评论中提到的 LoztInSpace 一样。

SELECT 
        T.Table_Name TableName,
        T.Column_Name ColumnName,
        A.Object_Type ObjectType,
        T.Data_Type FieldType,
        T.Data_Length FieldTypeLength,
        CASE C.Constraint_Type WHEN 'P' THEN 'TRUE' ELSE 'FALSE' END InPrimaryKey,
        A.Created CreateDate,
        A.Last_DDL_Time LastModifiedDate,
        T.Column_ID,
        A.Object_ID
    FROM All_Tab_Columns T,All_Objects A ,ALL_CONSTRAINTS C
    WHERE T.Owner = A.Owner
    AND T.Table_Name = A.Object_Name
    AND T.Table_Name = C.Table_Name
    

然后将此表插入到你想要的表中。

【讨论】:

  • 我尝试了这个精确的设置,当我运行程序时返回值不变,我遇到了重复。由于针对该列列出了多种约束类型,因此 C/P/R/C 被重复列出。
  • 您是否检查了带有此代码的表格,也只有一个不变的 InPirimaryKey 或重复?如果没有先检查然后看看这个表是否有同样的问题。
猜你喜欢
  • 2012-04-29
  • 2017-07-04
  • 2016-12-07
  • 1970-01-01
  • 2019-03-23
  • 1970-01-01
  • 2010-12-06
  • 2014-06-14
  • 1970-01-01
相关资源
最近更新 更多