CREATE TABLE t1
  (
    column1 NUMBER,
    column2 NUMBER,
    column3 NUMBER generated always AS (column1 + column2) virtual
  );

DROP TABLE t1;

CREATE TABLE t1
  ( column1 NUMBER, column2 NUMBER
  );
ALTER TABLE t1 ADD column3 NUMBER generated always
AS
  (
    column1 + column2
  )
  virtual;

INSERT INTO t1
  (column1, column2
  ) VALUES
  (20, 10
  );

SELECT * FROM t1;

--error here
INSERT INTO t1 VALUES
  (20, 10, 30
  );

--error here
INSERT INTO t1 VALUES
  (20, 10
  );

--correct insert syntax
INSERT INTO t1
  (column1, column2
  ) VALUES
  (20, 10
  );

DROP TABLE t1;

CREATE
FUNCTION add_columns(
    value1 NUMBER,
    value2 NUMBER)
  RETURN NUMBER deterministic
AS
BEGIN
  RETURN value1 + value2;
END add_columns;
/

CREATE TABLE t1
  (
    column1 NUMBER,
    column2 NUMBER,
    column3 NUMBER generated always AS (add_columns(column1, column2))
  );

INSERT INTO t1
  (column1, column2
  ) VALUES
  (20, 10
  );

SELECT * FROM t1;

DROP FUNCTION add_columns;

--error here
SELECT * FROM t1;

CREATE TABLE employees
  (
    employee_id   NUMBER(3),
    first_name    VARCHAR(20),
    salary        NUMBER (7,2),
    department_id NUMBER(3)
  );

INSERT INTO employees VALUES
  (10, 'Mike', 4000, 100
  );

INSERT INTO employees VALUES
  (11, 'James', 3500, 101
  );

INSERT INTO employees VALUES
  (12, 'David', 2000, 100
  );

SELECT employee_id,
  first_name,
  salary,
  department_id,
  salary*12 AS annual_salary
FROM employees;

ALTER TABLE employees ADD annual_salary NUMBER(9,2);

UPDATE employees SET annual_salary = salary*12;

SELECT * FROM employees;

UPDATE employees SET salary = 3000 WHERE first_name = 'David';

SELECT * FROM employees;

ALTER TABLE employees
DROP column annual_salary;
ALTER TABLE employees ADD annual_salary generated always
AS
  (salary*12) virtual;

SELECT * FROM employees;

UPDATE employees SET salary = 2500 WHERE first_name = 'David';

SELECT * FROM employees;

DROP TABLE t1;
DROP TABLE employees;