Purpose:
To create dynamic DML in real time and execute it with multiple criteria.
In this practice we only create Insert command and execute it in the Block.
   
To create dynamic DML in real time and execute it with multiple criteria.
In this practice we only create Insert command and execute it in the Block.
---SampleTable
CREATE TABLE SAMPLETABLE
(
  ITEMCODE NUMBER(4),
  ITEMNAME VARCHAR2(100),
  DEPTNO   NUMBER(3),
  DNAME    VARCHAR2(100),
  STOCK    NUMBER
);
---SampleTable
---Sample Records for SampleTable
insert into Sampletable (ITEMCODE,
ITEMNAME, DEPTNO, DNAME, STOCK)
values (1001, 'Item 1', 111, 'Department 111', 21);
insert into Sampletable (ITEMCODE,
ITEMNAME, DEPTNO, DNAME, STOCK)
values (1002, 'Item 2', 111, 'Department 111', 44);
insert into Sampletable (ITEMCODE,
ITEMNAME, DEPTNO, DNAME, STOCK)
values (1003, 'Item 3', 111, 'Department 111', 400);
insert into Sampletable (ITEMCODE,
ITEMNAME, DEPTNO, DNAME, STOCK)
values (1004, 'Item 4', 111, 'Department 111', 235);
insert into Sampletable (ITEMCODE,
ITEMNAME, DEPTNO, DNAME, STOCK)
values (1005, 'Item 5', 112, 'Department 112', 567);
insert into Sampletable (ITEMCODE,
ITEMNAME, DEPTNO, DNAME, STOCK)
values (1006, 'Item 6', 112, 'Department 112', 11);
insert into Sampletable (ITEMCODE,
ITEMNAME, DEPTNO, DNAME, STOCK)
values (1007, 'Item 2', 112, 'Department 112', 234);
insert into Sampletable (ITEMCODE,
ITEMNAME, DEPTNO, DNAME, STOCK)
values (1008, 'Item 1', 112, 'Department 112', 0);
insert into Sampletable (ITEMCODE,
ITEMNAME, DEPTNO, DNAME, STOCK)
values (1001, 'Item 1', 113, 'Department 113', 21);
insert into Sampletable (ITEMCODE,
ITEMNAME, DEPTNO, DNAME, STOCK)
values (1002, 'Item 2', 113, 'Department 113', 44);
insert into Sampletable (ITEMCODE,
ITEMNAME, DEPTNO, DNAME, STOCK)
values (1003, 'Item 3', 113, 'Department 113', 400);
insert into Sampletable (ITEMCODE,
ITEMNAME, DEPTNO, DNAME, STOCK)
values (1004, 'Item 4', 113, 'Department 113', 235);
insert into Sampletable (ITEMCODE,
ITEMNAME, DEPTNO, DNAME, STOCK)
values (1005, 'Item 5', 113, 'Department 113', 567);
insert into Sampletable (ITEMCODE,
ITEMNAME, DEPTNO, DNAME, STOCK)
values (1006, 'Item 6', 113, 'Department 113', 11);
insert into Sampletable (ITEMCODE,
ITEMNAME, DEPTNO, DNAME, STOCK)
values (1007, 'Item 2', 113, 'Department 113', 234);
insert into Sampletable (ITEMCODE,
ITEMNAME, DEPTNO, DNAME, STOCK)
values (1008, 'Item 1', 113, 'Department 113', 0);
---Sample Records for SampleTable
---Dynamic_DML_LOG
Create Table
Dynamic_DML_LOG(
Date$        Date Default Sysdate,
StartOn      Number(6) Default To_Char(Sysdate,'hhmiss'),
EndsOn       Number(6) ,
Remarks      Varchar2(4000)
);
---Dynamic_DML_LOG
--Dynamic_DML Procedure
Create Or Replace Procedure
Dynamic_Dml(Table_Name  Varchar2,
                                       
Column_Name Varchar2,
                                       
Criteria    Varchar2,
                                       
Switchto    Varchar2) Is
  Vtab       Varchar2(4000) := Upper(Table_Name);
  Vcol       Varchar2(4000) := Upper(Column_Name);
  Vcriteria  Varchar2(4000) := Criteria;
  Vswitchto  Varchar2(4000) := Switchto;
  Cntr       Number := 0;
  Chk_Tab    Number := 0;
  Chk_Col    Number := 0;
  Val        Varchar2(4000);
  Verrors    Varchar2(4000);
  Start_Time Number := 0;
  End_Time   Number := 0;
  Cursor c(Tab_Name Varchar2) Is
    Select t.Column_Name
      From User_Tab_Cols t
     Where t.Table_Name =
