1 year ago

#69551

test-img

Szymon Rostek

How to set value in a column based on values from another columns in the same table?

I am quite new in ORACLE APEX and I would like to have a column BILANS that is a result of BUDGET and COST difference. I mean I insert values to BUDGET and COST columns in a form and BILANS is counted automatically. I think it should be quite basic feature but I cannot do it. I tried to do this with trigger and procedure but I failed. Underneath I will put my table, triggers and procedure that I try to create.

TABLE and triggers - work correctly

CREATE TABLE  "PROJECTS" 
   (    "ID" NUMBER NOT NULL ENABLE, 
    "NAME" VARCHAR2(255) NOT NULL ENABLE, 
    "LAWYER_ID" VARCHAR2(30) NOT NULL ENABLE, 
    "COST" NUMBER NOT NULL ENABLE, 
    "BUDGET" NUMBER NOT NULL ENABLE, 
    "START_DATE" DATE NOT NULL ENABLE, 
    "END_DATE" DATE, 
    "CREATED" TIMESTAMP (6) WITH LOCAL TIME ZONE NOT NULL ENABLE, 
    "CREATED_BY" VARCHAR2(255) NOT NULL ENABLE, 
    "UPDATED" TIMESTAMP (6) WITH LOCAL TIME ZONE NOT NULL ENABLE, 
    "UPDATED_BY" VARCHAR2(255) NOT NULL ENABLE, 
    "DEPTNO" NUMBER, 
    "BILANS" NUMBER, 
     CONSTRAINT "PROJECTS_ID_PK" PRIMARY KEY ("ID")
  USING INDEX  ENABLE
   )
/

CREATE OR REPLACE EDITIONABLE TRIGGER  "BIU_PROJECTS" 
BEFORE INSERT OR UPDATE OR DELETE
ON PROJECTS
FOR EACH ROW
BEGIN
IF inserting THEN
    INSERT INTO PROJECTS_ARCH
    (   
        ID
    ,   OLD_NAME
    ,   OLD_DEPTNO          
    ,   OLD_LAWYER_ID       
    ,   OLD_COST           
    ,   OLD_BUDGET                
    ,   OLD_START_DATE             
    ,   OLD_END_DATE   
    ,   NEW_NAME
    ,   NEW_DEPTNO         
    ,   NEW_LAWYER_ID     
    ,   NEW_COST          
    ,   NEW_BUDGET           
    ,   NEW_START_DATE            
    ,   NEW_END_DATE          
    ,   UPDATED    
    ,   UPDATED_BY  
    ,   MOD_TYPE   
    ) VALUES (
        PROJECTS_ARCH_ID_SEQ.nextval
    ,   NULL
    ,   NULL
    ,   NULL
    ,   NULL
    ,   NULL
    ,   NULL
    ,   NULL
    ,   :NEW.NAME
    ,   :NEW.DEPTNO         
    ,   :NEW.LAWYER_ID     
    ,   :NEW.COST          
    ,   :NEW.BUDGET           
    ,   :NEW.START_DATE            
    ,   :NEW.END_DATE  
    ,   SYSDATE
    ,   user
    ,   'INSERT'
    )
    ;
    END IF;
IF updating THEN
     INSERT INTO PROJECTS_ARCH
    (  
        ID
    ,   OLD_NAME
    ,   OLD_DEPTNO          
    ,   OLD_LAWYER_ID       
    ,   OLD_COST           
    ,   OLD_BUDGET                
    ,   OLD_START_DATE             
    ,   OLD_END_DATE    
    ,   NEW_NAME
    ,   NEW_DEPTNO         
    ,   NEW_LAWYER_ID     
    ,   NEW_COST          
    ,   NEW_BUDGET           
    ,   NEW_START_DATE            
    ,   NEW_END_DATE          
    ,   UPDATED    
    ,   UPDATED_BY  
    ,   MOD_TYPE   
    ) VALUES (
        PROJECTS_ARCH_ID_SEQ.nextval
    ,   :OLD.NAME
    ,   :OLD.DEPTNO          
    ,   :OLD.LAWYER_ID       
    ,   :OLD.COST           
    ,   :OLD.BUDGET                
    ,   :OLD.START_DATE             
    ,   :OLD.END_DATE    
    ,   :NEW.NAME
    ,   :NEW.DEPTNO           
    ,   :NEW.LAWYER_ID     
    ,   :NEW.COST          
    ,   :NEW.BUDGET           
    ,   :NEW.START_DATE            
    ,   :NEW.END_DATE     
    ,   SYSDATE
    ,   user
    ,   'UPDATE'
    )
    ;
    END IF;
IF deleting THEN 
     INSERT INTO PROJECTS_ARCH
    (  
        ID
    ,   OLD_NAME
    ,   OLD_DEPTNO          
    ,   OLD_LAWYER_ID       
    ,   OLD_COST           
    ,   OLD_BUDGET                
    ,   OLD_START_DATE             
    ,   OLD_END_DATE    
    ,   NEW_NAME
    ,   NEW_DEPTNO         
    ,   NEW_LAWYER_ID     
    ,   NEW_COST          
    ,   NEW_BUDGET           
    ,   NEW_START_DATE            
    ,   NEW_END_DATE
    ,   UPDATED    
    ,   UPDATED_BY  
    ,   MOD_TYPE       
    ) VALUES (
        PROJECTS_ARCH_ID_SEQ.nextval
    ,   :OLD.NAME
    ,   :OLD.DEPTNO         
    ,   :OLD.LAWYER_ID     
    ,   :OLD.COST          
    ,   :OLD.BUDGET           
    ,   :OLD.START_DATE            
    ,   :OLD.END_DATE
    ,   NULL
    ,   NULL
    ,   NULL
    ,   NULL
    ,   NULL
    ,   NULL
    ,   NULL 
    ,   SYSDATE
    ,   user
    ,   'DELETE'
    )
    ;
END IF;
END;

/
ALTER TRIGGER  "BIU_PROJECTS" ENABLE
/

CREATE OR REPLACE EDITIONABLE TRIGGER  "BIU_PROJ_MOD" 
BEFORE INSERT OR UPDATE
ON PROJECTS
FOR EACH ROW 
BEGIN
    IF :new.id IS NULL THEN
    :new.id := PROJECTS_ID_SEQ.nextval;
    END IF;
    
    IF inserting THEN
    :new.created    := LOCALTIMESTAMP;
    :new.created_by := nvl(wwv_flow.g_user,user);
    END IF;
    :new.updated    := LOCALTIMESTAMP;
    :new.updated_by := nvl(wwv_flow.g_user,user);
END;

/
ALTER TRIGGER  "BIU_PROJ_MOD" ENABLE

PROCEDURE I tried to write

CREATE OR REPLACE PROCEDURE bilans_counter_proc
(temp_budget number,
temp_cost number)
IS
BEGIN
    temp_budget := :new.BUDGET;
    temp_cost := :new.COST;
    INSERT INTO PROJECTS 
    (BILANS)
    VALUES (temp_budget-temp_cost);
    COMMIT;
END bilans_counter_proc;

ERROR that I GET:

Error at line 7: PLS-00049: bad bind variable 'NEW.COST'
Error at line 6: PLS-00049: bad bind variable 'NEW.BUDGET'


5. BEGIN
6.     temp_budget := :new.BUDGET;
7.     temp_cost := :new.COST;
8.     INSERT INTO PROJECTS 
9.     (BILANS)

Please help me :)

oracle

triggers

procedure

apex

0 Answers

Your Answer

Accepted video resources