using the table api
DESCRIPTION
Using the Table API. Standard Uses of API. Populate Columns via Sequences Insert Default Values instead of nulls Populate Autogen Columns Date Created, Date Modified Who Created, Who Modified Sequence within Parent Force Uppercase Domain Validation Arc validation. Standard Uses of API. - PowerPoint PPT PresentationTRANSCRIPT
Using the Table API
Standard Uses of API• Populate Columns via Sequences• Insert Default Values instead of nulls• Populate Autogen Columns
– Date Created, Date Modified– Who Created, Who Modified– Sequence within Parent
• Force Uppercase• Domain Validation• Arc validation
Standard Uses of API
• Foreign Key Cascades, Nullifies, Defaults, Restricted Delete/Update
• Table Journaling• Derived Columns• Denormalization:
– Copy Parent Value to Child– Aggregate Child Values to Parent
Specification SummarySequence Populated
Denormalized
Uppercase
Domain
Autogen
Force Uppercase
• Set ‘Uppercase’ to Yes• Set ‘Server Derived?’ to Yes• Generate Table API
Uppercase Only
Uppercase
Server Derived?
Autogen Code
• For autogen column– Set Autogen Type
• Date Modified/Created• Created/Modified By• Sequence within Parent
– Set ‘Server Derived’ to Yes.
• Generate API
Autogen Columns
Server Derived?
Autogen Type
Domain Validation
• Via Check Constraint (non-API)• Via Lookup in CG_REF_CODES table• How?
– Define Domain– Define Column using Domain, or– Define Column with ‘Allowable Values’– Generate Table API
Server
Packages
Validating DomainsGAME_CATEGORY
ARC
RV_DOMAIN RV_LOW_VALUE
GAME _CATEGORY ARCGAME _CATEGORY EDUGAME _CATEGORY ROLGAME _CATEGORY SIM
Triggers
CG_REF_CODESCG_REF_CODES
DML
TITLESTITLES
Advantages of REF_CODES
• DBA must alter Check constraint• May have to bring down system • CG_REF_CODES table can be
accessed thru Application
Schema of CG_REF_CODES• RV_DOMAIN
– Domain name, or– Table.column
• RV_LOW_VALUE– One legal value, e.g., UT– Low value of a range
• RV_HIGH_VALUE• RV_ABBREVIATION, e.g., UNIT• RV_MEANING, e.g., Unit Test
Domain Validation
Domain Validation
Server Derived?
Domain
How to Populate with Sequence
• Make sure sequence is defined• For Populated Column:
– Set ‘Sequence’ to desired sequence
• Generate API
Populate with Sequence
Server Derived?
SequenceSequence Defined
Validating Arcs
GAMES
# * PRODUCT_CODE. . .
TITLES
# * PRODUCT_CODE * TITLE
. . . o MO_PRODUCT_CODE o GA_PRODUCT_CODE . . .
MOVIES
# * PRODUCT_CODE. . .DML
TriggersServer
Packages
Arc Validation
• Explicit style only: one column for each FK in Arc
• For each FK in Table with Arc,– Set ‘Arc Number’ same for same arc– Set ‘Arc Mandatory’ to Yes or No
• Generate Table API for Table
Performing Cascade Update
Triggers
PRODUCT_CODE
25
TI_PRODUCT_CODE
2525
TITLESTITLES COPIESCOPIES
Update 30
Server
Packages
3030
Cascading Updates/Deletes
• For foreign key,– Set ‘Update Rule’– Set ‘Delete Rule’– Set ‘Validate In’ to Server or Both
• Generate Table API for Parent and Child at Same Time
• Usually best to generate whole API at one time
Foreign Key Cascade
FK properties (NOT FK Column)
Delete Rule
Validate in Server
Journal Tables
• Have all fields of Base Table• Plus: operation, date, user,
application• Contains only needed table data
– Key for deletes– Key plus updated columns for
updates
Server
Packages
Journaling Tables
PRODUCT_CODE . . .
TITLESTITLES
PRODUCT_CODE . . .
TITLES_JNTITLES_JNTriggers
DML 30
30
To Set Up Journaling
• Table Property: ‘Journal’• Set to
– ‘Server’– or ‘Client Calls Server Procedure’
• Generate API
Denormalization
• Most Common: Bring Parent Value (e.g., Department Name) into Child Column (e.g., Employee Table)
• Aggregate Children (Count, Sum, Average of Child Column)
Copying Denormalized Values
PRODUCT_CODE TITLE
30 TITANIC
TITLESTITLES
TI_PRODUCT_CODE TITLE
COPIESCOPIES
By foreign keyBy foreign key
DML
30
Server
Packages
TITANIC
Triggers
How To Denormalize into Child
• In Child table, for target column– Set ‘From Column’ to column in
Parent.– Set ‘Via Foreign Key’ as appropriate.– Set ‘Server Derived’ to Yes
• Generate API for both parent and child.
Denormalization
. . .
How to Aggregate into Parent
• For target column in parent– Set ‘From Column’– Set ‘Via Foreign Key’– Set ‘Using Operator’ (Count, Sum,
etc.)– Set ‘Server Derived’ to Yes
• Generate API for Parent and Child
Column Derivations• Calculate value based on columns
in the same record– Area := Height * Width– Name := Lname || ‘, ‘ || Fname
• For target column– set ‘Derivation Expression Type’ to
SQL Expression– Enter ‘Derivation Expression’– Set Server Derived to Yes
• Generate API
Specification SummarySequence Populated
Denormalized
Uppercase
Domain
Autogen
Generate DB from Server Model
REF_CODES Table CreatedPROMPT Creating Table 'CG_REF_CODES'CREATE TABLE CG_REF_CODES (RV_DOMAIN VARCHAR2(100) NOT NULL ,RV_LOW_VALUE VARCHAR2(240) NOT NULL ,RV_HIGH_VALUE VARCHAR2(240) ,RV_ABBREVIATION VARCHAR2(240) ,RV_MEANING VARCHAR2(240) )/
REF_CODES Table Populated
DELETE FROM CG_REF_CODESWHERE RV_DOMAIN = 'PCH_TYPE_TYPE'/INSERT INTO CG_REF_CODES (RV_DOMAIN, …)VALUES ('PCH_TYPE_TYPE', 'OT', NULL, 'OTHER', 'Other')/INSERT INTO CG_REF_CODES (RV_DOMAIN, …)VALUES ('PCH_TYPE_TYPE', 'EQ', NULL, 'EQUIP', 'Equipment over $500')/. . .
Generate Table API
Some Messages for Purchases
Creating Table API Error Package CG$ERRORS ...Creating Table API Package Specification for Table 'PURCHASES' ......Creating Table API Package Body for Table 'PURCHASES' ......Creating Trigger Logic for Table 'PURCHASES' ...Creating Before Delete Statement Trigger on 'PURCHASES' ...Creating Before Delete Row Trigger on 'PURCHASES' ...Creating After Delete Row Trigger on 'PURCHASES' ...Creating After Delete Statement Trigger on 'PURCHASES' ...
Package Spec
• Trigger flag to avoid recursive call• Useful Constants• Row variable for Table• Table variable for Table• Procedures ins, upd, del, lck, slct• Procedures for validating arc,
domains, cascading, denormalization
Up_autogen_columns-- Code highlights IF (operation = 'INS') THEN BEGIN IF (cg$rec.PURCHASES_ID is NULL) THEN -- SEQUENCE SELECT PCH_SEQ.nextval INTO cg$rec.PURCHASES_ID FROM DUAL; END IF; EXCEPTION WHEN OTHERS THEN cg$errors.push(SQLERRM, ….) cg$errors.raise_failure; END;
cg$rec.CREATOR := user; -- AUTOGEN cg$rec.CREATEDATE := trunc(sysdate); END IF; cg$rec.ITEM := upper(cg$rec.ITEM); -- UPPERCASE IF(cg$rec.PCH_DNUMBER IS NULL) THEN cg$rec.DNAME := NULL; ELSE SELECT DNAME INTO cg$rec.DNAME -- DENORMALIZATION FROM DEPARTMENTS WHERE DNUMBER = cg$rec.PCH_DNUMBER; END IF;
Test With SQLPLUSSQL> insert into purchases( 2 PURCHASES_ID,PCH_DNUMBER,DNAME,ITEM,PCH_TYPE,QUANTITY,COST, 3 CREATOR,CREATEDATE) 4 values( 5 null, 10, null, 'soap', 'SU', 1, 10, 6 null,null);
ID DNO DNAME ITEM PC QTY COST CREATOR CREATEDAT---- ---- --------------- ----- -- ---- ---- ---------- --------- 5 10 ADMINISTRATION SOAP SU 1 10 IBL 16-APR-00
Test with Form