plsql 프로 시저 반복적 인 코드 라인. 더 나은 방법으로 만들려고
시나리오가 있습니다. 사용자가 매개 변수 Entity_type
를 전달하면 해당 entity
( table
)에 대한 데이터 만 삽입해야 합니다. 매개 변수를 전달하지 않으면 필요한 모든 테이블에 대한 데이터를 하나의 테이블에 삽입해야합니다.
그래서 우리 는 전달되면 테이블 DYNAMICENTITYGTT
에서 데이터를 가져올 Item
테이블이 있고 전달되면 org
테이블이 있습니다. 그러나 Entity_type
proc에서 parameter가 null 이면 두 테이블에서 데이터를 가져옵니다 .
또한 UPDATE_MODE
추가 또는 삭제 수단 의 유형에 따라 다른 열을 저장 합니다. 대상 테이블이 동일합니다. 소스 테이블과 열 이름은 다르지만 유형은 동일합니다.
동일한 절차를 아래에 작성했습니다.
이 코드를 더 좋게 만들기 위해 어쨌든 요청하고 있습니다. 더 똑똑하게 쓸 수 있을까요? 여러 줄을 반복하고 있기 때문입니다. 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 문에서 삽입하므로 조건이 예상과 다를 때 값을 반환하지 않도록 이러한 선택을 조작 할 수 있습니다.
매개 변수의 p_update_mode
경우 값이 "delete"이면 "delete"를 삽입하고 "add"값을 포함하면 "add"를 삽입하면됩니다.
매개 변수의 p_entity_type
경우 값이 "NULL"인 경우 두 선택에서 삽입하고 itemde
값이 "ITEM"인 orgde
경우 에만 테이블에서, 값이 "ORG"인 경우 에만 테이블 에서 삽입 합니다.
이제 선택 항목에 잘못된 값이있는 경우 p_entity_type
"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 개의 삽입으로 이어질 것입니다. 제가 믿고있는 것처럼 (그리고 제가 틀렸다면 알려주세요) 각 엔티티에는 서로 다른 테이블에 자체 데이터 세트가 있습니다.
또한 이러한 모든 테이블을 조인하여 아래 예와 같이 단일 삽입으로 만들 수 있으며 모든 새 엔티티는 WITH
명령문의 일부에 새 선택 만 추가하는 것을 의미 합니다. 하지만이 경우 성능에 대해 잘 모르겠습니다. 그것은 당신의 테이블이 얼마나 가득 차 있는지에 달려 있습니다.
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;
그리고 이것이 당신을 위해 지저분 해지더라도 s VIEW
를 수행 하는 위치를 만들고 UNION
s 대신 선택을 추가하는 새 엔티티 WITH
에서 제거 할 수 있습니다 .PROCEDURE
VIEW
PROCEDURE