Client_OLE2 работает медленно на формах оракула - PullRequest
0 голосов
/ 09 мая 2019

Я создал процедуру с Client_OLE2 для загрузки данных из файла "CSV" в формы оракула.Это займет от 30 до 35 секунд.У меня всего 117 записей в файле "CSV". Если я загружу тысячи записей, это может занять больше времени.Могу ли я повысить производительность своего кода?

КОД:

 PROCEDURE EXCEL_UPLOAD IS

application   Client_OLE2.Obj_Type; 
workbooks     Client_OLE2.Obj_Type; 
workbook      Client_OLE2.Obj_Type; 
worksheets    Client_OLE2.Obj_Type; 
worksheet     Client_OLE2.Obj_Type;
worksheet2    Client_OLE2.Obj_Type; 
cell                    Client_OLE2.OBJ_TYPE;
args                    Client_OLE2.OBJ_TYPE;
cell_value      varchar2(100);
num_wrkshts     NUMBER;
wksht_name      VARCHAR2(250);
j                       integer:=1;
eod                     boolean:=false;

 BEGIN 
-- Get the name of the file to open
--v_fName := 'D:\MyDevelopment\Forms\Samples\WebUtil\Read_Excel\planets3.xls';


    -- The following sets up communication with the excel spreadsheet
    -- --------------------------------------------------------------
    -- Open the OLE application
    application := Client_OLE2.create_obj('Excel.Application'); 
    -- Keep the application hidden
    Client_OLE2.set_property(application,'Visible','false');

    workbooks := Client_OLE2.Get_Obj_Property(application, 'Workbooks');
    args := Client_OLE2.CREATE_ARGLIST;

    -- Open the selected File
    -- ----------------------
    Client_OLE2.add_arg(args,:WE_GROUP.FILE); 
    workbook := Client_OLE2.GET_OBJ_PROPERTY(workbooks,'Open',args);
    Client_OLE2.destroy_arglist(args);

    worksheets := Client_OLE2.GET_OBJ_PROPERTY(workbook, 'Worksheets');

    -- Get number of worksheets
    -- ------------------------
    num_wrkshts := Client_OLE2.GET_NUM_PROPERTY(worksheets, 'Count');
    worksheet := Client_OLE2.GET_OBJ_PROPERTY(application,'activesheet');

    --Go to the first record
    go_block('we_group_hof_k'); 
    first_record; 

    loop
            If :system.record_status <> 'NEW' then
             create_record;
            end if;

    exit when eod;

        for k in 1..28 loop
            args:= Client_OLE2.create_arglist;
            Client_OLE2.add_arg(args, j);
            Client_OLE2.add_arg(args, k);
            cell:= Client_OLE2.get_obj_property(worksheet, 'Cells', args);
            Client_OLE2.destroy_arglist(args);
            cell_value :=Client_OLE2.get_char_property(cell, 'Value');

            if upper(cell_value) = 'EOD' then
                eod:=true;
                Message('End of Data');
                exit;
            end if;

    --Could be done this way also -> 

    if k =1 then
        IF cell_value = 'null' THEN
            :we_group_hof_k.clientid := '';
        ELSE
        :we_group_hof_k.clientid := TO_NUMBER(cell_value);
        END IF;
    end if;

    if k =2 then
        IF cell_value = 'null' THEN
            :we_group_hof_k.projectid := '';
        ELSE
        :we_group_hof_k.projectid := TO_NUMBER(cell_value);
        END IF;
    end if;

    if k =3 then
        IF cell_value = 'null' THEN
            :we_group_hof_k.GROUP_HOF_ID := '';
        ELSE
        :we_group_hof_k.GROUP_HOF_ID:=cell_value;
        END IF;
    end if;

    if k =4 then
        IF cell_value = 'null' THEN
            :we_group_hof_k.NRSP_HOFID := '';
        ELSE
        :we_group_hof_k.NRSP_HOFID:=cell_value;
        END IF;
    end if;

    if k =5 then
        IF cell_value = 'null' THEN
            :we_group_hof_k.HOF_NAME := '';
        ELSE
        :we_group_hof_k.HOF_NAME:=cell_value;
        END IF;
    end if;

    if k =6 then
        IF cell_value = 'null' THEN
            :we_group_hof_k.FATHER_NAME := '';
        ELSE
        :we_group_hof_k.FATHER_NAME:=cell_value;
        END IF;
    end if;

    if k = 7 then
        IF cell_value = 'null' AND :we_group.DISPLAY IS NOT NULL THEN
            :we_group_hof_k.CNIC_NO := '';
        ELSE
        :we_group_hof_k.CNIC_NO:= SUBSTR(cell_value,1,13);
        END IF;
    end if;

    if k =8 then
        IF cell_value = 'null' THEN
            :we_group_hof_k.GENDID := '';
        ELSE
        :we_group_hof_k.GENDID:=cell_value;
        END IF;
    end if;

    if k =9 then
        IF cell_value = 'null' THEN
            :we_group_hof_k.RID := '';
        ELSE
        :we_group_hof_k.RID:=cell_value;
        END IF;
    end if;

    if k =10 then
        IF cell_value = 'null' THEN
            :we_group_hof_k.MSTATUSID := '';
        ELSE
        :we_group_hof_k.MSTATUSID:=cell_value;
        END IF;
    end if;

    if k =11 then
        IF cell_value = 'null' THEN
            :we_group_hof_k.MOH_STREET := '';
        ELSE
        :we_group_hof_k.MOH_STREET:=cell_value;
        END IF;
    end if;

    if k =12 then
        IF cell_value = 'null' THEN
            :we_group_hof_k.VILLAGE_ID := '';
        ELSE
        :we_group_hof_k.VILLAGE_ID:=cell_value;
        END IF;
    end if;

    if k =13 then
        IF cell_value = 'null' THEN
            :we_group_hof_k.UCID := '';
        ELSE
        :we_group_hof_k.UCID:=cell_value;
        END IF;
    end if;

    if k =14 then
        IF cell_value = 'null' THEN
            :we_group_hof_k.CITYID := '';
        ELSE
        :we_group_hof_k.CITYID:=cell_value;
        END IF;
    end if;

    if k =15 then
        IF cell_value = 'null' THEN
            :we_group_hof_k.DISTTID := '';
        ELSE
        :we_group_hof_k.DISTTID := TO_NUMBER(cell_value);
        END IF;
    end if;

    if k =16 then
        IF cell_value = 'null' THEN
            :we_group_hof_k.STATEID := '';
        ELSE
        :we_group_hof_k.STATEID:=cell_value;
        END IF;
    end if;

    if k =17 then
        IF cell_value = 'null' THEN
            :we_group_hof_k.COUNTRYID := '';
        ELSE
        :we_group_hof_k.COUNTRYID := TO_NUMBER(cell_value);
        END IF;
    end if;

    if k =18 then
        IF cell_value = 'null' THEN
            :we_group_hof_k.NO_OF_FAMILY_MEMBER := '';
        ELSE
        :we_group_hof_k.NO_OF_FAMILY_MEMBER:=cell_value;
        END IF;
    end if;

    if k =19 then
        IF cell_value = 'null' THEN
            :we_group_hof_k.NRSP_STATUS := '';
        ELSE
        :we_group_hof_k.NRSP_STATUS:=cell_value;
        END IF;
    end if;

    if k =20 then
        IF cell_value = 'null' THEN
            :we_group_hof_k.CONTACTNO := '';
        ELSE
        :we_group_hof_k.CONTACTNO := SUBSTR(cell_value,1,10);
        END IF;
    end if;

    if k =21 then
        IF cell_value = 'null' THEN
            :we_group_hof_k.DOB := '';
            elsif cell_value LIKE '%KT%'
                then :we_group_hof_k.DOB := TO_CHAR(TO_DATE(cell_value,'Dy Mon DD HH24:MI:SS "PKT" YYYY'),'DD-MON-YYYY');
            else
                :we_group_hof_k.DOB := TO_CHAR(TO_DATE(cell_value,'Dy Mon DD HH24:MI:SS "PKST" YYYY'),'DD-MON-YYYY');
            end if;
            end if;

    if k =22 then
        IF cell_value = 'null' THEN
            :we_group_hof_k.CARDNO := '';
        ELSE
        :we_group_hof_k.CARDNO:=cell_value;
        END IF;
    end if;

    if k =23 then
        IF cell_value = 'null' THEN
            :we_group_hof_k.URN := '';
        ELSE
        :we_group_hof_k.URN := SUBSTR(cell_value,1,14);
        END IF;
    end if;

    if k =24 then
        IF cell_value = 'null' THEN
            :we_group_hof_k.ISENROLLED := '';
        ELSE
        :we_group_hof_k.ISENROLLED:=cell_value;
        END IF;
    end if;

    if k =25 then
        IF cell_value = 'null' THEN
            :we_group_hof_k.ENROLLDATE := '';
        elsif cell_value LIKE '%KT%'
                then :we_group_hof_k.ENROLLDATE := TO_CHAR(TO_DATE(cell_value,'Dy Mon DD HH24:MI:SS "PKT" YYYY'),'DD-MON-YYYY');
            else
                :we_group_hof_k.ENROLLDATE := TO_CHAR(TO_DATE(cell_value,'Dy Mon DD HH24:MI:SS "PKST" YYYY'),'DD-MON-YYYY');
            end if;
            end if;

    if k =26 then
        IF cell_value = 'null' THEN
            :we_group_hof_k.STARTDATE := '';
    elsif cell_value LIKE '%KT%'
                then :we_group_hof_k.STARTDATE := TO_CHAR(TO_DATE(cell_value,'Dy Mon DD HH24:MI:SS "PKT" YYYY'),'DD-MON-YYYY');
            else
                :we_group_hof_k.STARTDATE := TO_CHAR(TO_DATE(cell_value,'Dy Mon DD HH24:MI:SS "PKST" YYYY'),'DD-MON-YYYY');
            end if;
            end if;

    if k =27 then
        IF cell_value = 'null' THEN
            :we_group_hof_k.EXPDATE := '';
        elsif cell_value LIKE '%KT%'
                then :we_group_hof_k.EXPDATE := TO_CHAR(TO_DATE(cell_value,'Dy Mon DD HH24:MI:SS "PKT" YYYY'),'DD-MON-YYYY');
            else
                :we_group_hof_k.EXPDATE := TO_CHAR(TO_DATE(cell_value,'Dy Mon DD HH24:MI:SS "PKST" YYYY'),'DD-MON-YYYY');
            end if;
            end if;

    if k =28 then
        IF cell_value = 'null' THEN
            :we_group_hof_k.CARDSTATUS := '';
        ELSE
        :we_group_hof_k.CARDSTATUS:=cell_value;
        END IF;
    end if;

            --Less code this way ->
            --copy(cell_value,name_in('system.cursor_item'));
        --  next_item;

        end loop; --for

        j:=j+1;
    end loop;--main loop

    -- Release the Client_OLE2 object handles
    IF (cell IS NOT NULL) THEN 
        Client_OLE2.release_obj(cell);
    END IF;
    IF (worksheet IS NOT NULL) THEN 
        Client_OLE2.release_obj(worksheet);
    END IF;
    IF (worksheets IS NOT NULL) THEN 
        Client_OLE2.release_obj(worksheets);
    END IF;
    IF (worksheet2 IS NOT NULL) THEN 
        Client_OLE2.release_obj(worksheet2);
    END IF;
    IF (workbook IS NOT NULL) THEN 
        Client_OLE2.release_obj(workbook);
    END IF;
    IF (workbooks IS NOT NULL) THEN 
        Client_OLE2.release_obj(workbooks);
    END IF;
    Client_OLE2.invoke(application,'Quit');
    Client_OLE2.release_obj(application);

 END;

Я использую Webutil с Oracle Forms 11g

...