Files
oracle/idev/example_create_emp_dept_custom.sql

297 lines
9.4 KiB
MySQL
Raw Normal View History

2026-03-12 21:23:47 +01:00
-- +----------------------------------------------------------------------------+
-- | Jeffrey M. Hunter |
-- | jhunter@idevelopment.info |
-- | www.idevelopment.info |
-- |----------------------------------------------------------------------------|
-- | Copyright (c) 1998-2012 Jeffrey M. Hunter. All rights reserved. |
-- |----------------------------------------------------------------------------|
-- | DATABASE : Oracle |
-- | FILE : example_create_emp_dept_custom.sql |
-- | CLASS : Examples |
-- | PURPOSE : Creates several DEMO tables along with creating a PL/SQL |
-- | procedure (fill_emp) for seeding the tables with demo data. |
-- | NOTE : As with any code, ensure to test this script in a development |
-- | environment before attempting to run it in production. |
-- +----------------------------------------------------------------------------+
prompt Connect as the test user. Default SCOTT...
CONNECT scott
/*
* -------------------------------------------------------------
* --- CREATE TABLE DEPT ---
* -------------------------------------------------------------
*/
DROP TABLE dept CASCADE CONSTRAINTS
/
CREATE TABLE dept (
dept_id NUMBER
, name VARCHAR2(100)
, location VARCHAR2(100)
)
/
ALTER TABLE dept
ADD CONSTRAINT dept_pk PRIMARY KEY(dept_id)
/
ALTER TABLE dept
MODIFY ( name CONSTRAINT dept_nn1 NOT NULL
, location CONSTRAINT dept_nn2 NOT NULL
)
/
/*
* -------------------------------------------------------------
* --- CREATE TABLE EMP ---
* -------------------------------------------------------------
*/
DROP TABLE emp CASCADE CONSTRAINTS
/
CREATE TABLE emp (
emp_id NUMBER
, dept_id NUMBER
, name VARCHAR2(30)
, date_of_birth DATE
, date_of_hire DATE
, monthly_salary NUMBER(15,2)
, position VARCHAR2(100)
, extension NUMBER
, office_location VARCHAR2(100)
)
/
ALTER TABLE emp
ADD CONSTRAINT emp_pk PRIMARY KEY(emp_id)
/
ALTER TABLE emp
MODIFY ( name CONSTRAINT emp_nn1 NOT NULL
, date_of_birth CONSTRAINT emp_nn2 NOT NULL
, date_of_hire CONSTRAINT emp_nn3 NOT NULL
, monthly_salary CONSTRAINT emp_nn4 NOT NULL
, position CONSTRAINT emp_nn5 NOT NULL
)
/
ALTER TABLE emp
ADD CONSTRAINT emp_fk1 FOREIGN KEY (dept_id)
REFERENCES dept(dept_id)
/
/*
* -------------------------------------------------------------
* --- INSERT INTO DEPT ---
* -------------------------------------------------------------
*/
INSERT INTO DEPT VALUES (100 , 'ACCOUNTING' , 'BUTLER, PA');
INSERT INTO DEPT VALUES (101 , 'RESEARCH' , 'DALLAS, TX');
INSERT INTO DEPT VALUES (102 , 'SALES' , 'CHICAGO, IL');
INSERT INTO DEPT VALUES (103 , 'OPERATIONS' , 'BOSTON, MA');
INSERT INTO DEPT VALUES (104 , 'IT' , 'PITTSBURGH, PA');
INSERT INTO DEPT VALUES (105 , 'ENGINEERING' , 'WEXFORD, PA');
INSERT INTO DEPT VALUES (106 , 'QA' , 'WEXFORD, PA');
INSERT INTO DEPT VALUES (107 , 'PROCESSING' , 'NEW YORK, NY');
INSERT INTO DEPT VALUES (108 , 'CUSTOMER SUPPORT' , 'TRANSFER, PA');
INSERT INTO DEPT VALUES (109 , 'HQ' , 'WEXFORD, PA');
INSERT INTO DEPT VALUES (110 , 'PRODUCTION SUPPORT' , 'MONTEREY, CA');
INSERT INTO DEPT VALUES (111 , 'DOCUMENTATION' , 'WEXFORD, PA');
INSERT INTO DEPT VALUES (112 , 'HELP DESK' , 'GREENVILLE, PA');
INSERT INTO DEPT VALUES (113 , 'AFTER HOURS SUPPORT' , 'SAN JOSE, CA');
INSERT INTO DEPT VALUES (114 , 'APPLICATION SUPPORT' , 'WEXFORD, PA');
INSERT INTO DEPT VALUES (115 , 'MARKETING' , 'SEASIDE, CA');
INSERT INTO DEPT VALUES (116 , 'NETWORKING' , 'WEXFORD, PA');
INSERT INTO DEPT VALUES (117 , 'DIRECTORS OFFICE' , 'WEXFORD, PA');
INSERT INTO DEPT VALUES (118 , 'ASSISTANTS' , 'WEXFORD, PA');
INSERT INTO DEPT VALUES (119 , 'COMMUNICATIONS' , 'SEATTLE, WA');
INSERT INTO DEPT VALUES (120 , 'REGIONAL SUPPORT' , 'PORTLAND, OR');
COMMIT;
/*
* -------------------------------------------------------------
* --- CREATE PACKAGE (random) ---
* -------------------------------------------------------------
*/
CREATE OR REPLACE PACKAGE random IS
-- Returns random integer between [0, r-1]
FUNCTION rndint(r IN NUMBER) RETURN NUMBER;
-- Returns random real between [0, 1]
FUNCTION rndflt RETURN NUMBER;
END;
/
CREATE OR REPLACE PACKAGE BODY random IS
m CONSTANT NUMBER:=100000000; /* initial conditions */
m1 CONSTANT NUMBER:=10000; /* (for best results) */
b CONSTANT NUMBER:=31415821; /* */
a NUMBER; /* seed */
the_date DATE; /* */
days NUMBER; /* for generating initial seed */
secs NUMBER; /* */
-- ------------------------
-- Private utility FUNCTION
-- ------------------------
FUNCTION mult(p IN NUMBER, q IN NUMBER) RETURN NUMBER IS
p1 NUMBER;
p0 NUMBER;
q1 NUMBER;
q0 NUMBER;
BEGIN
p1:=TRUNC(p/m1);
p0:=MOD(p,m1);
q1:=TRUNC(q/m1);
q0:=MOD(q,m1);
RETURN(MOD((MOD(p0*q1+p1*q0,m1)*m1+p0*q0),m));
END;
-- ---------------------------------------
-- Returns random integer between [0, r-1]
-- ---------------------------------------
FUNCTION rndint (r IN NUMBER) RETURN NUMBER IS
BEGIN
-- Generate a random NUMBER, and set it to be the new seed
a:=MOD(mult(a,b)+1,m);
-- Convert it to integer between [0, r-1] and return it
RETURN(TRUNC((TRUNC(a/m1)*r)/m1));
END;
-- ----------------------------------
-- Returns random real between [0, 1]
-- ----------------------------------
FUNCTION rndflt RETURN NUMBER IS
BEGIN
-- Generate a random NUMBER, and set it to be the new seed
a:=MOD(mult(a,b)+1,m);
RETURN(a/m);
END;
BEGIN
-- Generate initial seed "a" based on system date
the_date:=SYSDATE;
days:=TO_NUMBER(TO_CHAR(the_date, 'J'));
secs:=TO_NUMBER(TO_CHAR(the_date, 'SSSSS'));
a:=days*24*3600+secs;
END;
/
/*
* -------------------------------------------------------------
* --- CREATE PROCEDURE (fill_emp) ---
* -------------------------------------------------------------
*/
CREATE OR REPLACE PROCEDURE fill_emp (
num_records IN number)
IS
rand NUMBER;
randf NUMBER;
randfe NUMBER;
rand_dept_id NUMBER;
rand_dob NUMBER;
rand_date NUMBER;
rand_salary NUMBER;
record_count_success NUMBER;
record_count_fail_ic NUMBER;
record_count_fail_other NUMBER;
max_emp_id NUMBER;
CURSOR max_emp_csr IS
SELECT MAX(emp_id)
FROM emp;
BEGIN
DBMS_OUTPUT.ENABLE;
OPEN max_emp_csr;
FETCH max_emp_csr INTO max_emp_id;
CLOSE max_emp_csr;
max_emp_id := NVL(max_emp_id,0) + 1;
record_count_success := 0;
record_count_fail_ic := 0;
record_count_fail_other := 0;
FOR loop_index IN max_emp_id .. (max_emp_id + (num_records-1))
LOOP
rand := random.rndint(20);
randf := random.rndflt;
randfe := TRUNC( (random.rndflt*10000));
IF (randfe < 1000) THEN
randfe := randfe * 10;
END IF;
rand_dept_id := (rand + 100);
rand_date := rand * 10;
rand_salary := randf * 10000;
IF (rand_salary < 1000) THEN
rand_salary := rand_salary * 10;
END IF;
DECLARE
integrity_constraint_e EXCEPTION;
pragma EXCEPTION_INIT (integrity_constraint_e, -02291);
BEGIN
INSERT INTO emp
VALUES ( loop_index
, rand_dept_id
, 'Name at : ' || (rand_dept_id * 17)
, sysdate - (rand_date * 90)
, sysdate + rand_date
, rand_salary
, 'Position at : ' || (rand_dept_id * 13)
, randfe
, 'Office Location at : ' || (rand_dept_id * 15)
);
IF (MOD(loop_index, 1000) = 0) THEN
COMMIT;
-- DBMS_OUTPUT.PUT_LINE('Commit point reached at: ' || loop_index || '.');
END IF;
record_count_success := record_count_success + 1;
EXCEPTION
WHEN integrity_constraint_e THEN
-- DBMS_OUTPUT.PUT_LINE('Integrity constraint for dept_id: ' || rand_dept_id);
record_count_fail_ic := record_count_fail_ic + 1;
WHEN others THEN
-- DBMS_OUTPUT.PUT_LINE('Other failure');
record_count_fail_other := record_count_fail_other + 1;
END;
END LOOP;
COMMIT;
DBMS_OUTPUT.NEW_LINE;
DBMS_OUTPUT.PUT_LINE('Procedure complete inserting records into emp.');
DBMS_OUTPUT.PUT_LINE('----------------------------------------------');
DBMS_OUTPUT.PUT_LINE('Requested records : ' || num_records);
DBMS_OUTPUT.PUT_LINE('Successfully inserted records : ' || record_count_success);
DBMS_OUTPUT.PUT_LINE('Failed records (integrity_constraint) : ' || record_count_fail_ic);
DBMS_OUTPUT.PUT_LINE('Failed records (other) : ' || record_count_fail_other);
END;
/