2026-03-12 20:23:15
This commit is contained in:
296
idev/example_create_emp_dept_custom.sql
Normal file
296
idev/example_create_emp_dept_custom.sql
Normal file
@@ -0,0 +1,296 @@
|
||||
-- +----------------------------------------------------------------------------+
|
||||
-- | 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;
|
||||
/
|
||||
|
||||
Reference in New Issue
Block a user