This database is used for the CAM-system to save the data using while preparation.
There are many different informations for a single PCB order the CAM department has to handle.
Some of them repeats in the ERP database and will be copied anyway. The reason for a separate CAM-DB
is that the CAM has no rights to change anything in the ERP-DB, because of an exclusive right for the XAL software.
Please follow the code below to find out the structure of the tables.
This SQL code includes a trigger, which gives an exception while inserting more the one surface type to the DB.
The purpose for use a trigger was to separate the SQL-code from the UI-code, however it would still be possible to replace
the trigger with the ordinary Perl code used in the user interface.
SQL2
CONNECT SYSTEM/manager;
GRANT CREATE TABLESPACE TO cam;
GRANT ALTER DATABASE TO cam;
GRANT DROP TABLESPACE TO cam;
GRANT SELECT ON dba_data_files TO cam;
GRANT ALL PRIVILEGES TO cam;
CONNECT cam/cam_passwd;
-- DROP TABLESPACE camdata;
CREATE TABLESPACE camdata DATAFILE
'c:\oraclexe\app\oracle\oradata\XE\camdata.dbf' SIZE 200m;
ALTER DATABASE DATAFILE 'c:\oraclexe\app\oracle\oradata\XE\camdata.dbf'
resize 500m;
--DROP TABLE cam_job;
CREATE TABLE cam_job
(
varenummer VARCHAR(20) NOT NULL,
kundetegningsnr VARCHAR(40) NOT NULL,
antallppxpp NUMBER NOT NULL,
antalprintpxpp NUMBER NOT NULL,
hal NUMBER(3),
blyfrihal NUMBER(3),
kemsn NUMBER(3),
kemag NUMBER(3),
kemiskniau NUMBER(3),
doneat TIMESTAMP,
-- FK specifies that the values in the column must correspond to values
-- in a referenced primary key or unique key column or that they are NULL
CONSTRAINT job_pk PRIMARY KEY (varenummer)
);
-- check if many surfaces are set
CREATE OR replace TRIGGER check_surface_trig
BEFORE INSERT OR UPDATE ON cam_job
FOR EACH ROW
DECLARE
myhal INT;
myblyfrihal INT;
mykemsn INT;
mykemag INT;
mykemiskniau INT;
BEGIN
SELECT :new.hal
INTO myhal
FROM dual;
SELECT :new.blyfrihal
INTO myblyfrihal
FROM dual;
SELECT :new.kemsn
INTO mykemsn
FROM dual;
SELECT :new.kemag
INTO mykemag
FROM dual;
SELECT :new.kemiskniau
INTO mykemiskniau
FROM dual;
-- SELECT :new.KEMAG, :new.KEMISKNIAU INTO myKEMAG, myKEMISKNIAU FROM dual;
--dbms_output.put_line( myHAL );
IF ( myhal = 0
AND myblyfrihal = 0
AND mykemsn = 0
AND mykemag = 0
AND mykemiskniau = 0 ) THEN
Raise_application_error(-20101, 'no surface?');
ELSIF ( myhal + myblyfrihal + mykemsn + mykemag
+ mykemiskniau <> 1 ) THEN
Raise_application_error(-20102, 'many surfaces?');
ELSIF ( myhal < 0
OR myblyfrihal < 0
OR mykemsn < 0
OR mykemag < 0
OR mykemiskniau < 0 ) THEN
Raise_application_error(-20103, 'kind of surface?');
END IF;
END;
/
INSERT INTO cam_job
VALUES ( '114X00271722',
'3 035 7800 050',
12,
672,
0,
0,
0,
1,
0,
-- '97-01-31 09:26:50'
current_timestamp );
UPDATE cam_job
SET hal = 1,
blyfrihal = 0,
kemsn = 0,
kemag = 0,
kemiskniau = 1
WHERE varenummer = '114X00271723';
variable my_id NUMBER;
UPDATE cam_job
SET hal = 1
WHERE varenummer = '114X00271723'
returning my_id INTO :id;
INSERT INTO cam_job
VALUES ('114X00271722',
'3 035 7800 050',
12,
672,
0,
0,
0,
1,
0,
current_timestamp);
INSERT INTO cam_job
VALUES ('292X01801018',
'9779994-04',
7,
21,
0,
1,
0,
0,
0,
current_timestamp);
--DROP TRIGGER check_duplicate_trig;
--DROP TABLE cam_layer;
CREATE TABLE cam_layer
(
varenummer VARCHAR(20) NOT NULL,
layername VARCHAR(10) NOT NULL,
layertype VARCHAR(10) NOT NULL,
lines NUMBER(32, 16) NOT NULL,
SPACE NUMBER(32, 16) NOT NULL,
via2cu NUMBER(32, 16) NOT NULL,
annring NUMBER(32, 16) NOT NULL,
cupercent NUMBER(32, 16) NOT NULL,
doneat TIMESTAMP NOT NULL,
CONSTRAINT layer_pk FOREIGN KEY (varenummer) REFERENCES cam_job(varenummer)
ON DELETE CASCADE
);
-- this trigger disallows to insert a layername that already exists for a particular varenummer
CREATE OR replace TRIGGER check_duplicate_trig
BEFORE INSERT OR UPDATE ON cam_layer
FOR EACH ROW
DECLARE
mylayernamecount INT;
myvarenummercount INT;
mylayername VARCHAR(20);
myvarenummer VARCHAR(20);
BEGIN
SELECT :new.layername
INTO mylayername
FROM dual;
SELECT :new.varenummer
INTO myvarenummer
FROM dual;
SELECT Count(*)
INTO myvarenummercount
FROM cam_layer
WHERE varenummer = myvarenummer;
SELECT Count(*)
INTO mylayernamecount
FROM cam_layer
WHERE layername = mylayername;
IF ( ( mylayernamecount > 0 )
AND ( myvarenummercount > 0 ) ) THEN
Raise_application_error(-20102, 'layer exists.');
END IF;
END;
/