plsql 程序重复的代码行。试图以更好的方式
plsql procedure repetitive line of code. trying to make in better way
我有一个场景。如果用户传递参数 Entity_type
那么您只需要为 entity
(table
) 插入数据。如果他没有传递任何参数,那么您需要将所有必需的 table 的数据插入一个 table.
所以我们有 table DYNAMICENTITYGTT
如果通过,它将从 Item
table 获取数据,如果通过 org
table通过了。但是,如果 Entity_type
参数在 proc..
中为空,它将从 table 中获取数据
它还会根据类型存储另一列 UPDATE_MODE
表示添加或删除。
目标 table 相同。来源 table 及其列名不同,但类型相同。
我已经写了下面的程序。
我只是想问问有没有改进这段代码的地方。我的意思是这可以用更聪明的方式编写吗?因为我在重复多行。我给出了 2 个实体的示例,但是有 7 个,所以代码会很大。
CREATE OR REPLACE procedure UPDATE_DYNAMIC_ENTITY(ENTITY_TYPE varchar2 default null,UPDATE_MODE varchar2)
Is
x number;
BEGIN
IF UPPER(entity_type)='ITEM' then
if upper(UPDATE_MODE)='DELETE' then
INSERT INTO DYNAMICENTITYGTT(Entity_type,Entity_id,Entity_code,Synonyms,Action) select Entity_type,Item_id,item_name,item_desc,'delete' from ITEMDE;
ELSIF lower(UPDATE_MODE)='add' then
INSERT INTO DYNAMICENTITYGTT(Entity_type,Entity_id,Entity_code,Synonyms,Action) select Entity_type,Item_id,item_name,item_desc,'add' from ITEMDE;
END IF;
ELSIF UPPER(entity_type)='ORG' then
if upper(UPDATE_MODE)='DELETE' then
INSERT INTO DYNAMICENTITYGTT(Entity_type,Entity_id,Entity_code,Synonyms,Action) select Entity_type,ORG_id,org_name,org_desc,'delete' from ORGDE;
ELSIF lower(UPDATE_MODE)='add' then
INSERT INTO DYNAMICENTITYGTT(Entity_type,Entity_id,Entity_code,Synonyms,Action) select Entity_type,ORG_id,org_name,org_desc,'add' from ORGDE;
END IF;
ELSE
if upper(UPDATE_MODE)='DELETE' then
INSERT INTO DYNAMICENTITYGTT(Entity_type,Entity_id,Entity_code,Synonyms,Action) select Entity_type,Item_id,item_name,item_desc,'delete' from ITEMDE;
INSERT INTO DYNAMICENTITYGTT(Entity_type,Entity_id,Entity_code,Synonyms,Action) select Entity_type,ORG_id,org_name,org_desc,'delete' from ORGDE;
ELSIF lower(UPDATE_MODE)='add' then
INSERT INTO DYNAMICENTITYGTT(Entity_type,Entity_id,Entity_code,Synonyms,Action) select Entity_type,Item_id,item_name,item_desc,'add' from ITEMDE;
INSERT INTO DYNAMICENTITYGTT(Entity_type,Entity_id,Entity_code,Synonyms,Action) select Entity_type,ORG_id,org_name,org_desc,'add' from ORGDE;
END IF;
END IF;
END UPDATE_DYNAMIC_ENTITY;
基本上我看到了两个插入内容,其中有两个变量决定了它的内容。您正在从 select 语句插入,因此当条件不符合预期时,您可以将这些 select 操作为 return 没有值。
对于参数 p_update_mode
很简单,如果它包含值“delete”插入“delete”,如果它包含值“add”插入“add”。
对于参数 p_entity_type
,当其值为“NULL”时,我们从两个 select 插入,如果值为“ITEM”,则仅从 itemde
table 插入,并且仅来自 orgde
table 如果值为“ORG”。
现在,如果 p_entity_type
中存在一些无效值,select 的 none 将生成数据,因为我们只识别“NULL”、“ITEM”和“ORG” .但是对于参数 p_update_mode
我们直接修改值并在插入中使用它,因此最好执行一些检查输入值是否对我们有效。
CREATE OR REPLACE PROCEDURE update_dynamic_entity(p_entity_type VARCHAR2 DEFAULT NULL,
p_update_mode VARCHAR2) IS
BEGIN
IF lower(p_update_mode) NOT IN ('add', 'delete')
THEN
RAISE VALUE_ERROR; -- maybe use raise_application_error for more details about problem
END IF;
--
INSERT INTO dynamicentitygtt
(entity_type, entity_id, entity_code, synonyms, action)
SELECT upper(NVL(p_entity_type, 'ITEM')), item_id, item_name, item_desc, lower(p_update_mode)
FROM itemde
WHERE upper(p_entity_type) = 'ITEM'
OR p_entity_type IS NULL;
--
INSERT INTO dynamicentitygtt
(entity_type, entity_id, entity_code, synonyms, action)
SELECT upper(NVL(p_entity_type, 'ORG')), org_id, org_name, org_desc, lower(p_update_mode)
FROM orgde
WHERE upper(p_entity_type) = 'ORG'
OR p_entity_type IS NULL;
END update_dynamic_entity;
如您所写,您有 7 个实体,因此这种方法会导致有 7 个插入,正如我所相信的(如果我错了请告诉我)每个实体在不同 table 中都有自己的数据集s.
也有可能加入所有这些 tables 并使其成为单个插入,如下例所示,每个新实体都意味着只将新的 select 添加到 WITH
部分的声明。但我不确定这种情况下的表现。这将取决于您的 table 有多满。
CREATE OR REPLACE PROCEDURE update_dynamic_entity(p_entity_type VARCHAR2 DEFAULT NULL,
p_update_mode VARCHAR2) IS
BEGIN
IF lower(p_update_mode) NOT IN ('add', 'delete')
THEN
RAISE VALUE_ERROR; -- maybe use raise_application_error for more details about problem
END IF;
--
INSERT INTO dynamicentitygtt
(entity_type, entity_id, entity_code, synonyms, action)
WITH data_view AS
( -- ITEM table
SELECT 'ITEM' entity_type, -- This separates inserted values
item_id data_id,
item_name data_name,
item_desc data_desc
FROM itemde
UNION ALL
-- ORG table
SELECT 'ORG' entity_type, -- This separates inserted values
org_id,
org_name,
org_desc
FROM orgde
-- NEXT entity table
)
SELECT upper(entity_type), data_id, data_name, data_desc, lower(p_update_mode)
FROM data_view
WHERE upper(p_entity_type) = entity_type
OR p_entity_type IS NULL;
END update_dynamic_entity;
即使这对您来说很麻烦,您也可以在执行 UNION
的地方创建一个 VIEW
,然后从 PROCEDURE
中删除 WITH
并使用新的实体将 selects 添加到 VIEW
而不是 PROCEDURE
.
我有一个场景。如果用户传递参数 Entity_type
那么您只需要为 entity
(table
) 插入数据。如果他没有传递任何参数,那么您需要将所有必需的 table 的数据插入一个 table.
所以我们有 table DYNAMICENTITYGTT
如果通过,它将从 Item
table 获取数据,如果通过 org
table通过了。但是,如果 Entity_type
参数在 proc..
它还会根据类型存储另一列 UPDATE_MODE
表示添加或删除。
目标 table 相同。来源 table 及其列名不同,但类型相同。
我已经写了下面的程序。
我只是想问问有没有改进这段代码的地方。我的意思是这可以用更聪明的方式编写吗?因为我在重复多行。我给出了 2 个实体的示例,但是有 7 个,所以代码会很大。
CREATE OR REPLACE procedure UPDATE_DYNAMIC_ENTITY(ENTITY_TYPE varchar2 default null,UPDATE_MODE varchar2)
Is
x number;
BEGIN
IF UPPER(entity_type)='ITEM' then
if upper(UPDATE_MODE)='DELETE' then
INSERT INTO DYNAMICENTITYGTT(Entity_type,Entity_id,Entity_code,Synonyms,Action) select Entity_type,Item_id,item_name,item_desc,'delete' from ITEMDE;
ELSIF lower(UPDATE_MODE)='add' then
INSERT INTO DYNAMICENTITYGTT(Entity_type,Entity_id,Entity_code,Synonyms,Action) select Entity_type,Item_id,item_name,item_desc,'add' from ITEMDE;
END IF;
ELSIF UPPER(entity_type)='ORG' then
if upper(UPDATE_MODE)='DELETE' then
INSERT INTO DYNAMICENTITYGTT(Entity_type,Entity_id,Entity_code,Synonyms,Action) select Entity_type,ORG_id,org_name,org_desc,'delete' from ORGDE;
ELSIF lower(UPDATE_MODE)='add' then
INSERT INTO DYNAMICENTITYGTT(Entity_type,Entity_id,Entity_code,Synonyms,Action) select Entity_type,ORG_id,org_name,org_desc,'add' from ORGDE;
END IF;
ELSE
if upper(UPDATE_MODE)='DELETE' then
INSERT INTO DYNAMICENTITYGTT(Entity_type,Entity_id,Entity_code,Synonyms,Action) select Entity_type,Item_id,item_name,item_desc,'delete' from ITEMDE;
INSERT INTO DYNAMICENTITYGTT(Entity_type,Entity_id,Entity_code,Synonyms,Action) select Entity_type,ORG_id,org_name,org_desc,'delete' from ORGDE;
ELSIF lower(UPDATE_MODE)='add' then
INSERT INTO DYNAMICENTITYGTT(Entity_type,Entity_id,Entity_code,Synonyms,Action) select Entity_type,Item_id,item_name,item_desc,'add' from ITEMDE;
INSERT INTO DYNAMICENTITYGTT(Entity_type,Entity_id,Entity_code,Synonyms,Action) select Entity_type,ORG_id,org_name,org_desc,'add' from ORGDE;
END IF;
END IF;
END UPDATE_DYNAMIC_ENTITY;
基本上我看到了两个插入内容,其中有两个变量决定了它的内容。您正在从 select 语句插入,因此当条件不符合预期时,您可以将这些 select 操作为 return 没有值。
对于参数 p_update_mode
很简单,如果它包含值“delete”插入“delete”,如果它包含值“add”插入“add”。
对于参数 p_entity_type
,当其值为“NULL”时,我们从两个 select 插入,如果值为“ITEM”,则仅从 itemde
table 插入,并且仅来自 orgde
table 如果值为“ORG”。
现在,如果 p_entity_type
中存在一些无效值,select 的 none 将生成数据,因为我们只识别“NULL”、“ITEM”和“ORG” .但是对于参数 p_update_mode
我们直接修改值并在插入中使用它,因此最好执行一些检查输入值是否对我们有效。
CREATE OR REPLACE PROCEDURE update_dynamic_entity(p_entity_type VARCHAR2 DEFAULT NULL,
p_update_mode VARCHAR2) IS
BEGIN
IF lower(p_update_mode) NOT IN ('add', 'delete')
THEN
RAISE VALUE_ERROR; -- maybe use raise_application_error for more details about problem
END IF;
--
INSERT INTO dynamicentitygtt
(entity_type, entity_id, entity_code, synonyms, action)
SELECT upper(NVL(p_entity_type, 'ITEM')), item_id, item_name, item_desc, lower(p_update_mode)
FROM itemde
WHERE upper(p_entity_type) = 'ITEM'
OR p_entity_type IS NULL;
--
INSERT INTO dynamicentitygtt
(entity_type, entity_id, entity_code, synonyms, action)
SELECT upper(NVL(p_entity_type, 'ORG')), org_id, org_name, org_desc, lower(p_update_mode)
FROM orgde
WHERE upper(p_entity_type) = 'ORG'
OR p_entity_type IS NULL;
END update_dynamic_entity;
如您所写,您有 7 个实体,因此这种方法会导致有 7 个插入,正如我所相信的(如果我错了请告诉我)每个实体在不同 table 中都有自己的数据集s.
也有可能加入所有这些 tables 并使其成为单个插入,如下例所示,每个新实体都意味着只将新的 select 添加到 WITH
部分的声明。但我不确定这种情况下的表现。这将取决于您的 table 有多满。
CREATE OR REPLACE PROCEDURE update_dynamic_entity(p_entity_type VARCHAR2 DEFAULT NULL,
p_update_mode VARCHAR2) IS
BEGIN
IF lower(p_update_mode) NOT IN ('add', 'delete')
THEN
RAISE VALUE_ERROR; -- maybe use raise_application_error for more details about problem
END IF;
--
INSERT INTO dynamicentitygtt
(entity_type, entity_id, entity_code, synonyms, action)
WITH data_view AS
( -- ITEM table
SELECT 'ITEM' entity_type, -- This separates inserted values
item_id data_id,
item_name data_name,
item_desc data_desc
FROM itemde
UNION ALL
-- ORG table
SELECT 'ORG' entity_type, -- This separates inserted values
org_id,
org_name,
org_desc
FROM orgde
-- NEXT entity table
)
SELECT upper(entity_type), data_id, data_name, data_desc, lower(p_update_mode)
FROM data_view
WHERE upper(p_entity_type) = entity_type
OR p_entity_type IS NULL;
END update_dynamic_entity;
即使这对您来说很麻烦,您也可以在执行 UNION
的地方创建一个 VIEW
,然后从 PROCEDURE
中删除 WITH
并使用新的实体将 selects 添加到 VIEW
而不是 PROCEDURE
.