Powered By Blogger

শুক্রবার, ২৮ অক্টোবর, ২০২২

Number/ Numeric allowed only in oracle apex item/ Column

-- paste this code in execute when page load option of the page & change the item name as required.

$("#P37_COLLECTION").keypress(function(event){ 

    event = (event) ? event : window.event;

    if ( event.which != 0 && (event.which < 48 || event.which > 57) && (event.which != 46 || $(this).val().indexOf('.') != -1)){    

       return false;

    }

    return true;

});


-- For grid column

$(".only-numeric").bind("keypress", function (e) {
    var keyCode = e.which ? e.which : e.keyCode               
    if (!(keyCode >= 48 && keyCode <= 57)) {
      return false;
    }else{
      return true;
-- set class to the expected item

in css only-numeric
    }
});

বৃহস্পতিবার, ২৭ অক্টোবর, ২০২২

Scroll bar in apex interactive report

Put this code in html header of region for vertical scrollbar

 <div style="overflow: auto; overflow-x:hidden; height: 350px; width: 650px;" > 

for both horizontal and vertical scrollbar 

<div style="overflow: auto; height: 350px; width: 550px;" 

বুধবার, ১৯ অক্টোবর, ২০২২

Script Creator script specially for json procedure

 select FNC_SEQ_SCRIPT(:TABLE_NAME) FROM DUAL;


-- TO SELECT COLUMN NAME

SELECT column_name||','

  FROM user_tab_cols

 WHERE table_name = :TABLE_NAME

 order by column_id;

 

 --INSERT SATEMENT

 SELECT 'v'||column_name||','

  FROM user_tab_cols

 WHERE table_name = :TABLE_NAME

 order by column_id;

 

 -- UPDATING COLUMN NAME AND vCOLUMN NAME

 SELECT column_name||'=v' ||column_name||','

  FROM user_tab_cols

 WHERE table_name = :TABLE_NAME

 order by column_id;

 

 SELECT column_name||','

  FROM user_tab_cols

 WHERE table_name = :TABLE_NAME

 order by column_id;

 

 --calling procedure variable value ASSIGN json

  SELECT '"' || LOWER(COLUMN_NAME) || '":' || 'null,'

    FROM user_tab_cols

   WHERE table_name = :TABLE_NAME

ORDER BY column_id;


  SELECT COLUMN_NAME || ':' || column_name || ','

    FROM user_tab_cols

   WHERE table_name = :TABLE_NAME

ORDER BY column_id;


  SELECT COLUMN_NAME || '=' || 'v' || column_name || ','

    FROM user_tab_cols

   WHERE table_name = :TABLE_NAME

ORDER BY column_id;


-- ASSINGING VARIABLE VALUE

  SELECT 'v' || column_name || ','

    FROM user_tab_cols

   WHERE table_name = :TABLE_NAME

ORDER BY column_id;


-- PROCEDURE CALLING SCRIPT

  SELECT '"' || COLUMN_NAME || '":' || '"NULL",'

    FROM user_tab_cols

   WHERE table_name = :TABLE_NAME

ORDER BY column_id;


  SELECT 'v' || column_name || ':= vMANUFACTURER_OBJ.GET_NUMBER (' || ','

    FROM user_tab_cols

   WHERE table_name = :TABLE_NAME

ORDER BY column_id;


SELECT CASE WHEN :data_type = 'DATE' THEN '' END FROM DUAL;


  SELECT    'P_'

         || column_name

         || ' '

         || data_type

         || CASE

                WHEN DATA_TYPE NOT IN ('DATE', 'NUMBER')

                THEN

                    '(' || data_length || ');'

                ELSE

                    ';'

            END

    FROM user_tab_cols

   WHERE table_name = :TABLE_NAME

ORDER BY column_id;


SELECT    'v'

         || column_name

         || ' '

         || data_type

         || CASE

                WHEN DATA_TYPE NOT IN ('DATE', 'NUMBER')

                THEN

                    '(' || data_length || ');'

                ELSE

                    ';'

            END

    FROM user_tab_cols

   WHERE table_name = :TABLE_NAME

