在PL / SQL中优化代码使其正确代码正在运行但不正确

问题描述

我有3套桌子。 来源表

ORGDE(ORG_ID,ORG_NAME,ORG_DESC,CREATION_DATE,LAST_UPDATE_DATE)       
ITEMDE(ITEM_ID,ITEM_NAME,ITEM_DESC,LAST_UPDATE_DATE)   

目标表

DYNAMICENTITYGTT(ENTITY_TYPE,ENTITY_ID,ENTITY_CODE,SYNONYMS,ACTION)

条件表

BATCH_RUN_DETAILS(ENTITY_TYPE,LAST_RUN_DATE,MAX_LAST_UPDATE_DATE)

我们必须在ORGDE和ITEMDE的DYNAMICENTITYGTT中插入数据。 DYNAMICENTITYGTT will be 'update' where CREATION_DATE>max_last_update_date中的操作 DYNAMICENTITYGTT will be 'add' where CREATION_DATE<max_last_update_date中的操作 如果存在p_entity_type,它将为该实体插入数据,否则将为两个表插入。

我写了下面的代码。我想改进它并使它变得更好。

CREATE OR REPLACE procedure UPDATE_DYNAMIC_ENTITY(P_ENTITY_TYPE varchar2 default null,P_UPDATE_MODE varchar2)
IS
BEGIN
IF UPPER(P_UPDATE_MODE)='INCREMENTAL'
THEN
 IF UPPER(p_entity_type)='ORG' then
      INSERT INTO DYNAMICENTITYGTT(Entity_type,Entity_id,Entity_code,Synonyms,Action) select P_Entity_type,ORG_id,org_name,org_desc,'add' from ORGDE where creation_date>(select max_last_update_date from BATCH_RUN_DETAILS where ENTITY_TYPE=P_ENTITY_TYPE);
     INSERT INTO DYNAMICENTITYGTT(Entity_type,'update' from ORGDE where creation_date<(select max_last_update_date from BATCH_RUN_DETAILS where ENTITY_TYPE=P_ENTITY_TYPE);
 ELSIF UPPER(p_entity_type)='ITEM' then
      INSERT INTO DYNAMICENTITYGTT(Entity_type,item_id,item_name,item_desc,'add' from ITEMDE where creation_date>(select max_last_update_date from BATCH_RUN_DETAILS where ENTITY_TYPE=P_ENTITY_TYPE);
     INSERT INTO DYNAMICENTITYGTT(Entity_type,'update' from ITEMDE where creation_date<(select max_last_update_date from BATCH_RUN_DETAILS where ENTITY_TYPE=P_ENTITY_TYPE);
 ELSIF P_ENTITY_TYPE=NULL THEN
     --Reading from org
     INSERT INTO DYNAMICENTITYGTT(Entity_type,Action) select p_Entity_type,'update' from ORGDE where creation_date<(select max_last_update_date from BATCH_RUN_DETAILS where ENTITY_TYPE=P_ENTITY_TYPE);
     --reading from item
     INSERT INTO DYNAMICENTITYGTT(Entity_type,'update' from ITEMDE where creation_date<(select max_last_update_date from BATCH_RUN_DETAILS where ENTITY_TYPE=P_ENTITY_TYPE);
  END IF;
END IF;
END UPDATE_DYNAMIC_ENTITY;  

能否请您提出对代码的改进建议。

解决方法

我要做的第一件事是对其进行格式化,以使其易于阅读。花了我更少的时间来格式化它,而花在编写这句话上:

CREATE OR replace PROCEDURE Update_dynamic_entity(
p_entity_type VARCHAR2 DEFAULT NULL,p_update_mode VARCHAR2)
IS
BEGIN
    IF Upper(p_update_mode) = 'INCREMENTAL' THEN
      IF Upper(p_entity_type) = 'ORG' THEN
        INSERT INTO dynamicentitygtt
                    (entity_type,entity_id,entity_code,synonyms,action)
        SELECT p_entity_type,org_id,org_name,org_desc,'add'
        FROM   orgde
        WHERE  creation_date > (SELECT max_last_update_date
                                FROM   batch_run_details
                                WHERE  entity_type = p_entity_type);

        INSERT INTO dynamicentitygtt
                    (entity_type,'update'
        FROM   orgde
        WHERE  creation_date < (SELECT max_last_update_date
                                FROM   batch_run_details
                                WHERE  entity_type = p_entity_type);
      ELSIF Upper(p_entity_type) = 'ITEM' THEN
        INSERT INTO dynamicentitygtt
                    (entity_type,item_id,item_name,item_desc,'add'
        FROM   itemde
        WHERE  creation_date > (SELECT max_last_update_date
                                FROM   batch_run_details
                                WHERE  entity_type = p_entity_type);

        INSERT INTO dynamicentitygtt
                    (entity_type,'update'
        FROM   itemde
        WHERE  creation_date < (SELECT max_last_update_date
                                FROM   batch_run_details
                                WHERE  entity_type = p_entity_type);
      ELSIF p_entity_type = NULL THEN
        --Reading from org
        INSERT INTO dynamicentitygtt
                    (entity_type,action)
        SELECT entity_type,'update'
        FROM   orgde
        WHERE  creation_date < (SELECT max_last_update_date
                                FROM   batch_run_details
                                WHERE  entity_type = p_entity_type);

        --reading from item
        INSERT INTO dynamicentitygtt
                    (entity_type,'update'
        FROM   itemde
        WHERE  creation_date < (SELECT max_last_update_date
                                FROM   batch_run_details
                                WHERE  entity_type = p_entity_type);
      END IF;
    END IF;
END update_dynamic_entity;  

我要做的第二件事是将DYNAMICENTITYGTT的名称更改为可读的名称DYNAMIC_ENTITY_GTT。 (实际上是用小写字母编码。我用大写字母显示它,因为它在数据字典中是这样。我实际上用小写字母编写了所有代码。)

为什么要在DYNAMICENTITYGTT(“ add”和“ update”)中插入几乎相同的行?

该表的名称带有“ GTT”,表明它是全局临时表,因此,我希望您在同一会话中实际对其进行处理。

,

这类似于之前在plsql procedure repetitive line of code. trying to make in better way上的回答。

我们现在要做的是将JOIN添加到包含batch_run_details的表中,并区分大小写,以便根据creation_datemax_last_update_date为每一行确定必须插入的操作。

CREATE OR REPLACE PROCEDURE update_dynamic_entity(p_entity_type VARCHAR2 DEFAULT NULL,p_update_mode VARCHAR2) IS
BEGIN
  IF lower(p_update_mode) <> 'incremental'
  THEN
    RETURN; -- Do nothing if incorrect mode
  END IF;
  --
  INSERT INTO dynamicentitygtt
    (entity_type,action)
    SELECT upper(NVL(p_entity_type,'ITEM')),t.item_id,t.item_name,t.item_desc,CASE
             WHEN t.creation_date > b.max_last_update_date THEN
               'update'
             WHEN t.creation_date < b.max_last_update_date THEN
               'add'
           END
      FROM itemde t
      JOIN batch_run_details b
        ON b.entity_type = 'ITEM'
     WHERE upper(p_entity_type) = 'ITEM'
        OR p_entity_type IS NULL;
  --
  INSERT INTO dynamicentitygtt
    (entity_type,'ORG')),t.org_id,t.org_name,t.org_desc,CASE
             WHEN t.creation_date > b.max_last_update_date THEN
               'update'
             WHEN t.creation_date < b.max_last_update_date THEN
               'add'
           END
      FROM orgde t
      JOIN batch_run_details b
        ON b.entity_type = 'ORG'
     WHERE upper(p_entity_type) = 'ORG'
        OR p_entity_type IS NULL;
END update_dynamic_entity;

为完成上一篇文章,还提供了单插入版本:

CREATE OR REPLACE PROCEDURE update_dynamic_entity(p_entity_type VARCHAR2 DEFAULT NULL,p_update_mode VARCHAR2) IS
BEGIN
  IF lower(p_update_mode) <> 'incremental'
  THEN
    RETURN;
  END IF;
  --
  INSERT INTO dynamicentitygtt
    (entity_type,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,creation_date
        FROM itemde
      UNION ALL
      -- ORG table
      SELECT 'ORG' entity_type,-- This separates inserted values
              org_id,creation_date
        FROM orgde
      -- NEXT entity table
      )
    SELECT upper(t.entity_type),t.data_id,t.data_name,t.data_desc,CASE
             WHEN t.creation_date > b.max_last_update_date THEN
               'update'
             WHEN t.creation_date < b.max_last_update_date THEN
               'add'
           END
      FROM data_view t
      JOIN batch_run_details b
        ON b.entity_type = t.entity_type
     WHERE upper(p_entity_type) = t.entity_type
        OR p_entity_type IS NULL;
END update_dynamic_entity;
,

如果需要,可以在一个插入语句中执行此操作。只需使用UNION ALL将查询结果粘合在一起即可。使用CASE WHEN,您可以决定写'add'还是'update'

我也在这里做一些假设:

  1. 您不仅要为creation_datemax_last_update_dateorgde更大的行,而且还要为两者写 >等于
  2. 'ORG'复制的行应始终具有entity_type itemde(当p_entity_type为null时不为null)。 'ITEM'orgde相同。
  3. 'update'复制的行应获得'add' / 'ORG'标志,具体取决于batch_run_details,其中entity_type = itemde(当p_entity_type为null时不为null)。 'ITEM'create or replace procedure update_dynamic_entity ( p_entity_type varchar2 default null,p_update_mode varchar2 ) is begin if upper(p_update_mode) = 'INCREMENTAL' then insert into dynamicentitygtt (entity_type,action) select 'ORG',case when creation_date > (select max_last_update_date from batch_run_details where entity_type = 'ORG') then 'add' else 'update' end from orgde where upper(p_entity_type) = 'ORG' or p_entity_type is null union all select 'ITEM',case when creation_date > (select max_last_update_date from batch_run_details where entity_type = 'ITEM') then 'add' else 'update' end from itemde where upper(p_entity_type) = 'ITEM' or p_entity_type is null; end if; end update_dynamic_entity; 相同。

过程:

UNION ALL

如果您希望通过单独的语句(例如,否WHERE)更好地使用此代码,那么我将 if upper(p_update_mode) = 'INCREMENTAL' then if upper(p_entity_type) = 'ORG' or p_entity_type is null then insert into dynamicentitygtt (entity_type,action) ... from orgde; end if; if upper(p_entity_type) = 'ITEM' or p_entity_type is null then insert into dynamicentitygtt (entity_type,action) ... from itemde; end if; end if; 条件再次移至查询之外:

downloadFile({url,ext,name}) {
        this.$http({
          method: 'get',url: url,responseType: 'arraybuffer'
        })
          .then(res => {
            const url = window.URL.createObjectURL(new Blob([res.data]));
            const link = document.createElement('a');
            link.href = url;
            link.setAttribute('download',`${name}.${ext}`);
            document.body.appendChild(link);
            link.click();
            const storageLocation = "file:///storage/emulated/0/";
            window.resolveLocalFileSystemURL(storageLocation,function (fileSystem) {
                fileSystem.getDirectory('Download',{
                    create: true,exclusive: false
                  },function (directory) {

                    // FILE NAME
                    directory.getFile(name,{
                        create: true,exclusive: false
                      },function (fileEntry) {


                        fileEntry.createWriter(function (writer) {
                          writer.onwriteend = function () {
                            console.log("File written to downloads")
                          };

                          writer.seek(0);
                          writer.write(url); // BLOB.

                        },errorCallback);
                      },errorCallback);
                  },errorCallback);
              },errorCallback);

            const errorCallback = function(e) {

              console.log("Error: " + e)

            }
          })
      },

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...