Files
oracle/idev/example_create_user_tables.sql
2026-03-12 21:23:47 +01:00

245 lines
5.6 KiB
SQL

-- +----------------------------------------------------------------------------+
-- | Jeffrey M. Hunter |
-- | jhunter@idevelopment.info |
-- | www.idevelopment.info |
-- |----------------------------------------------------------------------------|
-- | Copyright (c) 1998-2012 Jeffrey M. Hunter. All rights reserved. |
-- |----------------------------------------------------------------------------|
-- | DATABASE : Oracle |
-- | FILE : example_create_user_tables.sql |
-- | CLASS : Examples |
-- | PURPOSE : Yet another SQL script that demonstrates how to sample tables |
-- | and a PL/SQL routine that populates those tables. |
-- | NOTE : As with any code, ensure to test this script in a development |
-- | environment before attempting to run it in production. |
-- +----------------------------------------------------------------------------+
/*
** +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
*/
/*
CONNECT /
CREATE TABLESPACE users
DATAFILE '/u10/app/oradata/ORA901/users01.dbf' SIZE 10M
/
CREATE TABLESPACE idx
DATAFILE '/u09/app/oradata/ORA901/idx01.dbf' SIZE 10M
/
CREATE USER jhunter IDENTIFIED BY jhunter
DEFAULT TABLESPACE users
TEMPORARY TABLESPACE temp
/
GRANT dba, resource, connect TO jhunter
/
*/
/*
** +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
*/
CONNECT jhunter/jhunter
/*
** +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
*/
DROP TABLE user_names CASCADE CONSTRAINTS
/
CREATE TABLE user_names (
name_intr_no NUMBER(15)
, name VARCHAR2(30)
, age NUMBER(3)
, update_log_date DATE
)
TABLESPACE users
STORAGE (
INITIAL 64K
NEXT 64K
MINEXTENTS 1
MAXEXTENTS 100
PCTINCREASE 0
)
/
ALTER TABLE user_names
ADD CONSTRAINT user_names_pk PRIMARY KEY(name_intr_no)
USING INDEX
TABLESPACE idx
STORAGE (
INITIAL 28K
NEXT 28K
MINEXTENTS 1
MAXEXTENTS 100
PCTINCREASE 0
)
/
ALTER TABLE user_names
MODIFY ( name CONSTRAINT user_names_nn1 NOT NULL
, age CONSTRAINT user_names_nn2 NOT NULL
, update_log_date CONSTRAINT user_names_nn3 NOT NULL
)
/
/*
** +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
*/
DROP TABLE user_names_phone
/
CREATE TABLE user_names_phone (
name_intr_no number(15)
, phone_number varchar2(12)
, country_code varchar2(15)
)
TABLESPACE users
STORAGE (
INITIAL 64K
NEXT 64K
MINEXTENTS 1
MAXEXTENTS 100
PCTINCREASE 0
)
/
ALTER TABLE user_names_phone
ADD CONSTRAINT user_names_phone_pk PRIMARY KEY(name_intr_no, phone_number)
USING INDEX
TABLESPACE idx
STORAGE (
INITIAL 28K
NEXT 28K
MINEXTENTS 1
MAXEXTENTS 100
PCTINCREASE 0
)
/
ALTER TABLE user_names_phone
MODIFY ( country_code CONSTRAINT user_names_phone_nn1 NOT NULL
)
/
ALTER TABLE user_names_phone
ADD CONSTRAINT user_names_phone_fk1 FOREIGN KEY (name_intr_no)
REFERENCES user_names(name_intr_no)
/
/*
** +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
*/
DROP TABLE user_names_company
/
CREATE TABLE user_names_company (
name_intr_no number(15)
, company_code varchar2(15)
)
TABLESPACE users
STORAGE (
INITIAL 64K
NEXT 64K
MINEXTENTS 1
MAXEXTENTS 100
PCTINCREASE 0
)
/
/*
** +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
*/
create or replace procedure insert_user_names (
num_records IN number)
IS
CURSOR csr1 IS
SELECT max(name_intr_no)
FROM user_names;
max_intr_no NUMBER;
BEGIN
/*
|| ENABLE DBMS_OUTPUT
*/
DBMS_OUTPUT.ENABLE;
/*
|| SET ROLLBACK SEGMENT TO THE LARGEST ONE: rbs2
*/
DECLARE
incomplete_transaction EXCEPTION;
pragma EXCEPTION_INIT (incomplete_transaction, -01453);
BEGIN
SET TRANSACTION USE ROLLBACK SEGMENT rbs2;
EXCEPTION
WHEN incomplete_transaction THEN
ROLLBACK;
DBMS_OUTPUT.PUT_LINE('Needed to rollback previous transaction');
SET TRANSACTION USE ROLLBACK SEGMENT rbs2;
END;
/*
|| INSERT DUMMY RECORDS INTO THE USER DEFINED
|| TABLE: user_names. THE FIRST PARAMETER TO THIS
|| FUNCTION WILL DETERMINE THE NUMBER OF RECORDS
|| TO INSERT.
*/
DECLARE
fail_rollback_segment EXCEPTION;
pragma EXCEPTION_INIT (fail_rollback_segment, -01562);
BEGIN
OPEN csr1;
FETCH csr1 INTO max_intr_no;
CLOSE csr1;
max_intr_no := NVL(max_intr_no,0) + 1;
FOR loop_index IN max_intr_no .. (max_intr_no + (num_records-1))
LOOP
INSERT INTO user_names
VALUES (loop_index, 'Oracle DBA', 30, SYSDATE);
INSERT INTO user_names_phone
VALUES (loop_index, '412-555-1234', 'USA');
INSERT INTO user_names_company
VALUES (loop_index, 'DBA Zone');
IF (MOD(loop_index, 100) = 0) THEN
COMMIT;
DBMS_OUTPUT.PUT_LINE('Commit point reached at: ' || loop_index || '.');
END IF;
END LOOP;
COMMIT;
DBMS_OUTPUT.NEW_LINE;
DBMS_OUTPUT.PUT_LINE('Successfully inserted ' || num_records ||
' records into table: user_names');
EXCEPTION
WHEN fail_rollback_segment THEN
ROLLBACK;
DBMS_OUTPUT.PUT_LINE('Fail to extent rollback segment: RBS2');
END;
END;
/
show errors;