Tab_Name
     Order By t.Column_Id;
Begin
  Start_Time := To_Char(Sysdate, 'hhmiss');
  ---checking table existance
  Select Count(*)
    Into Chk_Tab
    From User_Tab_Cols t
   Where t.Table_Name = Vtab;
  If Chk_Tab = 0 Then
    Verrors  := 'Table
Not Found In DataBase';
    End_Time := To_Char(Sysdate, 'hhmiss');
    Insert Into Dynamic_Dml_Log
      (Date$, Starton, Endson,
Remarks)
    Values
      (Sysdate,
       Start_Time,
       End_Time,
       'Error with Table=' ||
Vtab || ' Column=' || Vcol || '
Criteria=' ||
       Vcriteria || ' Value Switch To=' ||
Vswitchto || ' :: ' || Verrors);
  End If;
  ---checking table existance
  ---checking column existance  
  If Chk_Tab > 0 Then
    Select Count(*)
      Into Chk_Col
      From User_Tab_Cols t
     Where t.Table_Name =
Vtab
       And t.Column_Name = Vcol;
    If Chk_Col = 0 Then
      Verrors  := 'Coulmn
Not Found In Table';
      End_Time := To_Char(Sysdate, 'hhmiss');
      Insert Into Dynamic_Dml_Log
        (Date$, Starton, Endson,
Remarks)
      Values
        (Sysdate,
         Start_Time,
         End_Time,
         'Error with Table=' ||
Vtab || ' Column=' || Vcol || '
Criteria=' ||
         Vcriteria || ' Value Switch To=' ||
Vswitchto || ' :: ' || Verrors);
    End If;
  End If;
  ---checking column existance  
  If Chk_Tab > 0 And Chk_Col > 0 Then
    Val := 'INSERT INTO ' ||
Vtab || '(';
    ---LOOP FOR INSERT TO TABLE COLUMNS
    For i In c(Vtab) Loop
      Val := Val || Chr(10) ||
i.Column_Name || ',';
    End Loop;
    Val := Substr(Val, 1, Instr(Val, ',', -1) - 1);
    Val := Val || Chr(10) ||
')' || Chr(10) ||
' 
SELECT';
    ---LOOP FOR INSERT VALUES FROM TABLE COLUMNS
    For v In c(Vtab) Loop
      If Vcol = v.Column_Name Then
        Val := Val || Chr(10) ||
q'<'>' || Vswitchto || q'<'>' || ',';
      Else
        Val := Val || Chr(10) ||
v.Column_Name || ',';
      End If;
    End Loop;
    Val := Substr(Val, 1, Instr(Val, ',', -1) - 1);
    Val := Val || Chr(10) ||
' FROM ' || Vtab || ' Where ' || Vcol || '=' ||
           q'<'>' || ':$CriValue$' || q'<'>';
    Val := Replace(Val, ':$CriValue$',
Vcriteria);
    Execute Immediate (Val);
    End_Time := To_Char(Sysdate, 'hhmiss');
    Insert Into Dynamic_Dml_Log
      (Date$, Starton, Endson,
Remarks)
    Values
      (Sysdate,
       Start_Time,
       End_Time,
       'Record(s) Inserted Successfully Table=' || Vtab || '
Column=' || Vcol ||
       ' Criteria=' ||
Vcriteria || ' Value Switch To=' || Vswitchto);
  End If;
Exception
  When Others Then
    Verrors  := Sqlerrm;
    End_Time := To_Char(Sysdate, 'hhmiss');
    Insert Into Dynamic_Dml_Log
      (Date$, Starton, Endson,
Remarks)
    Values
      (Sysdate,
       Start_Time,
       End_Time,
       'Error with Table=' ||
Vtab || ' Column=' || Vcol || '
Criteria=' ||
       Vcriteria || ' Value Switch To=' ||
Vswitchto || ' :: ' || Verrors);
End;
/
--Dynamic_DML Procedure
Select * From Sampletable;
---------------------------------------------------
Begin 
  Dynamic_DML('Sampletable','ITEMcode','1001','1000'); 
  Commit; 
End;
/
---------------------------------------------------
Select * From Sampletable;
Select * From Dynamic_DML_LOG;
No comments:
Post a Comment