【发布时间】: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_Columns和All_Objects提供定义,包括关系等,而不是目的地! -
您可能需要将您的条件移动到
select并尝试使用case when PK_Type = 'P' THEN 'true' else 'false' end作为您的表达式 -
@LoztInSpace 大部分课程都是'这不是人们实际这样做的方式' 我只是想通过它,因为这是我毕业前的最后一堂课。感谢您的帮助,您对 PK_Type = 'P' 的看法是正确的......这也是我发现的,我只是无法成功地让它工作。
标签: mysql sql stored-procedures