1 year ago
#69551
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