ORDER BY column_id;


-- to assign value in json declaration

SELECT    'v'

         || column_name

         || ':= '

         || CASE

                WHEN DATA_TYPE = 'DATE' THEN 'TO_DATE(' || :PARAMETER_OBJ

                ELSE :PARAMETER_OBJ

            END

         || '.'

         || CASE

                WHEN DATA_TYPE = 'NUMBER'

                THEN

                    'GET_NUMBER (''' || LOWER (column_name) || ''');'

                WHEN DATA_TYPE = 'VARCHAR2'

                THEN

                    'GET_STRING (''' || LOWER (column_name) || ''');'

                WHEN DATA_TYPE = 'DATE'

                THEN

                       'GET_STRING ('''

                    || LOWER (column_name)

                    || ''')'

                    || ','

                    || '''dd-mm-rrrr'''

                    || ');'

            END

    FROM user_tab_cols

   WHERE table_name = :TABLE_NAME

ORDER BY column_id;


--- CALLING A JSON PROCEDURE

declare

    vstatus              clob;

    preg_id              varchar2(100);

    phims_registration   clob := '{ "HIMS_REGISTRATION":[

                                  { 

                                    "reg_date":"16-OCT-2022",

                                    "pat_type_no":101,

                                    "salutation":null,

                                    "fname":"Kafil",

                                    "mname":"Uddin",

                                    "lname":null,

                                    "pname":null,

                                    "gender":"M",

                                    "mstatus":null,

                                    "bloodgroup":null,

                                    "religion":null,

                                    "father_name":null,

                                    "mother_name":null,

                                    "spouse_name":null,

                                    "dob":"10-OCT-1988",

                                    "phone_tnt":null,

                                    "phone_mobile":null,

                                    "email":null,

                                    "address":null,

                                    "passport_no":null,

                                    "nationality":null,

                                    "nid":null,

                                    "emp_id":null,

                                    "cc_id":null,

                                    "relation_id":null,

                                    "cc_card_no":null,

                                    "height_cm":null,

                                    "weight_kg":null,

                                    "contact_person_name":null,

                                    "contact_relation":null,

                                    "contact_phone":null,

                                    "contact_mobile":null,

                                    "contact_email":null,

                                    "image_file_name":null,

                                    "johndoe_flag":null,

                                    "vip_flag":null,

                                    "conceal_flag":null,

                                    "company_id":1,

                                    "location_id":1

                                  }

                                ]

                                }';

begin

    dprc_registration (phims_registration, preg_id, 1, vstatus);

    dbms_output.put_line ('vSTATUS > ' || vstatus);

exception

    when others

    then

        dbms_output.put_line (sqlerrm);

end;


-- Calling procedure for admission

DECLARE

    vstatus         CLOB;

    vADM_NO         VARCHAR2 (50);

    preg_no         VARCHAR2 (100) := 'DNAR000009';

    pHIMS_IPD_ADM   CLOB := '{ "HIMS_IPD_ADM":[

                                  { 

                                    "adm_date":"17-oct-22",

                                    "ref_doctor_id":2,

                                    "admitted_doctor_id":2,

                                    "duty_doctor_id":2,

                                    "bed_id":5,

                                    "pat_type_no":null,

                                    "dept_id":null,

                                    "remarks":null,

                                    "dis_req_flag":null,

                                    "dis_req_by":null,

                                    "dis_req_time":null,

                                    "clearence_flag":null,

                                    "clearence_date":null,

                                    "fin_clear_flag":null,

                                    "fin_clear_by":null,

                                    "fin_clear_time":null,

                                    "dis_flag":null,

                                    "dis_by":null,

                                    "dis_date":null,

                                    "due_dis_flag":null,

                                    "ref_adm_module_id":null,

                                    "ref_adm_id":null,

                                    "mother_adm_id":null,

                                    "emp_id":null,

                                    "cc_id":null,

                                    "relation_id":null,

                                    "cc_card_no":null,

                                    "mkt_person_id":null,

                                    "company_id":1,

                                    "location_id":1

                                  }

                                ]

                                }';

BEGIN

    dprc_IPD_ADM (pHIMS_IPD_ADM, vADM_NO,   preg_no,  1, vstatus);

    DBMS_OUTPUT.put_line ('vSTATUS > ' || vstatus);

EXCEPTION

    WHEN OTHERS

    THEN

        DBMS_OUTPUT.put_line (SQLERRM);

END;


DECLARE

    v_seq_no   VARCHAR2 (50);

BEGIN

    PRC_GLOBAL_SEQUENCE ( 'HIMS',

                         'HIMS_REGISTRATION',

                         SYSDATE,

                         v_seq_no);

    DBMS_OUTPUT.put_line ('Sequence No' || v_seq_no);

END;



SET SERVEROUTPUT ON


DECLARE

    vstatus             CLOB;

    vINV_NO             VARCHAR2 (100);

    vBILL_INVOICE_MST   CLOB := '{ "bill_invoice_mst":[

                                  { 

                                    "module_id":1,

                                    "reg_id":13,

                                    "adm_id":8,

                                    "cons_id":2,

                                    "invoice_date":"18-oct-22",

                                    "remarks":"Checking bill for detail.",

                                    "cancel_flag":0,

                                    "cancel_remarks":null,

                                    "ref_doc_id":2,

                                    "del_date":null,

                                    "emp_id":null,

                                    "cc_id":null,

                                    "relation_id":null,

                                    "cc_card_no":null,

                                    "company_id":1,

                                    "location_id":1

                                  }

                                ]

                                }';

 vBILL_INVOICE_DTL   CLOB := '{ "BILL_INVOICE_DTL":[

                                  { 

                                    "item_id":1,

                                    "item_name":"REGISTRATION FEE",

                                    "itemtype_id":1,

                                    "item_qty":1,

                                    "item_rate":100,

                                    "item_vat":null,

                                    "urgent_fee":null,

                                    "service_charge":null,

                                    "cancel_flag":null,

                                    "cancel_qty":null,

                                    "reentry_flag":null,

                                    "del_date":null,

                                    "del_status_id":null,

                                    "company_id":1,

                                    "location_id":1

                                  }

                                ]

                                }';  

                                 

BEGIN

    DPRC_BILL_INVOICE (vBILL_INVOICE_MST,vBILL_INVOICE_DTL, vINV_NO, 1, vstatus);

    DBMS_OUTPUT.put_line ('vSTATUS > ' || vstatus);

EXCEPTION

    WHEN OTHERS

    THEN

        DBMS_OUTPUT.put_line (SQLERRM);

END;


SET SERVEROUTPUT ON;


DECLARE

    vstatus             CLOB;

    vINV_NO             NUMBER;

    vBILL_INVOICE_MST   CLOB := '{ "bill_pay_mst":[

                                  { 

                                    "id":null,

                                    "reg_id":13,

                                    "adm_id":null,

                                    "invoice_id":null,

                                    "module_id":1,

                                    "pay_date":"19-oct-22",

                                    "pay_type_id":8352,

                                    "pay_mode_id":null,

                                    "coll_mode_id":null,

                                    "pay_amt":550,

                                    "pay_remarks":null,

                                    "given_amt":null,

                                    "disc_type_id":null,

                                    "disc_auth_by":null,

                                    "disc_remarks":null,

                                    "status":null,

                                    "created_by":null,

                                    "created_on":null,

                                    "updated_by":null,

                                    "updated_on":null,

                                    "company_id":1,

                                    "location_id":1

                                  }

                                ]

                                }';

 vBILL_INVOICE_DTL   CLOB := '{ "BILL_PAY_DTL":[

                                  { 

                                  "id":null,

                                    "pay_id":null,

                                    "item_id":1,

                                    "his_amt":null,

                                    "his_ref":null,

                                    "ref_amt":null,

                                    "ref_ref":null,

                                    "disc_type_id":null,

                                    "status":null,

                                    "created_by":null,

                                    "created_on":null,

                                    "updated_by":null,

                                    "updated_on":null,

                                    "company_id":1,

                                    "location_id":1

                                  }

                                ]

                                }';  

                                 

BEGIN

    DPRC_BILL_COLLECTION (vBILL_INVOICE_MST,vBILL_INVOICE_DTL, vINV_NO, 1, vstatus);

    DBMS_OUTPUT.put_line ('vSTATUS > ' || vstatus);

EXCEPTION

    WHEN OTHERS

    THEN

        DBMS_OUTPUT.put_line (SQLERRM);

END;

Function to create table script & necessary primary info with table name parameter

 CREATE OR REPLACE FUNCTION fnc_table_script (p_table_name VARCHAR2)
    RETURN VARCHAR2
IS
    V_SCRIPT   VARCHAR2 (4000);
BEGIN
    SELECT    'CREATE TABLE '
           || P_TABLE_NAME
           || '(  
  ID                NUMBER(10),
  UDID         VARCHAR2(30),
  STATUS            NUMBER(1),
  CREATED_BY        NUMBER(10),
  CREATED_ON        DATE,
  UPDATED_BY        NUMBER(10),
  UPDATED_ON        DATE,
  COMPANY_NO        NUMBER(10),
  BRANCH_NO   NUMBER(10)
);'
           || CHR (10)
           || '
CREATE SEQUENCE '
           || P_TABLE_NAME
           || '_ID_SEQ'
           || '
START WITH 1
INCREMENT BY 1
MINVALUE 0
NOCACHE 
NOCYCLE 
NOORDER;'
           || CHR (10)
           || '
CREATE OR REPLACE TRIGGER '
           || P_TABLE_NAME
           || '_TRG
BEFORE INSERT OR UPDATE
ON '
           || P_TABLE_NAME
           || ' 
REFERENCING NEW AS New OLD AS Old
FOR EACH ROW
DECLARE
BEGIN
   
   IF INSERTING THEN
    IF :NEW.ID IS NULL THEN
    :NEW.ID := '
           || P_TABLE_NAME
           || '_ID_SEQ.NEXTVAL;
    END IF;
    :NEW.CREATED_ON := SYSDATE;
    :NEW.CREATED_BY := FNC_USER_ID(''APP_USER'');
   
   
   ELSIF UPDATING THEN
   
    :NEW.UPDATED_ON := SYSDATE;
    :NEW.UPDATED_BY := FNC_USER_ID(''APP_USER'');
   
   END IF;
   
   EXCEPTION
     WHEN OTHERS THEN
       RAISE;
END '
           || P_TABLE_NAME
           || '_TRG;
/'
           || '
CREATE UNIQUE INDEX '
           || P_TABLE_NAME
           || '_PK ON '
           || P_TABLE_NAME
           || '
(ID);
ALTER TABLE '
           || P_TABLE_NAME
           || ' '
           || ' ADD (
  CONSTRAINT '
           || P_TABLE_NAME
           || '_PK'
           || '
  PRIMARY KEY
  (ID)
  USING INDEX '
           || P_TABLE_NAME
           || '_PK
  ENABLE VALIDATE);
  
CREATE OR REPLACE PUBLIC SYNONYM '
           || P_TABLE_NAME
           || ' FOR '
           || P_TABLE_NAME
           || ';
'
      INTO V_SCRIPT
      FROM DUAL;
      RETURN V_SCRIPT;
END;
/

Function to create sequence script associate with table name

 CREATE OR REPLACE FUNCTION fnc_seq_script (p_table_name VARCHAR2)

    RETURN VARCHAR2

IS

    V_SCRIPT   VARCHAR2 (4000);

BEGIN

    SELECT    'CREATE SEQUENCE '

           || 'S_'

           || P_TABLE_NAME

           || '_ID'

           || '

START WITH 1

INCREMENT BY 1

MINVALUE 0

NOCACHE 

NOCYCLE 

NOORDER;'

           || CHR (10)

           || '

CREATE OR REPLACE TRIGGER '

           || P_TABLE_NAME

           || '_TRG BEFORE INSERT OR UPDATE

ON '

           || P_TABLE_NAME

           || '

REFERENCING NEW AS New OLD AS Old

FOR EACH ROW

DECLARE

V_SEQ_NO NUMBER;

BEGIN


   IF INSERTING THEN

   

   IF :NEW.ID IS NULL THEN

   :NEW.ID :='

           || 'S_'

           || P_TABLE_NAME

           || '_ID'

           || '.NEXTVAL;

   END IF;

   

   IF :NEW.COMPANY_ID IS NULL THEN

   :NEW.COMPANY_ID := FNC_GET_COMPANY;

   END IF;

   

   IF :NEW.LOCATION_ID IS NULL THEN

   :NEW.LOCATION_ID := FNC_GET_LOCATION;

   END IF;

   

   IF :NEW.STATUS IS NULL THEN

   :NEW.STATUS := 1;

   END IF;

   :NEW.CREATED_BY := FNC_USER_ID(NVL(V(''APP_USER''),USER));

   :NEW.CREATED_ON := SYSDATE;


   ELSIF UPDATING THEN


   :NEW.UPDATED_BY := FNC_USER_ID(NVL(V(''APP_USER''),USER));  

   :NEW.UPDATED_ON := SYSDATE; 


   END IF;



   EXCEPTION

     WHEN OTHERS THEN

       RAISE;

END '

           || P_TABLE_NAME

           || '_TRG;

/

SHOW ERRORS;

 

  

CREATE OR REPLACE PUBLIC SYNONYM '

           || P_TABLE_NAME

           || ' FOR '

           || P_TABLE_NAME

           || ';

'

      INTO V_SCRIPT

      FROM DUAL;


    RETURN V_SCRIPT;

END;

/

Insert script in apex detail data block

--Storeed Procedure for generating  APEX_GRID_DML 

CREATE OR REPLACE PROCEDURE GEN_APEX_GRID_DML (p_table_name IN VARCHAR2)
IS
    v_table_name     VARCHAR2(100);
    v_columns        VARCHAR2(4000);
    v_bind_columns   VARCHAR2(4000);
    v_update_cols    VARCHAR2(4000);
    v_pk_column      VARCHAR2(100);
BEGIN
    v_table_name := UPPER(p_table_name);

    -- Detect Primary Key Column
    BEGIN
        SELECT acc.column_name
          INTO v_pk_column
          FROM user_constraints uc
               JOIN user_cons_columns acc
                  ON uc.constraint_name = acc.constraint_name
         WHERE uc.table_name = v_table_name
           AND uc.constraint_type = 'P'
           AND ROWNUM = 1;
    EXCEPTION
        WHEN NO_DATA_FOUND THEN
            v_pk_column := NULL;
    END;

    -- Build column lists
    SELECT LISTAGG(column_name, ', ') WITHIN GROUP (ORDER BY column_id),
           LISTAGG(':' || column_name, ', ') WITHIN GROUP (ORDER BY column_id),
           LISTAGG(column_name || ' = :' || column_name, ', ')
      INTO v_columns, v_bind_columns, v_update_cols
      FROM user_tab_cols
     WHERE table_name = v_table_name;

    -- Print generated block
    DBMS_OUTPUT.PUT_LINE('----------------------------------------------------');
    DBMS_OUTPUT.PUT_LINE('-- APEX GRID DML BLOCK FOR TABLE: ' || v_table_name);
    DBMS_OUTPUT.PUT_LINE('----------------------------------------------------');
    DBMS_OUTPUT.PUT_LINE('BEGIN');
    DBMS_OUTPUT.PUT_LINE('   IF :APEX$ROW_STATUS = ''C'' THEN');
    DBMS_OUTPUT.PUT_LINE('      INSERT INTO ' || v_table_name || ' (' || v_columns || ')');
    DBMS_OUTPUT.PUT_LINE('      VALUES (' || v_bind_columns || ');');
    DBMS_OUTPUT.PUT_LINE('');
    DBMS_OUTPUT.PUT_LINE('   ELSIF :APEX$ROW_STATUS = ''U'' THEN');
    DBMS_OUTPUT.PUT_LINE('      UPDATE ' || v_table_name);
    DBMS_OUTPUT.PUT_LINE('         SET ' || v_update_cols);

    IF v_pk_column IS NOT NULL THEN
        DBMS_OUTPUT.PUT_LINE('       WHERE ' || v_pk_column || ' = :' || v_pk_column || ';');
    ELSE
        DBMS_OUTPUT.PUT_LINE('       -- No primary key found. Add WHERE clause manually.');
    END IF;

    DBMS_OUTPUT.PUT_LINE('');
    DBMS_OUTPUT.PUT_LINE('   ELSIF :APEX$ROW_STATUS = ''D'' THEN');
    DBMS_OUTPUT.PUT_LINE('      DELETE FROM ' || v_table_name);

    IF v_pk_column IS NOT NULL THEN
        DBMS_OUTPUT.PUT_LINE('       WHERE ' || v_pk_column || ' = :' || v_pk_column || ';');
    ELSE
        DBMS_OUTPUT.PUT_LINE('       -- No primary key found. Add WHERE clause manually.');
    END IF;

    DBMS_OUTPUT.PUT_LINE('   END IF;');
    DBMS_OUTPUT.PUT_LINE('END;');
    DBMS_OUTPUT.PUT_LINE('/');
    DBMS_OUTPUT.PUT_LINE('----------------------------------------------------');
EXCEPTION
    WHEN OTHERS THEN
        DBMS_OUTPUT.PUT_LINE('Error: ' || SQLERRM);
END GEN_APEX_GRID_DML;
/


SET SERVEROUTPUT ON;
BEGIN
   GEN_APEX_GRID_DML(:TABLE_NAME);
END;
/


--Latest version
DECLARE
    v_table_name     VARCHAR2(100) := UPPER(:P_TABLE_NAME);
    v_columns        VARCHAR2(4000);
    v_bind_columns   VARCHAR2(4000);
    v_update_cols    VARCHAR2(4000);
    v_pk_column      VARCHAR2(100);
BEGIN
    -- Detect Primary Key Column
    BEGIN
        SELECT acc.column_name
          INTO v_pk_column
          FROM user_constraints uc
               JOIN user_cons_columns acc
                  ON uc.constraint_name = acc.constraint_name
         WHERE uc.table_name = v_table_name
           AND uc.constraint_type = 'P'
           AND ROWNUM = 1;
    EXCEPTION
        WHEN NO_DATA_FOUND THEN
            v_pk_column := NULL;
    END;

    -- Build column lists for insert/update
    SELECT LISTAGG(column_name, ', ') WITHIN GROUP (ORDER BY column_id),
           LISTAGG(':' || column_name, ', ') WITHIN GROUP (ORDER BY column_id),
           LISTAGG(column_name || ' = :' || column_name, ', ')
      INTO v_columns, v_bind_columns, v_update_cols
      FROM user_tab_cols
     WHERE table_name = v_table_name;

    -- Print output block
    DBMS_OUTPUT.PUT_LINE('BEGIN');
    DBMS_OUTPUT.PUT_LINE('   IF :APEX$ROW_STATUS = ''C'' THEN');
    DBMS_OUTPUT.PUT_LINE('      INSERT INTO ' || v_table_name || ' (' || v_columns || ')');
    DBMS_OUTPUT.PUT_LINE('      VALUES (' || v_bind_columns || ');');

    DBMS_OUTPUT.PUT_LINE('');
    DBMS_OUTPUT.PUT_LINE('   ELSIF :APEX$ROW_STATUS = ''U'' THEN');
    DBMS_OUTPUT.PUT_LINE('      UPDATE ' || v_table_name);
    DBMS_OUTPUT.PUT_LINE('         SET ' || v_update_cols);

    IF v_pk_column IS NOT NULL THEN
        DBMS_OUTPUT.PUT_LINE('       WHERE ' || v_pk_column || ' = :' || v_pk_column || ';');
    ELSE
        DBMS_OUTPUT.PUT_LINE('       -- ⚠️ No primary key found. Please add WHERE clause manually.');
    END IF;

    DBMS_OUTPUT.PUT_LINE('');
    DBMS_OUTPUT.PUT_LINE('   ELSIF :APEX$ROW_STATUS = ''D'' THEN');
    DBMS_OUTPUT.PUT_LINE('      DELETE FROM ' || v_table_name);

    IF v_pk_column IS NOT NULL THEN
        DBMS_OUTPUT.PUT_LINE('       WHERE ' || v_pk_column || ' = :' || v_pk_column || ';');
    ELSE
        DBMS_OUTPUT.PUT_LINE('       -- ⚠️ No primary key found. Please add WHERE clause manually.');
    END IF;

    DBMS_OUTPUT.PUT_LINE('   END IF;');
    DBMS_OUTPUT.PUT_LINE('END;');
END;
/
 
-- Old Code
DECLARE
   CURSOR c1
   IS
      SELECT :P_TABLE_NAME P_TABLE FROM DUAL;
   CURSOR C2
   IS
      SELECT COLUMN_NAME || ',' COLUMN_NAME
        FROM USER_TAB_COLS
       WHERE TABLE_NAME = :P_TABLE_NAME
        ORDER BY COLUMN_ID;
   CURSOR c3
   IS
      SELECT 'INSERT INTO (' || :P_TABLE_NAME P_TABLE FROM DUAL;
   CURSOR C4
   IS
      SELECT COLUMN_NAME || ',' COLUMN_NAME
        FROM USER_TAB_COLS
       WHERE TABLE_NAME = :P_TABLE_NAME
        ORDER BY COLUMN_ID;
   CURSOR C5
   IS
      SELECT COLUMN_NAME
        FROM USER_TAB_COLS
       WHERE TABLE_NAME = :P_TABLE_NAME
        ORDER BY COLUMN_ID;
BEGIN
   FOR I IN C1
   LOOP
      DBMS_OUTPUT.PUT_LINE (
         'BEGIN
      IF :APEX$ROW_STATUS = ''C''
   THEN
    INSERT INTO ' || I.P_TABLE || '(');
      FOR X IN C2
      LOOP
         DBMS_OUTPUT.PUT_LINE (X.COLUMN_NAME);
      END LOOP;
      DBMS_OUTPUT.PUT_LINE (')');
      FOR J IN C3
      LOOP
         DBMS_OUTPUT.PUT_LINE ('VALUES(');
         FOR Y IN C4
         LOOP
            DBMS_OUTPUT.PUT_LINE (':' || Y.COLUMN_NAME);
         END LOOP;
         DBMS_OUTPUT.PUT_LINE (');');
      END LOOP;
      DBMS_OUTPUT.PUT_LINE (
         ' 
   ELSIF :APEX$ROW_STATUS = ''U''
   THEN
      UPDATE ' || :P_TABLE_NAME || ' SET ');
      FOR Z IN C5
      LOOP
         DBMS_OUTPUT.PUT_LINE (
            Z.COLUMN_NAME || ' = :' || Z.COLUMN_NAME || ',');
      END LOOP;
      DBMS_OUTPUT.PUT_LINE ('WHERE COLUMN_NAME = :COLUMN_NAME;');
      DBMS_OUTPUT.PUT_LINE (
            'ELSIF :APEX$ROW_STATUS = ''D''
   THEN
      DELETE FROM '
         || :P_TABLE_NAME
         || '
            WHERE COLUMN_NAME = :COLUMN_NAME;
            END IF;
            END;');
   END LOOP;
END;

Row-level “Add” icon using a virtual column (APEX-safe)

1️⃣ Enable Insert in the Interactive Grid IG → Attributes Edit → Allowed Add Row → Yes 2️⃣ Add a New Column (Icon column) Column...