EBS FORM开发全过程(2)

1.基于EBS的Forms开发过程

本小节的脚本在PL/SQL Developer中,用APPS登录,在Command Window中运行

1.1创建数据库对象

创建相关基表

点击查看代码
-- Create table
create table SECOM.DEPARTMENTS
(
  DEPARTMENT_ID   NUMBER(4) not null,
  DEPARTMENT_NAME VARCHAR2(30) not null,
  MANAGER_ID      NUMBER(6),
  LOCATION_ID     NUMBER(4)
);
insert into SECOM.departments (DEPARTMENT_ID, DEPARTMENT_NAME, MANAGER_ID, LOCATION_ID)
values (10, 'Administration', 200, 1700);

insert into SECOM.departments (DEPARTMENT_ID, DEPARTMENT_NAME, MANAGER_ID, LOCATION_ID)
values (20, 'Marketing', 201, 1800);

insert into SECOM.departments (DEPARTMENT_ID, DEPARTMENT_NAME, MANAGER_ID, LOCATION_ID)
values (50, 'Shipping', 124, 1500);

insert into SECOM.departments (DEPARTMENT_ID, DEPARTMENT_NAME, MANAGER_ID, LOCATION_ID)
values (60, 'IT', 103, 1400);

insert into SECOM.departments (DEPARTMENT_ID, DEPARTMENT_NAME, MANAGER_ID, LOCATION_ID)
values (80, 'Sales', 149, 2500);

insert into SECOM.departments (DEPARTMENT_ID, DEPARTMENT_NAME, MANAGER_ID, LOCATION_ID)
values (90, 'Executive', 100, 1700);

insert into SECOM.departments (DEPARTMENT_ID, DEPARTMENT_NAME, MANAGER_ID, LOCATION_ID)
values (110, 'Accounting', 205, 1700);

insert into SECOM.departments (DEPARTMENT_ID, DEPARTMENT_NAME, MANAGER_ID, LOCATION_ID)
values (190, 'Contracting', null, 1700);

commit;

select * from  SECOM.departments;

-- Create table
create table SECOM.employees
(
  EMPLOYEE_ID    NUMBER(6) not null,
  FIRST_NAME     VARCHAR2(20),
  LAST_NAME      VARCHAR2(25),
  EMAIL          VARCHAR2(25),
  PHONE_NUMBER   VARCHAR2(20),
  HIRE_DATE      DATE,
  JOB_ID         VARCHAR2(10),
  SALARY         NUMBER(8,2),
  COMMISSION_PCT NUMBER(2,2),
  MANAGER_ID     NUMBER(6),
  DEPARTMENT_ID  NUMBER(4)
);
insert into SECOM.employees (EMPLOYEE_ID, FIRST_NAME, LAST_NAME, EMAIL, PHONE_NUMBER, HIRE_DATE, JOB_ID, SALARY, COMMISSION_PCT, MANAGER_ID, DEPARTMENT_ID)
values (198, 'Donald', 'OConnell', 'DOCONNEL', '650.507.9833', to_date('17-03-2013 10:46:48', 'dd-mm-yyyy hh24:mi:ss'), 'SH_CLERK', 2600.00, null, 124, 50);

insert into SECOM.employees (EMPLOYEE_ID, FIRST_NAME, LAST_NAME, EMAIL, PHONE_NUMBER, HIRE_DATE, JOB_ID, SALARY, COMMISSION_PCT, MANAGER_ID, DEPARTMENT_ID)
values (199, 'Douglas', 'Grant', 'DGRANT', '650.507.9844', to_date('17-03-2013 10:46:48', 'dd-mm-yyyy hh24:mi:ss'), 'SH_CLERK', 2600.00, null, 124, 50);

insert into SECOM.employees (EMPLOYEE_ID, FIRST_NAME, LAST_NAME, EMAIL, PHONE_NUMBER, HIRE_DATE, JOB_ID, SALARY, COMMISSION_PCT, MANAGER_ID, DEPARTMENT_ID)
values (201, 'Michael', 'Hartstein', 'MHARTSTE', '515.123.5555', to_date('17-03-2013 10:46:48', 'dd-mm-yyyy hh24:mi:ss'), 'MK_MAN', 13000.00, null, 100, 20);

insert into SECOM.employees (EMPLOYEE_ID, FIRST_NAME, LAST_NAME, EMAIL, PHONE_NUMBER, HIRE_DATE, JOB_ID, SALARY, COMMISSION_PCT, MANAGER_ID, DEPARTMENT_ID)
values (202, 'Pat', 'Fay', 'PFAY', '603.123.6666', to_date('17-03-2013 10:46:48', 'dd-mm-yyyy hh24:mi:ss'), 'MK_REP', 6000.00, null, 201, 20);

insert into SECOM.employees (EMPLOYEE_ID, FIRST_NAME, LAST_NAME, EMAIL, PHONE_NUMBER, HIRE_DATE, JOB_ID, SALARY, COMMISSION_PCT, MANAGER_ID, DEPARTMENT_ID)
values (203, 'Susan', 'Mavris', 'SMAVRIS', '515.123.7777', to_date('17-03-2013 10:46:48', 'dd-mm-yyyy hh24:mi:ss'), 'HR_REP', 6500.00, null, 101, 40);

insert into SECOM.employees (EMPLOYEE_ID, FIRST_NAME, LAST_NAME, EMAIL, PHONE_NUMBER, HIRE_DATE, JOB_ID, SALARY, COMMISSION_PCT, MANAGER_ID, DEPARTMENT_ID)
values (204, 'Hermann', 'Baer', 'HBAER', '515.123.8888', to_date('17-03-2013 10:46:48', 'dd-mm-yyyy hh24:mi:ss'), 'PR_REP', 10000.00, null, 101, 70);

insert into SECOM.employees (EMPLOYEE_ID, FIRST_NAME, LAST_NAME, EMAIL, PHONE_NUMBER, HIRE_DATE, JOB_ID, SALARY, COMMISSION_PCT, MANAGER_ID, DEPARTMENT_ID)
values (205, 'Shelley', 'Higgins', 'SHIGGINS', '515.123.8080', to_date('17-03-2013 10:46:48', 'dd-mm-yyyy hh24:mi:ss'), 'AC_MGR', 12000.00, null, 101, 110);

insert into SECOM.employees (EMPLOYEE_ID, FIRST_NAME, LAST_NAME, EMAIL, PHONE_NUMBER, HIRE_DATE, JOB_ID, SALARY, COMMISSION_PCT, MANAGER_ID, DEPARTMENT_ID)
values (206, 'William', 'Gietz', 'WGIETZ', '515.123.8181', to_date('17-03-2013 10:46:48', 'dd-mm-yyyy hh24:mi:ss'), 'SY_ANAL', 8300.00, null, 205, 110);

insert into SECOM.employees (EMPLOYEE_ID, FIRST_NAME, LAST_NAME, EMAIL, PHONE_NUMBER, HIRE_DATE, JOB_ID, SALARY, COMMISSION_PCT, MANAGER_ID, DEPARTMENT_ID)
values (100, 'Steven', 'King', 'SKING', '515.123.4567', to_date('17-03-2013 10:46:48', 'dd-mm-yyyy hh24:mi:ss'), 'AD_PRES', 24000.00, null, null, 90);

insert into SECOM.employees (EMPLOYEE_ID, FIRST_NAME, LAST_NAME, EMAIL, PHONE_NUMBER, HIRE_DATE, JOB_ID, SALARY, COMMISSION_PCT, MANAGER_ID, DEPARTMENT_ID)
values (101, 'Neena', 'Kochhar', 'NKOCHHAR', '515.123.4568', to_date('17-03-2013 10:46:48', 'dd-mm-yyyy hh24:mi:ss'), 'AD_VP', 17000.00, null, 100, 90);

insert into SECOM.employees (EMPLOYEE_ID, FIRST_NAME, LAST_NAME, EMAIL, PHONE_NUMBER, HIRE_DATE, JOB_ID, SALARY, COMMISSION_PCT, MANAGER_ID, DEPARTMENT_ID)
values (102, 'Lex', 'De Haan', 'LDEHAAN', '515.123.4569', to_date('17-03-2013 10:46:48', 'dd-mm-yyyy hh24:mi:ss'), 'AD_VP', 17000.00, null, 100, 90);

insert into SECOM.employees (EMPLOYEE_ID, FIRST_NAME, LAST_NAME, EMAIL, PHONE_NUMBER, HIRE_DATE, JOB_ID, SALARY, COMMISSION_PCT, MANAGER_ID, DEPARTMENT_ID)
values (103, 'Alexander', 'Hunold', 'AHUNOLD', '590.423.4567', to_date('17-03-2013 10:46:48', 'dd-mm-yyyy hh24:mi:ss'), 'IT_PROG', 9000.00, null, 102, 60);

insert into SECOM.employees (EMPLOYEE_ID, FIRST_NAME, LAST_NAME, EMAIL, PHONE_NUMBER, HIRE_DATE, JOB_ID, SALARY, COMMISSION_PCT, MANAGER_ID, DEPARTMENT_ID)
values (104, 'Bruce', 'Ernst', 'BERNST', '590.423.4568', to_date('17-03-2013 10:46:48', 'dd-mm-yyyy hh24:mi:ss'), 'IT_PROG', 6000.00, null, 103, 60);

insert into SECOM.employees (EMPLOYEE_ID, FIRST_NAME, LAST_NAME, EMAIL, PHONE_NUMBER, HIRE_DATE, JOB_ID, SALARY, COMMISSION_PCT, MANAGER_ID, DEPARTMENT_ID)
values (105, 'David', 'Austin', 'DAUSTIN', '590.423.4569', to_date('17-03-2013 10:46:48', 'dd-mm-yyyy hh24:mi:ss'), 'IT_PROG', 4800.00, null, 103, 60);

insert into SECOM.employees (EMPLOYEE_ID, FIRST_NAME, LAST_NAME, EMAIL, PHONE_NUMBER, HIRE_DATE, JOB_ID, SALARY, COMMISSION_PCT, MANAGER_ID, DEPARTMENT_ID)
values (106, 'Valli', 'Pataballa', 'VPATABAL', '590.423.4560', to_date('17-03-2013 10:46:48', 'dd-mm-yyyy hh24:mi:ss'), 'SY_ANAL', 4800.00, null, 103, 60);

insert into SECOM.employees (EMPLOYEE_ID, FIRST_NAME, LAST_NAME, EMAIL, PHONE_NUMBER, HIRE_DATE, JOB_ID, SALARY, COMMISSION_PCT, MANAGER_ID, DEPARTMENT_ID)
values (107, 'Diana', 'Lorentz', 'DLORENTZ', '590.423.5567', to_date('17-03-2013 10:46:48', 'dd-mm-yyyy hh24:mi:ss'), 'IT_PROG', 4200.00, null, 103, 60);

insert into SECOM.employees (EMPLOYEE_ID, FIRST_NAME, LAST_NAME, EMAIL, PHONE_NUMBER, HIRE_DATE, JOB_ID, SALARY, COMMISSION_PCT, MANAGER_ID, DEPARTMENT_ID)
values (108, 'Nancy', 'Greenberg', 'NGREENBE', '515.124.4569', to_date('17-03-2013 10:46:48', 'dd-mm-yyyy hh24:mi:ss'), 'FI_MGR', 12000.00, null, 101, 100);

insert into SECOM.employees (EMPLOYEE_ID, FIRST_NAME, LAST_NAME, EMAIL, PHONE_NUMBER, HIRE_DATE, JOB_ID, SALARY, COMMISSION_PCT, MANAGER_ID, DEPARTMENT_ID)
values (109, 'Daniel', 'Faviet', 'DFAVIET', '515.124.4169', to_date('17-03-2013 10:46:48', 'dd-mm-yyyy hh24:mi:ss'), 'FI_ACCOUNT', 9000.00, null, 108, 100);

insert into SECOM.employees (EMPLOYEE_ID, FIRST_NAME, LAST_NAME, EMAIL, PHONE_NUMBER, HIRE_DATE, JOB_ID, SALARY, COMMISSION_PCT, MANAGER_ID, DEPARTMENT_ID)
values (110, 'John', 'Chen', 'JCHEN', '515.124.4269', to_date('17-03-2013 10:46:48', 'dd-mm-yyyy hh24:mi:ss'), 'FI_ACCOUNT', 8200.00, null, 108, 100);

insert into SECOM.employees (EMPLOYEE_ID, FIRST_NAME, LAST_NAME, EMAIL, PHONE_NUMBER, HIRE_DATE, JOB_ID, SALARY, COMMISSION_PCT, MANAGER_ID, DEPARTMENT_ID)
values (111, 'Ismael', 'Sciarra', 'ISCIARRA', '515.124.4369', to_date('17-03-2013 10:46:48', 'dd-mm-yyyy hh24:mi:ss'), 'FI_ACCOUNT', 7700.00, null, 108, 100);

insert into SECOM.employees (EMPLOYEE_ID, FIRST_NAME, LAST_NAME, EMAIL, PHONE_NUMBER, HIRE_DATE, JOB_ID, SALARY, COMMISSION_PCT, MANAGER_ID, DEPARTMENT_ID)
values (112, 'Jose Manuel', 'Urman', 'JMURMAN', '515.124.4469', to_date('17-03-2013 10:46:48', 'dd-mm-yyyy hh24:mi:ss'), 'FI_ACCOUNT', 7800.00, null, 108, 100);

insert into SECOM.employees (EMPLOYEE_ID, FIRST_NAME, LAST_NAME, EMAIL, PHONE_NUMBER, HIRE_DATE, JOB_ID, SALARY, COMMISSION_PCT, MANAGER_ID, DEPARTMENT_ID)
values (113, 'Luis', 'Popp', 'LPOPP', '515.124.4567', to_date('17-03-2013 10:46:48', 'dd-mm-yyyy hh24:mi:ss'), 'FI_ACCOUNT', 6900.00, null, 108, 100);

insert into SECOM.employees (EMPLOYEE_ID, FIRST_NAME, LAST_NAME, EMAIL, PHONE_NUMBER, HIRE_DATE, JOB_ID, SALARY, COMMISSION_PCT, MANAGER_ID, DEPARTMENT_ID)
values (114, 'Den', 'Raphaely', 'DRAPHEAL', '515.127.4561', to_date('17-03-2013 10:46:48', 'dd-mm-yyyy hh24:mi:ss'), 'PU_MAN', 11000.00, null, 100, 30);

insert into SECOM.employees (EMPLOYEE_ID, FIRST_NAME, LAST_NAME, EMAIL, PHONE_NUMBER, HIRE_DATE, JOB_ID, SALARY, COMMISSION_PCT, MANAGER_ID, DEPARTMENT_ID)
values (115, 'Alexander', 'Khoo', 'AKHOO', '515.127.4562', to_date('17-03-2013 10:46:48', 'dd-mm-yyyy hh24:mi:ss'), 'PU_CLERK', 3100.00, null, 114, 30);

insert into SECOM.employees (EMPLOYEE_ID, FIRST_NAME, LAST_NAME, EMAIL, PHONE_NUMBER, HIRE_DATE, JOB_ID, SALARY, COMMISSION_PCT, MANAGER_ID, DEPARTMENT_ID)
values (116, 'Shelli', 'Baida', 'SBAIDA', '515.127.4563', to_date('17-03-2013 10:46:48', 'dd-mm-yyyy hh24:mi:ss'), 'PU_CLERK', 2900.00, null, 114, 30);

insert into SECOM.employees (EMPLOYEE_ID, FIRST_NAME, LAST_NAME, EMAIL, PHONE_NUMBER, HIRE_DATE, JOB_ID, SALARY, COMMISSION_PCT, MANAGER_ID, DEPARTMENT_ID)
values (117, 'Sigal', 'Tobias', 'STOBIAS', '515.127.4564', to_date('17-03-2013 10:46:48', 'dd-mm-yyyy hh24:mi:ss'), 'PU_CLERK', 2800.00, null, 114, 30);

insert into SECOM.employees (EMPLOYEE_ID, FIRST_NAME, LAST_NAME, EMAIL, PHONE_NUMBER, HIRE_DATE, JOB_ID, SALARY, COMMISSION_PCT, MANAGER_ID, DEPARTMENT_ID)
values (118, 'Guy', 'Himuro', 'GHIMURO', '515.127.4565', to_date('17-03-2013 10:46:48', 'dd-mm-yyyy hh24:mi:ss'), 'PU_CLERK', 2600.00, null, 114, 30);

insert into SECOM.employees (EMPLOYEE_ID, FIRST_NAME, LAST_NAME, EMAIL, PHONE_NUMBER, HIRE_DATE, JOB_ID, SALARY, COMMISSION_PCT, MANAGER_ID, DEPARTMENT_ID)
values (119, 'Karen', 'Colmenares', 'KCOLMENA', '515.127.4566', to_date('17-03-2013 10:46:48', 'dd-mm-yyyy hh24:mi:ss'), 'PU_CLERK', 2500.00, null, 114, 30);

insert into SECOM.employees (EMPLOYEE_ID, FIRST_NAME, LAST_NAME, EMAIL, PHONE_NUMBER, HIRE_DATE, JOB_ID, SALARY, COMMISSION_PCT, MANAGER_ID, DEPARTMENT_ID)
values (120, 'Matthew', 'Weiss', 'MWEISS', '650.123.1234', to_date('17-03-2013 10:46:48', 'dd-mm-yyyy hh24:mi:ss'), 'ST_MAN', 8000.00, null, 100, 50);

insert into SECOM.employees (EMPLOYEE_ID, FIRST_NAME, LAST_NAME, EMAIL, PHONE_NUMBER, HIRE_DATE, JOB_ID, SALARY, COMMISSION_PCT, MANAGER_ID, DEPARTMENT_ID)
values (121, 'Adam', 'Fripp', 'AFRIPP', '650.123.2234', to_date('17-03-2013 10:46:48', 'dd-mm-yyyy hh24:mi:ss'), 'ST_MAN', 8200.00, null, 100, 50);

insert into SECOM.employees (EMPLOYEE_ID, FIRST_NAME, LAST_NAME, EMAIL, PHONE_NUMBER, HIRE_DATE, JOB_ID, SALARY, COMMISSION_PCT, MANAGER_ID, DEPARTMENT_ID)
values (122, 'Payam', 'Kaufling', 'PKAUFLIN', '650.123.3234', to_date('17-03-2013 10:46:48', 'dd-mm-yyyy hh24:mi:ss'), 'ST_MAN', 7900.00, null, 100, 50);

insert into SECOM.employees (EMPLOYEE_ID, FIRST_NAME, LAST_NAME, EMAIL, PHONE_NUMBER, HIRE_DATE, JOB_ID, SALARY, COMMISSION_PCT, MANAGER_ID, DEPARTMENT_ID)
values (123, 'Shanta', 'Vollman', 'SVOLLMAN', '650.123.4234', to_date('17-03-2013 10:46:48', 'dd-mm-yyyy hh24:mi:ss'), 'ST_MAN', 6500.00, null, 100, 50);

insert into SECOM.employees (EMPLOYEE_ID, FIRST_NAME, LAST_NAME, EMAIL, PHONE_NUMBER, HIRE_DATE, JOB_ID, SALARY, COMMISSION_PCT, MANAGER_ID, DEPARTMENT_ID)
values (124, 'Kevin', 'Mourgos', 'KMOURGOS', '650.123.5234', to_date('17-03-2013 10:46:48', 'dd-mm-yyyy hh24:mi:ss'), 'ST_MAN', 5800.00, null, 100, 50);

insert into SECOM.employees (EMPLOYEE_ID, FIRST_NAME, LAST_NAME, EMAIL, PHONE_NUMBER, HIRE_DATE, JOB_ID, SALARY, COMMISSION_PCT, MANAGER_ID, DEPARTMENT_ID)
values (125, 'Julia', 'Nayer', 'JNAYER', '650.124.1214', to_date('17-03-2013 10:46:48', 'dd-mm-yyyy hh24:mi:ss'), 'ST_CLERK', 3200.00, null, 120, 50);

insert into SECOM.employees (EMPLOYEE_ID, FIRST_NAME, LAST_NAME, EMAIL, PHONE_NUMBER, HIRE_DATE, JOB_ID, SALARY, COMMISSION_PCT, MANAGER_ID, DEPARTMENT_ID)
values (126, 'Irene', 'Mikkilineni', 'IMIKKILI', '650.124.1224', to_date('17-03-2013 10:46:48', 'dd-mm-yyyy hh24:mi:ss'), 'ST_CLERK', 2700.00, null, 120, 50);

insert into SECOM.employees (EMPLOYEE_ID, FIRST_NAME, LAST_NAME, EMAIL, PHONE_NUMBER, HIRE_DATE, JOB_ID, SALARY, COMMISSION_PCT, MANAGER_ID, DEPARTMENT_ID)
values (127, 'James', 'Landry', 'JLANDRY', '650.124.1334', to_date('17-03-2013 10:46:48', 'dd-mm-yyyy hh24:mi:ss'), 'ST_CLERK', 2400.00, null, 120, 50);

insert into SECOM.employees (EMPLOYEE_ID, FIRST_NAME, LAST_NAME, EMAIL, PHONE_NUMBER, HIRE_DATE, JOB_ID, SALARY, COMMISSION_PCT, MANAGER_ID, DEPARTMENT_ID)
values (128, 'Steven', 'Markle', 'SMARKLE', '650.124.1434', to_date('17-03-2013 10:46:48', 'dd-mm-yyyy hh24:mi:ss'), 'ST_CLERK', 2200.00, null, 120, 50);

insert into SECOM.employees (EMPLOYEE_ID, FIRST_NAME, LAST_NAME, EMAIL, PHONE_NUMBER, HIRE_DATE, JOB_ID, SALARY, COMMISSION_PCT, MANAGER_ID, DEPARTMENT_ID)
values (129, 'Laura', 'Bissot', 'LBISSOT', '650.124.5234', to_date('17-03-2013 10:46:48', 'dd-mm-yyyy hh24:mi:ss'), 'ST_CLERK', 3300.00, null, 121, 50);

insert into SECOM.employees (EMPLOYEE_ID, FIRST_NAME, LAST_NAME, EMAIL, PHONE_NUMBER, HIRE_DATE, JOB_ID, SALARY, COMMISSION_PCT, MANAGER_ID, DEPARTMENT_ID)
values (130, 'Mozhe', 'Atkinson', 'MATKINSO', '650.124.6234', to_date('17-03-2013 10:46:48', 'dd-mm-yyyy hh24:mi:ss'), 'ST_CLERK', 2800.00, null, 121, 50);

insert into SECOM.employees (EMPLOYEE_ID, FIRST_NAME, LAST_NAME, EMAIL, PHONE_NUMBER, HIRE_DATE, JOB_ID, SALARY, COMMISSION_PCT, MANAGER_ID, DEPARTMENT_ID)
values (131, 'James', 'Marlow', 'JAMRLOW', '650.124.7234', to_date('17-03-2013 10:46:48', 'dd-mm-yyyy hh24:mi:ss'), 'ST_CLERK', 2500.00, null, 121, 50);

insert into SECOM.employees (EMPLOYEE_ID, FIRST_NAME, LAST_NAME, EMAIL, PHONE_NUMBER, HIRE_DATE, JOB_ID, SALARY, COMMISSION_PCT, MANAGER_ID, DEPARTMENT_ID)
values (132, 'TJ', 'Olson', 'TJOLSON', '650.124.8234', to_date('17-03-2013 10:46:48', 'dd-mm-yyyy hh24:mi:ss'), 'ST_CLERK', 2100.00, null, 121, 50);

insert into SECOM.employees (EMPLOYEE_ID, FIRST_NAME, LAST_NAME, EMAIL, PHONE_NUMBER, HIRE_DATE, JOB_ID, SALARY, COMMISSION_PCT, MANAGER_ID, DEPARTMENT_ID)
values (133, 'Jason', 'Mallin', 'JMALLIN', '650.127.1934', to_date('17-03-2013 10:46:48', 'dd-mm-yyyy hh24:mi:ss'), 'ST_CLERK', 3300.00, null, 122, 50);

insert into SECOM.employees (EMPLOYEE_ID, FIRST_NAME, LAST_NAME, EMAIL, PHONE_NUMBER, HIRE_DATE, JOB_ID, SALARY, COMMISSION_PCT, MANAGER_ID, DEPARTMENT_ID)
values (134, 'Michael', 'Rogers', 'MROGERS', '650.127.1834', to_date('17-03-2013 10:46:48', 'dd-mm-yyyy hh24:mi:ss'), 'ST_CLERK', 2900.00, null, 122, 50);

insert into SECOM.employees (EMPLOYEE_ID, FIRST_NAME, LAST_NAME, EMAIL, PHONE_NUMBER, HIRE_DATE, JOB_ID, SALARY, COMMISSION_PCT, MANAGER_ID, DEPARTMENT_ID)
values (135, 'Ki', 'Gee', 'KGEE', '650.127.1734', to_date('17-03-2013 10:46:48', 'dd-mm-yyyy hh24:mi:ss'), 'ST_CLERK', 2400.00, null, 122, 50);

insert into SECOM.employees (EMPLOYEE_ID, FIRST_NAME, LAST_NAME, EMAIL, PHONE_NUMBER, HIRE_DATE, JOB_ID, SALARY, COMMISSION_PCT, MANAGER_ID, DEPARTMENT_ID)
values (136, 'Hazel', 'Philtanker', 'HPHILTAN', '650.127.1634', to_date('17-03-2013 10:46:48', 'dd-mm-yyyy hh24:mi:ss'), 'ST_CLERK', 3200.00, null, 122, 50);

insert into SECOM.employees (EMPLOYEE_ID, FIRST_NAME, LAST_NAME, EMAIL, PHONE_NUMBER, HIRE_DATE, JOB_ID, SALARY, COMMISSION_PCT, MANAGER_ID, DEPARTMENT_ID)
values (137, 'Renske', 'Ladwig', 'RLADWIG', '650.121.1234', to_date('17-03-2013 10:46:48', 'dd-mm-yyyy hh24:mi:ss'), 'ST_CLERK', 3600.00, null, 123, 50);

insert into SECOM.employees (EMPLOYEE_ID, FIRST_NAME, LAST_NAME, EMAIL, PHONE_NUMBER, HIRE_DATE, JOB_ID, SALARY, COMMISSION_PCT, MANAGER_ID, DEPARTMENT_ID)
values (138, 'Stephen', 'Stiles', 'SSTILES', '650.121.2034', to_date('17-03-2013 10:46:48', 'dd-mm-yyyy hh24:mi:ss'), 'ST_CLERK', 3200.00, null, 123, 50);

insert into SECOM.employees (EMPLOYEE_ID, FIRST_NAME, LAST_NAME, EMAIL, PHONE_NUMBER, HIRE_DATE, JOB_ID, SALARY, COMMISSION_PCT, MANAGER_ID, DEPARTMENT_ID)
values (139, 'John', 'Seo', 'JSEO', '650.121.2019', to_date('17-03-2013 10:46:48', 'dd-mm-yyyy hh24:mi:ss'), 'ST_CLERK', 2700.00, null, 123, 50);

insert into SECOM.employees (EMPLOYEE_ID, FIRST_NAME, LAST_NAME, EMAIL, PHONE_NUMBER, HIRE_DATE, JOB_ID, SALARY, COMMISSION_PCT, MANAGER_ID, DEPARTMENT_ID)
values (140, 'Joshua', 'Patel', 'JPATEL', '650.121.1834', to_date('17-03-2013 10:46:48', 'dd-mm-yyyy hh24:mi:ss'), 'ST_CLERK', 2500.00, null, 123, 50);

insert into SECOM.employees (EMPLOYEE_ID, FIRST_NAME, LAST_NAME, EMAIL, PHONE_NUMBER, HIRE_DATE, JOB_ID, SALARY, COMMISSION_PCT, MANAGER_ID, DEPARTMENT_ID)
values (141, 'Trenna', 'Rajs', 'TRAJS', '650.121.8009', to_date('17-03-2013 10:46:48', 'dd-mm-yyyy hh24:mi:ss'), 'ST_CLERK', 3500.00, null, 124, 50);

insert into SECOM.employees (EMPLOYEE_ID, FIRST_NAME, LAST_NAME, EMAIL, PHONE_NUMBER, HIRE_DATE, JOB_ID, SALARY, COMMISSION_PCT, MANAGER_ID, DEPARTMENT_ID)
values (142, 'Curtis', 'Davies', 'CDAVIES', '650.121.2994', to_date('17-03-2013 10:46:48', 'dd-mm-yyyy hh24:mi:ss'), 'ST_CLERK', 3100.00, null, 124, 50);

insert into SECOM.employees (EMPLOYEE_ID, FIRST_NAME, LAST_NAME, EMAIL, PHONE_NUMBER, HIRE_DATE, JOB_ID, SALARY, COMMISSION_PCT, MANAGER_ID, DEPARTMENT_ID)
values (143, 'Randall', 'Matos', 'RMATOS', '650.121.2874', to_date('17-03-2013 10:46:48', 'dd-mm-yyyy hh24:mi:ss'), 'ST_CLERK', 2600.00, null, 124, 50);

insert into SECOM.employees (EMPLOYEE_ID, FIRST_NAME, LAST_NAME, EMAIL, PHONE_NUMBER, HIRE_DATE, JOB_ID, SALARY, COMMISSION_PCT, MANAGER_ID, DEPARTMENT_ID)
values (144, 'Peter', 'Vargas', 'PVARGAS', '650.121.2004', to_date('17-03-2013 10:46:48', 'dd-mm-yyyy hh24:mi:ss'), 'ST_CLERK', 2500.00, null, 124, 50);

insert into SECOM.employees (EMPLOYEE_ID, FIRST_NAME, LAST_NAME, EMAIL, PHONE_NUMBER, HIRE_DATE, JOB_ID, SALARY, COMMISSION_PCT, MANAGER_ID, DEPARTMENT_ID)
values (145, 'John', 'Russell', 'JRUSSEL', '011.44.1344.429268', to_date('17-03-2013 10:46:48', 'dd-mm-yyyy hh24:mi:ss'), 'SA_MAN', 14000.00, 0.40, 100, 80);

insert into SECOM.employees (EMPLOYEE_ID, FIRST_NAME, LAST_NAME, EMAIL, PHONE_NUMBER, HIRE_DATE, JOB_ID, SALARY, COMMISSION_PCT, MANAGER_ID, DEPARTMENT_ID)
values (146, 'Karen', 'Partners', 'KPARTNER', '011.44.1344.467268', to_date('17-03-2013 10:46:48', 'dd-mm-yyyy hh24:mi:ss'), 'SA_MAN', 13500.00, 0.30, 100, 80);

insert into SECOM.employees (EMPLOYEE_ID, FIRST_NAME, LAST_NAME, EMAIL, PHONE_NUMBER, HIRE_DATE, JOB_ID, SALARY, COMMISSION_PCT, MANAGER_ID, DEPARTMENT_ID)
values (147, 'Alberto', 'Errazuriz', 'AERRAZUR', '011.44.1344.429278', to_date('17-03-2013 10:46:48', 'dd-mm-yyyy hh24:mi:ss'), 'SA_MAN', 12000.00, 0.30, 100, 80);

insert into SECOM.employees (EMPLOYEE_ID, FIRST_NAME, LAST_NAME, EMAIL, PHONE_NUMBER, HIRE_DATE, JOB_ID, SALARY, COMMISSION_PCT, MANAGER_ID, DEPARTMENT_ID)
values (148, 'Gerald', 'Cambrault', 'GCAMBRAU', '011.44.1344.619268', to_date('17-03-2013 10:46:48', 'dd-mm-yyyy hh24:mi:ss'), 'SA_MAN', 11000.00, 0.30, 100, 80);

insert into SECOM.employees (EMPLOYEE_ID, FIRST_NAME, LAST_NAME, EMAIL, PHONE_NUMBER, HIRE_DATE, JOB_ID, SALARY, COMMISSION_PCT, MANAGER_ID, DEPARTMENT_ID)
values (149, 'Eleni', 'Zlotkey', 'EZLOTKEY', '011.44.1344.429018', to_date('17-03-2013 10:46:48', 'dd-mm-yyyy hh24:mi:ss'), 'SA_MAN', 10500.00, 0.20, 100, 80);

insert into SECOM.employees (EMPLOYEE_ID, FIRST_NAME, LAST_NAME, EMAIL, PHONE_NUMBER, HIRE_DATE, JOB_ID, SALARY, COMMISSION_PCT, MANAGER_ID, DEPARTMENT_ID)
values (150, 'Peter', 'Tucker', 'PTUCKER', '011.44.1344.129268', to_date('17-03-2013 10:46:48', 'dd-mm-yyyy hh24:mi:ss'), 'SA_REP', 10000.00, 0.30, 145, 80);

insert into SECOM.employees (EMPLOYEE_ID, FIRST_NAME, LAST_NAME, EMAIL, PHONE_NUMBER, HIRE_DATE, JOB_ID, SALARY, COMMISSION_PCT, MANAGER_ID, DEPARTMENT_ID)
values (151, 'David', 'Bernstein', 'DBERNSTE', '011.44.1344.345268', to_date('17-03-2013 10:46:48', 'dd-mm-yyyy hh24:mi:ss'), 'SA_REP', 9500.00, 0.25, 145, 80);

insert into SECOM.employees (EMPLOYEE_ID, FIRST_NAME, LAST_NAME, EMAIL, PHONE_NUMBER, HIRE_DATE, JOB_ID, SALARY, COMMISSION_PCT, MANAGER_ID, DEPARTMENT_ID)
values (152, 'Peter', 'Hall', 'PHALL', '011.44.1344.478968', to_date('17-03-2013 10:46:48', 'dd-mm-yyyy hh24:mi:ss'), 'SA_REP', 9000.00, 0.25, 145, 80);

insert into SECOM.employees (EMPLOYEE_ID, FIRST_NAME, LAST_NAME, EMAIL, PHONE_NUMBER, HIRE_DATE, JOB_ID, SALARY, COMMISSION_PCT, MANAGER_ID, DEPARTMENT_ID)
values (153, 'Christopher', 'Olsen', 'COLSEN', '011.44.1344.498718', to_date('17-03-2013 10:46:48', 'dd-mm-yyyy hh24:mi:ss'), 'SA_REP', 8000.00, 0.20, 145, 80);

insert into SECOM.employees (EMPLOYEE_ID, FIRST_NAME, LAST_NAME, EMAIL, PHONE_NUMBER, HIRE_DATE, JOB_ID, SALARY, COMMISSION_PCT, MANAGER_ID, DEPARTMENT_ID)
values (154, 'Nanette', 'Cambrault', 'NCAMBRAU', '011.44.1344.987668', to_date('17-03-2013 10:46:48', 'dd-mm-yyyy hh24:mi:ss'), 'SA_REP', 7500.00, 0.20, 145, 80);

insert into SECOM.employees (EMPLOYEE_ID, FIRST_NAME, LAST_NAME, EMAIL, PHONE_NUMBER, HIRE_DATE, JOB_ID, SALARY, COMMISSION_PCT, MANAGER_ID, DEPARTMENT_ID)
values (155, 'Oliver', 'Tuvault', 'OTUVAULT', '011.44.1344.486508', to_date('17-03-2013 10:46:48', 'dd-mm-yyyy hh24:mi:ss'), 'SA_REP', 7000.00, 0.15, 145, 80);

insert into SECOM.employees (EMPLOYEE_ID, FIRST_NAME, LAST_NAME, EMAIL, PHONE_NUMBER, HIRE_DATE, JOB_ID, SALARY, COMMISSION_PCT, MANAGER_ID, DEPARTMENT_ID)
values (156, 'Janette', 'King', 'JKING', '011.44.1345.429268', to_date('17-03-2013 10:46:48', 'dd-mm-yyyy hh24:mi:ss'), 'SA_REP', 10000.00, 0.35, 146, 80);

insert into SECOM.employees (EMPLOYEE_ID, FIRST_NAME, LAST_NAME, EMAIL, PHONE_NUMBER, HIRE_DATE, JOB_ID, SALARY, COMMISSION_PCT, MANAGER_ID, DEPARTMENT_ID)
values (157, 'Patrick', 'Sully', 'PSULLY', '011.44.1345.929268', to_date('17-03-2013 10:46:48', 'dd-mm-yyyy hh24:mi:ss'), 'SA_REP', 9500.00, 0.35, 146, 80);

insert into SECOM.employees (EMPLOYEE_ID, FIRST_NAME, LAST_NAME, EMAIL, PHONE_NUMBER, HIRE_DATE, JOB_ID, SALARY, COMMISSION_PCT, MANAGER_ID, DEPARTMENT_ID)
values (158, 'Allan', 'McEwen', 'AMCEWEN', '011.44.1345.829268', to_date('17-03-2013 10:46:48', 'dd-mm-yyyy hh24:mi:ss'), 'SA_REP', 9000.00, 0.35, 146, 80);

insert into SECOM.employees (EMPLOYEE_ID, FIRST_NAME, LAST_NAME, EMAIL, PHONE_NUMBER, HIRE_DATE, JOB_ID, SALARY, COMMISSION_PCT, MANAGER_ID, DEPARTMENT_ID)
values (159, 'Lindsey', 'Smith', 'LSMITH', '011.44.1345.729268', to_date('17-03-2013 10:46:48', 'dd-mm-yyyy hh24:mi:ss'), 'SA_REP', 8000.00, 0.30, 146, 80);

insert into SECOM.employees (EMPLOYEE_ID, FIRST_NAME, LAST_NAME, EMAIL, PHONE_NUMBER, HIRE_DATE, JOB_ID, SALARY, COMMISSION_PCT, MANAGER_ID, DEPARTMENT_ID)
values (160, 'Louise', 'Doran', 'LDORAN', '011.44.1345.629268', to_date('17-03-2013 10:46:48', 'dd-mm-yyyy hh24:mi:ss'), 'SA_REP', 7500.00, 0.30, 146, 80);

insert into SECOM.employees (EMPLOYEE_ID, FIRST_NAME, LAST_NAME, EMAIL, PHONE_NUMBER, HIRE_DATE, JOB_ID, SALARY, COMMISSION_PCT, MANAGER_ID, DEPARTMENT_ID)
values (161, 'Sarath', 'Sewall', 'SSEWALL', '011.44.1345.529268', to_date('17-03-1990 10:46:48', 'dd-mm-yyyy hh24:mi:ss'), 'SA_REP', 7000.00, 0.25, 146, 80);

insert into SECOM.employees (EMPLOYEE_ID, FIRST_NAME, LAST_NAME, EMAIL, PHONE_NUMBER, HIRE_DATE, JOB_ID, SALARY, COMMISSION_PCT, MANAGER_ID, DEPARTMENT_ID)
values (162, 'Clara', 'Vishney', 'CVISHNEY', '011.44.1346.129268', to_date('17-03-1991 10:46:48', 'dd-mm-yyyy hh24:mi:ss'), 'SA_REP', 10500.00, 0.25, 147, 80);

insert into SECOM.employees (EMPLOYEE_ID, FIRST_NAME, LAST_NAME, EMAIL, PHONE_NUMBER, HIRE_DATE, JOB_ID, SALARY, COMMISSION_PCT, MANAGER_ID, DEPARTMENT_ID)
values (163, 'Danielle', 'Greene', 'DGREENE', '011.44.1346.229268', to_date('17-03-2013 10:46:48', 'dd-mm-yyyy hh24:mi:ss'), 'SA_REP', 9500.00, 0.15, 147, 80);

insert into SECOM.employees (EMPLOYEE_ID, FIRST_NAME, LAST_NAME, EMAIL, PHONE_NUMBER, HIRE_DATE, JOB_ID, SALARY, COMMISSION_PCT, MANAGER_ID, DEPARTMENT_ID)
values (164, 'Mattea', 'Marvins', 'MMARVINS', '011.44.1346.329268', to_date('17-03-2013 10:46:48', 'dd-mm-yyyy hh24:mi:ss'), 'SA_REP', 7200.00, 0.10, 147, 80);

insert into SECOM.employees (EMPLOYEE_ID, FIRST_NAME, LAST_NAME, EMAIL, PHONE_NUMBER, HIRE_DATE, JOB_ID, SALARY, COMMISSION_PCT, MANAGER_ID, DEPARTMENT_ID)
values (165, 'David', 'Lee', 'DLEE', '011.44.1346.529268', to_date('17-03-2013 10:46:48', 'dd-mm-yyyy hh24:mi:ss'), 'SA_REP', 6800.00, 0.10, 147, 80);

insert into SECOM.employees (EMPLOYEE_ID, FIRST_NAME, LAST_NAME, EMAIL, PHONE_NUMBER, HIRE_DATE, JOB_ID, SALARY, COMMISSION_PCT, MANAGER_ID, DEPARTMENT_ID)
values (166, 'Sundar', 'Ande', 'SANDE', '011.44.1346.629268', to_date('17-03-2013 10:46:48', 'dd-mm-yyyy hh24:mi:ss'), 'SA_REP', 6400.00, 0.10, 147, 80);

insert into SECOM.employees (EMPLOYEE_ID, FIRST_NAME, LAST_NAME, EMAIL, PHONE_NUMBER, HIRE_DATE, JOB_ID, SALARY, COMMISSION_PCT, MANAGER_ID, DEPARTMENT_ID)
values (167, 'Amit', 'Banda', 'ABANDA', '011.44.1346.729268', to_date('17-03-2013 10:46:48', 'dd-mm-yyyy hh24:mi:ss'), 'SA_REP', 6200.00, 0.10, 147, 80);

insert into SECOM.employees (EMPLOYEE_ID, FIRST_NAME, LAST_NAME, EMAIL, PHONE_NUMBER, HIRE_DATE, JOB_ID, SALARY, COMMISSION_PCT, MANAGER_ID, DEPARTMENT_ID)
values (168, 'Lisa', 'Ozer', 'LOZER', '011.44.1343.929268', to_date('17-03-2013 10:46:48', 'dd-mm-yyyy hh24:mi:ss'), 'SA_REP', 11500.00, 0.25, 148, 80);

insert into SECOM.employees (EMPLOYEE_ID, FIRST_NAME, LAST_NAME, EMAIL, PHONE_NUMBER, HIRE_DATE, JOB_ID, SALARY, COMMISSION_PCT, MANAGER_ID, DEPARTMENT_ID)
values (169, 'Harrison', 'Bloom', 'HBLOOM', '011.44.1343.829268', to_date('17-03-2013 10:46:48', 'dd-mm-yyyy hh24:mi:ss'), 'SA_REP', 10000.00, 0.20, 148, 80);

insert into SECOM.employees (EMPLOYEE_ID, FIRST_NAME, LAST_NAME, EMAIL, PHONE_NUMBER, HIRE_DATE, JOB_ID, SALARY, COMMISSION_PCT, MANAGER_ID, DEPARTMENT_ID)
values (170, 'Tayler', 'Fox', 'TFOX', '011.44.1343.729268', to_date('17-03-2013 10:46:48', 'dd-mm-yyyy hh24:mi:ss'), 'SA_REP', 9600.00, 0.20, 148, 80);

insert into SECOM.employees (EMPLOYEE_ID, FIRST_NAME, LAST_NAME, EMAIL, PHONE_NUMBER, HIRE_DATE, JOB_ID, SALARY, COMMISSION_PCT, MANAGER_ID, DEPARTMENT_ID)
values (171, 'William', 'Smith', 'WSMITH', '011.44.1343.629268', to_date('17-03-2013 10:46:48', 'dd-mm-yyyy hh24:mi:ss'), 'SA_REP', 7400.00, 0.15, 148, 80);

insert into SECOM.employees (EMPLOYEE_ID, FIRST_NAME, LAST_NAME, EMAIL, PHONE_NUMBER, HIRE_DATE, JOB_ID, SALARY, COMMISSION_PCT, MANAGER_ID, DEPARTMENT_ID)
values (172, 'Elizabeth', 'Bates', 'EBATES', '011.44.1343.529268', to_date('17-03-2013 10:46:48', 'dd-mm-yyyy hh24:mi:ss'), 'SA_REP', 7300.00, 0.15, 148, 80);

insert into SECOM.employees (EMPLOYEE_ID, FIRST_NAME, LAST_NAME, EMAIL, PHONE_NUMBER, HIRE_DATE, JOB_ID, SALARY, COMMISSION_PCT, MANAGER_ID, DEPARTMENT_ID)
values (173, 'Sundita', 'Kumar', 'SKUMAR', '011.44.1343.329268', to_date('17-03-2013 10:46:48', 'dd-mm-yyyy hh24:mi:ss'), 'SA_REP', 6100.00, 0.10, 148, 80);

insert into SECOM.employees (EMPLOYEE_ID, FIRST_NAME, LAST_NAME, EMAIL, PHONE_NUMBER, HIRE_DATE, JOB_ID, SALARY, COMMISSION_PCT, MANAGER_ID, DEPARTMENT_ID)
values (174, 'Ellen', 'Abel', 'EABEL', '011.44.1644.429267', to_date('17-03-2013 10:46:48', 'dd-mm-yyyy hh24:mi:ss'), 'SA_REP', 11000.00, 0.30, 149, 80);

insert into SECOM.employees (EMPLOYEE_ID, FIRST_NAME, LAST_NAME, EMAIL, PHONE_NUMBER, HIRE_DATE, JOB_ID, SALARY, COMMISSION_PCT, MANAGER_ID, DEPARTMENT_ID)
values (175, 'Alyssa', 'Hutton', 'AHUTTON', '011.44.1644.429266', to_date('17-03-2013 10:46:48', 'dd-mm-yyyy hh24:mi:ss'), 'SA_REP', 8800.00, 0.25, 149, 80);

insert into SECOM.employees (EMPLOYEE_ID, FIRST_NAME, LAST_NAME, EMAIL, PHONE_NUMBER, HIRE_DATE, JOB_ID, SALARY, COMMISSION_PCT, MANAGER_ID, DEPARTMENT_ID)
values (176, 'Jonathon', 'Taylor', 'JTAYLOR', '011.44.1644.429265', to_date('17-03-2013 10:46:48', 'dd-mm-yyyy hh24:mi:ss'), 'SA_REP', 8600.00, 0.20, 149, 80);

insert into SECOM.employees (EMPLOYEE_ID, FIRST_NAME, LAST_NAME, EMAIL, PHONE_NUMBER, HIRE_DATE, JOB_ID, SALARY, COMMISSION_PCT, MANAGER_ID, DEPARTMENT_ID)
values (177, 'Jack', 'Livingston', 'JLIVINGS', '011.44.1644.429264', to_date('17-03-2013 10:46:48', 'dd-mm-yyyy hh24:mi:ss'), 'SA_REP', 8400.00, 0.20, 149, 80);

insert into SECOM.employees (EMPLOYEE_ID, FIRST_NAME, LAST_NAME, EMAIL, PHONE_NUMBER, HIRE_DATE, JOB_ID, SALARY, COMMISSION_PCT, MANAGER_ID, DEPARTMENT_ID)
values (178, 'Kimberely', 'Grant', 'KGRANT', '011.44.1644.429263', to_date('17-03-2013 10:46:48', 'dd-mm-yyyy hh24:mi:ss'), 'SA_REP', 7000.00, 0.15, 149, 10);

insert into SECOM.employees (EMPLOYEE_ID, FIRST_NAME, LAST_NAME, EMAIL, PHONE_NUMBER, HIRE_DATE, JOB_ID, SALARY, COMMISSION_PCT, MANAGER_ID, DEPARTMENT_ID)
values (179, 'Charles', 'Johnson', 'CJOHNSON', '011.44.1644.429262', to_date('17-03-2013 10:46:48', 'dd-mm-yyyy hh24:mi:ss'), 'SA_REP', 6200.00, 0.10, 149, 80);

insert into SECOM.employees (EMPLOYEE_ID, FIRST_NAME, LAST_NAME, EMAIL, PHONE_NUMBER, HIRE_DATE, JOB_ID, SALARY, COMMISSION_PCT, MANAGER_ID, DEPARTMENT_ID)
values (180, 'Winston', 'Taylor', 'WTAYLOR', '650.507.9876', to_date('17-03-2013 10:46:48', 'dd-mm-yyyy hh24:mi:ss'), 'SH_CLERK', 3200.00, null, 120, 50);

insert into SECOM.employees (EMPLOYEE_ID, FIRST_NAME, LAST_NAME, EMAIL, PHONE_NUMBER, HIRE_DATE, JOB_ID, SALARY, COMMISSION_PCT, MANAGER_ID, DEPARTMENT_ID)
values (181, 'Jean', 'Fleaur', 'JFLEAUR', '650.507.9877', to_date('17-03-2013 10:46:48', 'dd-mm-yyyy hh24:mi:ss'), 'SH_CLERK', 3100.00, null, 120, 50);

insert into SECOM.employees (EMPLOYEE_ID, FIRST_NAME, LAST_NAME, EMAIL, PHONE_NUMBER, HIRE_DATE, JOB_ID, SALARY, COMMISSION_PCT, MANAGER_ID, DEPARTMENT_ID)
values (182, 'Martha', 'Sullivan', 'MSULLIVA', '650.507.9878', to_date('17-03-2013 10:46:48', 'dd-mm-yyyy hh24:mi:ss'), 'SH_CLERK', 2500.00, null, 120, 50);

insert into SECOM.employees (EMPLOYEE_ID, FIRST_NAME, LAST_NAME, EMAIL, PHONE_NUMBER, HIRE_DATE, JOB_ID, SALARY, COMMISSION_PCT, MANAGER_ID, DEPARTMENT_ID)
values (183, 'Girard', 'Geoni', 'GGEONI', '650.507.9879', to_date('17-03-2013 10:46:48', 'dd-mm-yyyy hh24:mi:ss'), 'SH_CLERK', 2800.00, null, 120, 50);

insert into SECOM.employees (EMPLOYEE_ID, FIRST_NAME, LAST_NAME, EMAIL, PHONE_NUMBER, HIRE_DATE, JOB_ID, SALARY, COMMISSION_PCT, MANAGER_ID, DEPARTMENT_ID)
values (184, 'Nandita', 'Sarchand', 'NSARCHAN', '650.509.1876', to_date('17-03-2013 10:46:48', 'dd-mm-yyyy hh24:mi:ss'), 'SH_CLERK', 4200.00, null, 121, 50);

insert into SECOM.employees (EMPLOYEE_ID, FIRST_NAME, LAST_NAME, EMAIL, PHONE_NUMBER, HIRE_DATE, JOB_ID, SALARY, COMMISSION_PCT, MANAGER_ID, DEPARTMENT_ID)
values (185, 'Alexis', 'Bull', 'ABULL', '650.509.2876', to_date('17-03-2013 10:46:48', 'dd-mm-yyyy hh24:mi:ss'), 'SH_CLERK', 4100.00, null, 121, 50);

insert into SECOM.employees (EMPLOYEE_ID, FIRST_NAME, LAST_NAME, EMAIL, PHONE_NUMBER, HIRE_DATE, JOB_ID, SALARY, COMMISSION_PCT, MANAGER_ID, DEPARTMENT_ID)
values (186, 'Julia', 'Dellinger', 'JDELLING', '650.509.3876', to_date('17-03-2013 10:46:48', 'dd-mm-yyyy hh24:mi:ss'), 'SH_CLERK', 3400.00, null, 121, 50);

insert into SECOM.employees (EMPLOYEE_ID, FIRST_NAME, LAST_NAME, EMAIL, PHONE_NUMBER, HIRE_DATE, JOB_ID, SALARY, COMMISSION_PCT, MANAGER_ID, DEPARTMENT_ID)
values (187, 'Anthony', 'Cabrio', 'ACABRIO', '650.509.4876', to_date('17-03-2013 10:46:48', 'dd-mm-yyyy hh24:mi:ss'), 'SH_CLERK', 3000.00, null, 121, 50);

insert into SECOM.employees (EMPLOYEE_ID, FIRST_NAME, LAST_NAME, EMAIL, PHONE_NUMBER, HIRE_DATE, JOB_ID, SALARY, COMMISSION_PCT, MANAGER_ID, DEPARTMENT_ID)
values (188, 'Kelly', 'Chung', 'KCHUNG', '650.505.1876', to_date('17-03-2013 10:46:48', 'dd-mm-yyyy hh24:mi:ss'), 'SH_CLERK', 3800.00, null, 122, 50);

insert into SECOM.employees (EMPLOYEE_ID, FIRST_NAME, LAST_NAME, EMAIL, PHONE_NUMBER, HIRE_DATE, JOB_ID, SALARY, COMMISSION_PCT, MANAGER_ID, DEPARTMENT_ID)
values (189, 'Jennifer', 'Dilly', 'JDILLY', '650.505.2876', to_date('17-03-2013 10:46:48', 'dd-mm-yyyy hh24:mi:ss'), 'SH_CLERK', 3600.00, null, 122, 50);

insert into SECOM.employees (EMPLOYEE_ID, FIRST_NAME, LAST_NAME, EMAIL, PHONE_NUMBER, HIRE_DATE, JOB_ID, SALARY, COMMISSION_PCT, MANAGER_ID, DEPARTMENT_ID)
values (190, 'Timothy', 'Gates', 'TGATES', '650.505.3876', to_date('17-03-2013 10:46:48', 'dd-mm-yyyy hh24:mi:ss'), 'SH_CLERK', 2900.00, null, 122, 50);

insert into SECOM.employees (EMPLOYEE_ID, FIRST_NAME, LAST_NAME, EMAIL, PHONE_NUMBER, HIRE_DATE, JOB_ID, SALARY, COMMISSION_PCT, MANAGER_ID, DEPARTMENT_ID)
values (191, 'Randall', 'Perkins', 'RPERKINS', '650.505.4876', to_date('17-03-2013 10:46:48', 'dd-mm-yyyy hh24:mi:ss'), 'SH_CLERK', 2500.00, null, 122, 50);

insert into SECOM.employees (EMPLOYEE_ID, FIRST_NAME, LAST_NAME, EMAIL, PHONE_NUMBER, HIRE_DATE, JOB_ID, SALARY, COMMISSION_PCT, MANAGER_ID, DEPARTMENT_ID)
values (192, 'Sarah', 'Bell', 'SBELL', '650.501.1876', to_date('17-03-2013 10:46:48', 'dd-mm-yyyy hh24:mi:ss'), 'SH_CLERK', 4000.00, null, 123, 50);

insert into SECOM.employees (EMPLOYEE_ID, FIRST_NAME, LAST_NAME, EMAIL, PHONE_NUMBER, HIRE_DATE, JOB_ID, SALARY, COMMISSION_PCT, MANAGER_ID, DEPARTMENT_ID)
values (193, 'Britney', 'Everett', 'BEVERETT', '650.501.2876', to_date('17-03-2013 10:46:48', 'dd-mm-yyyy hh24:mi:ss'), 'SH_CLERK', 3900.00, null, 123, 50);

insert into SECOM.employees (EMPLOYEE_ID, FIRST_NAME, LAST_NAME, EMAIL, PHONE_NUMBER, HIRE_DATE, JOB_ID, SALARY, COMMISSION_PCT, MANAGER_ID, DEPARTMENT_ID)
values (194, 'Samuel', 'McCain', 'SMCCAIN', '650.501.3876', to_date('17-03-2013 10:46:48', 'dd-mm-yyyy hh24:mi:ss'), 'SH_CLERK', 3200.00, null, 123, 50);

insert into SECOM.employees (EMPLOYEE_ID, FIRST_NAME, LAST_NAME, EMAIL, PHONE_NUMBER, HIRE_DATE, JOB_ID, SALARY, COMMISSION_PCT, MANAGER_ID, DEPARTMENT_ID)
values (195, 'Vance', 'Jones', 'VJONES', '650.501.4876', to_date('17-03-2013 10:46:48', 'dd-mm-yyyy hh24:mi:ss'), 'SH_CLERK', 2800.00, null, 123, 50);

insert into SECOM.employees (EMPLOYEE_ID, FIRST_NAME, LAST_NAME, EMAIL, PHONE_NUMBER, HIRE_DATE, JOB_ID, SALARY, COMMISSION_PCT, MANAGER_ID, DEPARTMENT_ID)
values (196, 'Alana', 'Walsh', 'AWALSH', '650.507.9811', to_date('17-03-2013 10:46:48', 'dd-mm-yyyy hh24:mi:ss'), 'SH_CLERK', 3100.00, null, 124, 50);

insert into SECOM.employees (EMPLOYEE_ID, FIRST_NAME, LAST_NAME, EMAIL, PHONE_NUMBER, HIRE_DATE, JOB_ID, SALARY, COMMISSION_PCT, MANAGER_ID, DEPARTMENT_ID)
values (197, 'Kevin', 'Feeney', 'KFEENEY', '650.507.9822', to_date('17-03-2013 10:46:48', 'dd-mm-yyyy hh24:mi:ss'), 'SH_CLERK', 3000.00, null, 124, 50);


commit;

select * from SECOM.employees;


-- Create table
create table SECOM.JOBS
(
  JOB_ID     VARCHAR2(10) not null,
  JOB_TITLE  VARCHAR2(35),
  MIN_SALARY NUMBER(6),
  MAX_SALARY NUMBER(6)
);
insert into SECOM.JOBS (JOB_ID, JOB_TITLE, MIN_SALARY, MAX_SALARY)
values ('AD_PRES', 'President', 20000, 40000);

insert into SECOM.JOBS (JOB_ID, JOB_TITLE, MIN_SALARY, MAX_SALARY)
values ('AD_VP', 'Administration Vice President', 15000, 30000);

insert into SECOM.JOBS (JOB_ID, JOB_TITLE, MIN_SALARY, MAX_SALARY)
values ('AD_ASST', 'Administration Assistant', 3000, 6000);

insert into SECOM.JOBS (JOB_ID, JOB_TITLE, MIN_SALARY, MAX_SALARY)
values ('FI_MGR', 'Finance Manager', 8200, 16000);

insert into SECOM.JOBS (JOB_ID, JOB_TITLE, MIN_SALARY, MAX_SALARY)
values ('FI_ACCOUNT', 'Accountant', 4200, 9000);

insert into SECOM.JOBS (JOB_ID, JOB_TITLE, MIN_SALARY, MAX_SALARY)
values ('AC_MGR', 'Accounting Manager', 8200, 16000);

insert into SECOM.JOBS (JOB_ID, JOB_TITLE, MIN_SALARY, MAX_SALARY)
values ('AC_ACCOUNT', 'Public Accountant', 4200, 9000);

insert into SECOM.JOBS (JOB_ID, JOB_TITLE, MIN_SALARY, MAX_SALARY)
values ('SA_MAN', 'Sales Manager', 10000, 20000);

insert into SECOM.JOBS (JOB_ID, JOB_TITLE, MIN_SALARY, MAX_SALARY)
values ('SA_REP', 'Sales Representative', 6000, 12000);

insert into SECOM.JOBS (JOB_ID, JOB_TITLE, MIN_SALARY, MAX_SALARY)
values ('PU_MAN', 'Purchasing Manager', 8000, 15000);

insert into SECOM.JOBS (JOB_ID, JOB_TITLE, MIN_SALARY, MAX_SALARY)
values ('PU_CLERK', 'Purchasing Clerk', 2500, 5500);

insert into SECOM.JOBS (JOB_ID, JOB_TITLE, MIN_SALARY, MAX_SALARY)
values ('ST_MAN', 'Stock Manager', 5500, 8500);

insert into SECOM.JOBS (JOB_ID, JOB_TITLE, MIN_SALARY, MAX_SALARY)
values ('ST_CLERK', 'Stock Clerk', 2000, 5000);

insert into SECOM.JOBS (JOB_ID, JOB_TITLE, MIN_SALARY, MAX_SALARY)
values ('SH_CLERK', 'Shipping Clerk', 2500, 5500);

insert into SECOM.JOBS (JOB_ID, JOB_TITLE, MIN_SALARY, MAX_SALARY)
values ('IT_PROG', 'Programmer', 4000, 10000);

insert into SECOM.JOBS (JOB_ID, JOB_TITLE, MIN_SALARY, MAX_SALARY)
values ('MK_MAN', 'Marketing Manager', 9000, 15000);

insert into SECOM.JOBS (JOB_ID, JOB_TITLE, MIN_SALARY, MAX_SALARY)
values ('MK_REP', 'Marketing Representative', 4000, 9000);

insert into SECOM.JOBS (JOB_ID, JOB_TITLE, MIN_SALARY, MAX_SALARY)
values ('HR_REP', 'Human Resources Representative', 4000, 9000);

insert into SECOM.JOBS (JOB_ID, JOB_TITLE, MIN_SALARY, MAX_SALARY)
values ('PR_REP', 'Public Relations Representative', 4500, 10500);

insert into SECOM.JOBS (JOB_ID, JOB_TITLE, MIN_SALARY, MAX_SALARY)
values ('SY_ANAL', 'System Analyst', 6000, 12000);

commit;
select * from SECOM.JOBS; 

-- Create table
create table SECOM.locations
(
  LOCATION_ID    NUMBER(4) not null,
  STREET_ADDRESS VARCHAR2(40),
  POSTAL_CODE    VARCHAR2(12),
  CITY           VARCHAR2(30),
  STATE_PROVINCE VARCHAR2(25),
  COUNTRY_ID     CHAR(2)
);
insert into SECOM.locations (LOCATION_ID, STREET_ADDRESS, POSTAL_CODE, CITY, STATE_PROVINCE, COUNTRY_ID)
values (1000, '1297 Via Cola di Rie', '00989', 'Roma', '', 'IT');

insert into SECOM.locations (LOCATION_ID, STREET_ADDRESS, POSTAL_CODE, CITY, STATE_PROVINCE, COUNTRY_ID)
values (1100, '93091 Calle della Testa', '10934', 'Venice', '', 'IT');

insert into SECOM.locations (LOCATION_ID, STREET_ADDRESS, POSTAL_CODE, CITY, STATE_PROVINCE, COUNTRY_ID)
values (1200, '2017 Shinjuku-ku', '1689', 'Tokyo', 'Tokyo Prefecture', 'JP');

insert into SECOM.locations (LOCATION_ID, STREET_ADDRESS, POSTAL_CODE, CITY, STATE_PROVINCE, COUNTRY_ID)
values (1300, '9450 Kamiya-cho', '6823', 'Hiroshima', '', 'JP');

insert into SECOM.locations (LOCATION_ID, STREET_ADDRESS, POSTAL_CODE, CITY, STATE_PROVINCE, COUNTRY_ID)
values (1400, '2014 Jabberwocky Rd', '26192', 'Southlake', 'Texas', 'US');

insert into SECOM.locations (LOCATION_ID, STREET_ADDRESS, POSTAL_CODE, CITY, STATE_PROVINCE, COUNTRY_ID)
values (1500, '2011 Interiors Blvd', '99236', 'South San Francisco', 'California', 'US');

insert into SECOM.locations (LOCATION_ID, STREET_ADDRESS, POSTAL_CODE, CITY, STATE_PROVINCE, COUNTRY_ID)
values (1600, '2007 Zagora St', '50090', 'South Brunswick', 'New Jersey', 'US');

insert into SECOM.locations (LOCATION_ID, STREET_ADDRESS, POSTAL_CODE, CITY, STATE_PROVINCE, COUNTRY_ID)
values (1700, '2004 Charade Rd', '98199', 'Seattle', 'Washington', 'US');

insert into SECOM.locations (LOCATION_ID, STREET_ADDRESS, POSTAL_CODE, CITY, STATE_PROVINCE, COUNTRY_ID)
values (1800, '147 Spadina Ave', 'M5V 2L7', 'Toronto', 'Ontario', 'CA');

insert into SECOM.locations (LOCATION_ID, STREET_ADDRESS, POSTAL_CODE, CITY, STATE_PROVINCE, COUNTRY_ID)
values (1900, '6092 Boxwood St', 'YSW 9T2', 'Whitehorse', 'Yukon', 'CA');

insert into SECOM.locations (LOCATION_ID, STREET_ADDRESS, POSTAL_CODE, CITY, STATE_PROVINCE, COUNTRY_ID)
values (2000, '40-5-12 Laogianggen', '190518', 'Beijing', '', 'CN');

insert into SECOM.locations (LOCATION_ID, STREET_ADDRESS, POSTAL_CODE, CITY, STATE_PROVINCE, COUNTRY_ID)
values (2100, '1298 Vileparle (E)', '490231', 'Bombay', 'Maharashtra', 'IN');

insert into SECOM.locations (LOCATION_ID, STREET_ADDRESS, POSTAL_CODE, CITY, STATE_PROVINCE, COUNTRY_ID)
values (2200, '12-98 Victoria Street', '2901', 'Sydney', 'New South Wales', 'AU');

insert into SECOM.locations (LOCATION_ID, STREET_ADDRESS, POSTAL_CODE, CITY, STATE_PROVINCE, COUNTRY_ID)
values (2300, '198 Clementi North', '540198', 'Singapore', '', 'SG');

insert into SECOM.locations (LOCATION_ID, STREET_ADDRESS, POSTAL_CODE, CITY, STATE_PROVINCE, COUNTRY_ID)
values (2400, '8204 Arthur St', '', 'London', '', 'UK');

insert into SECOM.locations (LOCATION_ID, STREET_ADDRESS, POSTAL_CODE, CITY, STATE_PROVINCE, COUNTRY_ID)
values (2500, 'Magdalen Centre, The Oxford Science Park', 'OX9 9ZB', 'Oxford', 'Oxford', 'UK');

insert into SECOM.locations (LOCATION_ID, STREET_ADDRESS, POSTAL_CODE, CITY, STATE_PROVINCE, COUNTRY_ID)
values (2600, '9702 Chester Road', '09629850293', 'Stretford', 'Manchester', 'UK');

insert into SECOM.locations (LOCATION_ID, STREET_ADDRESS, POSTAL_CODE, CITY, STATE_PROVINCE, COUNTRY_ID)
values (2700, 'Schwanthalerstr. 7031', '80925', 'Munich', 'Bavaria', 'DE');

insert into SECOM.locations (LOCATION_ID, STREET_ADDRESS, POSTAL_CODE, CITY, STATE_PROVINCE, COUNTRY_ID)
values (2800, 'Rua Frei Caneca 1360 ', '01307-002', 'Sao Paulo', 'Sao Paulo', 'BR');

insert into SECOM.locations (LOCATION_ID, STREET_ADDRESS, POSTAL_CODE, CITY, STATE_PROVINCE, COUNTRY_ID)
values (2900, '20 Rue des Corps-Saints', '1730', 'Geneva', 'Geneve', 'CH');

insert into SECOM.locations (LOCATION_ID, STREET_ADDRESS, POSTAL_CODE, CITY, STATE_PROVINCE, COUNTRY_ID)
values (3000, 'Murtenstrasse 921', '3095', 'Bern', 'BE', 'CH');

insert into SECOM.locations (LOCATION_ID, STREET_ADDRESS, POSTAL_CODE, CITY, STATE_PROVINCE, COUNTRY_ID)
values (3100, 'Pieter Breughelstraat 837', '3029SK', 'Utrecht', 'Utrecht', 'NL');

insert into SECOM.locations (LOCATION_ID, STREET_ADDRESS, POSTAL_CODE, CITY, STATE_PROVINCE, COUNTRY_ID)
values (3200, 'Mariano Escobedo 9991', '11932', 'Mexico City', 'Distrito Federal,', 'MX');

commit;

select * from SECOM.locations;


-- Create table
create table SECOM.REGIONS
(
  REGION_ID   NUMBER,
  REGION_NAME VARCHAR2(25)
);
insert into SECOM.regions (REGION_ID, REGION_NAME)
values (1, 'Europe');

insert into SECOM.regions (REGION_ID, REGION_NAME)
values (2, 'Americas');

insert into SECOM.regions (REGION_ID, REGION_NAME)
values (3, 'Asia');

insert into SECOM.regions (REGION_ID, REGION_NAME)
values (4, 'Middle East and Africa');

commit;
select * from  SECOM.regions;

创建序列

CREATE SEQUENCE SECOM.DEPARTMENTS_S START WITH 200;
CREATE SEQUENCE SECOM.EMPLOYEES_S START WITH 10001;
commit;

创建视图
(必需)包含主TABLE的所有列,包含row_id
包括外键关联的列
包括ROW_ID

--在apps下创建VIEW 
--cux_departments_v
CREATE OR REPLACE VIEW cux_departments_v AS
SELECT dep.ROWID row_id,
       dep.department_id,
       dep.department_name,
       dep.manager_id,
       dep.location_id,
       m.first_name || ',' || m.last_name manager_name,
       loc.street_address,
       loc.city
  FROM SECOM.departments dep, SECOM.employees m, SECOM.locations loc
 WHERE dep.manager_id = m.employee_id(+)
   AND dep.location_id = loc.location_id(+);
select * from  cux_departments_v;

--在apps下创建VIEW 
--cux_employees_v
CREATE OR REPLACE VIEW cux_employees_v AS  
SELECT emp.ROWID row_id,
       emp.employee_id,
       emp.first_name,
       emp.last_name,
       emp.email,
       emp.phone_number,
       emp.hire_date,
       emp.job_id,
       emp.salary,
       emp.commission_pct,
       emp.manager_id,
       emp.department_id,
       m.first_name || ',' || m.last_name manager_name,
       job.job_title
  FROM SECOM.employees emp, SECOM.employees m, SECOM.jobs job
 WHERE emp.manager_id = m.employee_id(+)
   AND emp.job_id = job.job_id;

头表增删改查

CREATE OR REPLACE PACKAGE departments_pkg IS

  /*=====================================
  ** PROCEDURE:   insert_row()
  **=====================================*/
  PROCEDURE insert_row(x_row_id          IN OUT VARCHAR2,
                       x_department_id   IN OUT NUMBER,
                       p_department_name IN VARCHAR2,
                       p_manager_id      IN NUMBER DEFAULT NULL,
                       p_location_id     IN NUMBER DEFAULT NULL);

  /*=====================================
  ** PROCEDURE:   lock_row()
  **=====================================*/
  PROCEDURE lock_row(p_department_id   IN NUMBER,
                     p_department_name IN VARCHAR2,
                     p_manager_id      IN NUMBER,
                     p_location_id     IN NUMBER);

  /*=====================================
  ** PROCEDURE:   update_row()
  **=====================================*/
  PROCEDURE update_row(p_department_id   IN NUMBER,
                       p_department_name IN VARCHAR2,
                       p_manager_id      IN NUMBER DEFAULT NULL,
                       p_location_id     IN NUMBER DEFAULT NULL);

  /*=====================================
  ** PROCEDURE:   delete_row()
  **=====================================*/
  PROCEDURE delete_row(p_department_id IN NUMBER);

END departments_pkg;

CREATE OR REPLACE PACKAGE BODY departments_pkg IS
  /*=====================================
  ** PROCEDURE:   insert_row()
  **=====================================*/
  PROCEDURE insert_row(x_row_id          IN OUT VARCHAR2,
                       x_department_id   IN OUT NUMBER,
                       p_department_name IN VARCHAR2,
                       p_manager_id      IN NUMBER DEFAULT NULL,
                       p_location_id     IN NUMBER DEFAULT NULL)
  
   IS
    CURSOR c IS
      SELECT ROWID
        FROM secom.departments
       WHERE department_id = x_department_id;
  
  BEGIN
  
    IF x_department_id IS NULL THEN
      SELECT secom.departments_s.nextval INTO x_department_id FROM dual;
    END IF;
  
    INSERT INTO secom.departments
      (department_id, department_name, manager_id, location_id)
    VALUES
      (x_department_id, p_department_name, p_manager_id, p_location_id);
  
    OPEN c;
    FETCH c
      INTO x_row_id;
    IF (c%NOTFOUND) THEN
      CLOSE c;
      RAISE no_data_found;
    END IF;
    CLOSE c;
  
  END insert_row;

  /*=====================================
  ** PROCEDURE:   lock_row()
  **=====================================*/
  PROCEDURE lock_row(p_department_id   IN NUMBER,
                     p_department_name IN VARCHAR2,
                     p_manager_id      IN NUMBER,
                     p_location_id     IN NUMBER)
  
   IS
    CURSOR c IS
      SELECT department_id, department_name, manager_id, location_id
        FROM secom.departments
       WHERE department_id = p_department_id
         FOR UPDATE OF department_id NOWAIT;
  
    rec c%ROWTYPE;
  BEGIN
  
    OPEN c;
    FETCH c
      INTO rec;
    IF (c%NOTFOUND) THEN
      CLOSE c;
      fnd_message.set_name('FND', 'FORM_RECORD_DELETED');
      app_exception.raise_exception;
    END IF;
    CLOSE c;
  
    IF ((rec.department_id = p_department_id) AND
       ((rec.department_name = p_department_name) OR
       ((rec.department_name IS NULL) AND (p_department_name IS NULL))) AND
       ((rec.manager_id = p_manager_id) OR
       ((rec.manager_id IS NULL) AND (p_manager_id IS NULL))) AND
       ((rec.location_id = p_location_id) OR
       ((rec.location_id IS NULL) AND (p_location_id IS NULL)))) THEN
      NULL;
    ELSE
      fnd_message.set_name('FND', 'FORM_RECORD_CHANGED');
      app_exception.raise_exception;
    END IF;
  
  END lock_row;

  /*=====================================
  ** PROCEDURE:   update_row()
  **=====================================*/
  PROCEDURE update_row(p_department_id   IN NUMBER,
                       p_department_name IN VARCHAR2,
                       p_manager_id      IN NUMBER DEFAULT NULL,
                       p_location_id     IN NUMBER DEFAULT NULL)
  
   IS
  BEGIN
  
    UPDATE secom.departments
       SET department_id   = p_department_id,
           department_name = p_department_name,
           manager_id      = p_manager_id,
           location_id     = p_location_id
     WHERE department_id = p_department_id;
  
    IF (SQL%NOTFOUND) THEN
      RAISE no_data_found;
    END IF;
  
  END update_row;

  /*=====================================
  ** PROCEDURE:   delete_row()
  **=====================================*/
  PROCEDURE delete_row(p_department_id IN NUMBER)
  
   IS
  BEGIN
  
    DELETE FROM secom.departments WHERE department_id = p_department_id;
  
    IF (SQL%NOTFOUND) THEN
      RAISE no_data_found;
    END IF;
  
  END delete_row;

END departments_pkg;

行表增删改查

CREATE OR REPLACE PACKAGE employees_pkg IS

  /*=====================================
  ** PROCEDURE:   insert_row()
  **=====================================*/
  PROCEDURE insert_row(x_row_id         IN OUT VARCHAR2,
                       x_employee_id    IN OUT NUMBER,
                       p_first_name     IN VARCHAR2 DEFAULT NULL,
                       p_last_name      IN VARCHAR2 DEFAULT NULL,
                       p_email          IN VARCHAR2 DEFAULT NULL,
                       p_phone_number   IN VARCHAR2 DEFAULT NULL,
                       p_hire_date      IN DATE DEFAULT NULL,
                       p_job_id         IN VARCHAR2 DEFAULT NULL,
                       p_salary         IN NUMBER DEFAULT NULL,
                       p_commission_pct IN NUMBER DEFAULT NULL,
                       p_manager_id     IN NUMBER DEFAULT NULL,
                       p_department_id  IN NUMBER DEFAULT NULL);

  /*=====================================
  ** PROCEDURE:   lock_row()
  **=====================================*/
  PROCEDURE lock_row(p_employee_id    IN NUMBER,
                     p_first_name     IN VARCHAR2,
                     p_last_name      IN VARCHAR2,
                     p_email          IN VARCHAR2,
                     p_phone_number   IN VARCHAR2,
                     p_hire_date      IN DATE,
                     p_job_id         IN VARCHAR2,
                     p_salary         IN NUMBER,
                     p_commission_pct IN NUMBER,
                     p_manager_id     IN NUMBER,
                     p_department_id  IN NUMBER);

  /*=====================================
  ** PROCEDURE:   update_row()
  **=====================================*/
  PROCEDURE update_row(p_employee_id    IN NUMBER,
                       p_first_name     IN VARCHAR2 DEFAULT NULL,
                       p_last_name      IN VARCHAR2 DEFAULT NULL,
                       p_email          IN VARCHAR2 DEFAULT NULL,
                       p_phone_number   IN VARCHAR2 DEFAULT NULL,
                       p_hire_date      IN DATE DEFAULT NULL,
                       p_job_id         IN VARCHAR2 DEFAULT NULL,
                       p_salary         IN NUMBER DEFAULT NULL,
                       p_commission_pct IN NUMBER DEFAULT NULL,
                       p_manager_id     IN NUMBER DEFAULT NULL,
                       p_department_id  IN NUMBER DEFAULT NULL);

  /*=====================================
  ** PROCEDURE:   delete_row()
  **=====================================*/
  PROCEDURE delete_row(p_employee_id IN NUMBER);
END employees_pkg;
CREATE OR REPLACE PACKAGE BODY employees_pkg IS

  /*=====================================
  ** PROCEDURE:   insert_row()
  **=====================================*/
  PROCEDURE insert_row(x_row_id         IN OUT VARCHAR2,
                       x_employee_id    IN OUT NUMBER,
                       p_first_name     IN VARCHAR2 DEFAULT NULL,
                       p_last_name      IN VARCHAR2 DEFAULT NULL,
                       p_email          IN VARCHAR2 DEFAULT NULL,
                       p_phone_number   IN VARCHAR2 DEFAULT NULL,
                       p_hire_date      IN DATE DEFAULT NULL,
                       p_job_id         IN VARCHAR2 DEFAULT NULL,
                       p_salary         IN NUMBER DEFAULT NULL,
                       p_commission_pct IN NUMBER DEFAULT NULL,
                       p_manager_id     IN NUMBER DEFAULT NULL,
                       p_department_id  IN NUMBER DEFAULT NULL)
  
   IS
    CURSOR c IS
      SELECT ROWID FROM secom.employees WHERE employee_id = x_employee_id;
  
  BEGIN
  
    IF x_employee_id IS NULL THEN
      SELECT secom.employees_s.nextval INTO x_employee_id FROM dual;
    END IF;
  
    INSERT INTO secom.employees
      (employee_id,
       first_name,
       last_name,
       email,
       phone_number,
       hire_date,
       job_id,
       salary,
       commission_pct,
       manager_id,
       department_id)
    VALUES
      (x_employee_id,
       p_first_name,
       p_last_name,
       p_email,
       p_phone_number,
       p_hire_date,
       p_job_id,
       p_salary,
       p_commission_pct,
       p_manager_id,
       p_department_id);
  
    OPEN c;
    FETCH c
      INTO x_row_id;
    IF (c%NOTFOUND) THEN
      CLOSE c;
      RAISE no_data_found;
    END IF;
    CLOSE c;
  
  END insert_row;

  /*=====================================
  ** PROCEDURE:   lock_row()
  **=====================================*/
  PROCEDURE lock_row(p_employee_id    IN NUMBER,
                     p_first_name     IN VARCHAR2,
                     p_last_name      IN VARCHAR2,
                     p_email          IN VARCHAR2,
                     p_phone_number   IN VARCHAR2,
                     p_hire_date      IN DATE,
                     p_job_id         IN VARCHAR2,
                     p_salary         IN NUMBER,
                     p_commission_pct IN NUMBER,
                     p_manager_id     IN NUMBER,
                     p_department_id  IN NUMBER)
  
   IS
    CURSOR c IS
      SELECT employee_id,
             first_name,
             last_name,
             email,
             phone_number,
             hire_date,
             job_id,
             salary,
             commission_pct,
             manager_id,
             department_id
        FROM secom.employees
       WHERE employee_id = p_employee_id
         FOR UPDATE OF employee_id NOWAIT;
  
    rec c%ROWTYPE;
  BEGIN
  
    OPEN c;
    FETCH c
      INTO rec;
    IF (c%NOTFOUND) THEN
      CLOSE c;
      fnd_message.set_name('FND', 'FORM_RECORD_DELETED');
      app_exception.raise_exception;
    END IF;
    CLOSE c;
  
    IF ((rec.employee_id = p_employee_id) AND
       ((rec.first_name = p_first_name) OR
       ((rec.first_name IS NULL) AND (p_first_name IS NULL))) AND
       ((rec.last_name = p_last_name) OR
       ((rec.last_name IS NULL) AND (p_last_name IS NULL))) AND
       ((rec.email = p_email) OR
       ((rec.email IS NULL) AND (p_email IS NULL))) AND
       ((rec.phone_number = p_phone_number) OR
       ((rec.phone_number IS NULL) AND (p_phone_number IS NULL))) AND
       ((rec.hire_date = p_hire_date) OR
       ((rec.hire_date IS NULL) AND (p_hire_date IS NULL))) AND
       ((rec.job_id = p_job_id) OR
       ((rec.job_id IS NULL) AND (p_job_id IS NULL))) AND
       ((rec.salary = p_salary) OR
       ((rec.salary IS NULL) AND (p_salary IS NULL))) AND
       ((rec.commission_pct = p_commission_pct) OR
       ((rec.commission_pct IS NULL) AND (p_commission_pct IS NULL))) AND
       ((rec.manager_id = p_manager_id) OR
       ((rec.manager_id IS NULL) AND (p_manager_id IS NULL))) AND
       ((rec.department_id = p_department_id) OR
       ((rec.department_id IS NULL) AND (p_department_id IS NULL)))) THEN
      NULL;
    ELSE
      fnd_message.set_name('FND', 'FORM_RECORD_CHANGED');
      app_exception.raise_exception;
    END IF;
  
  END lock_row;

  /*=====================================
  ** PROCEDURE:   update_row()
  **=====================================*/
  PROCEDURE update_row(p_employee_id    IN NUMBER,
                       p_first_name     IN VARCHAR2 DEFAULT NULL,
                       p_last_name      IN VARCHAR2 DEFAULT NULL,
                       p_email          IN VARCHAR2 DEFAULT NULL,
                       p_phone_number   IN VARCHAR2 DEFAULT NULL,
                       p_hire_date      IN DATE DEFAULT NULL,
                       p_job_id         IN VARCHAR2 DEFAULT NULL,
                       p_salary         IN NUMBER DEFAULT NULL,
                       p_commission_pct IN NUMBER DEFAULT NULL,
                       p_manager_id     IN NUMBER DEFAULT NULL,
                       p_department_id  IN NUMBER DEFAULT NULL)
  
   IS
  BEGIN
  
    UPDATE secom.employees
       SET employee_id    = p_employee_id,
           first_name     = p_first_name,
           last_name      = p_last_name,
           email          = p_email,
           phone_number   = p_phone_number,
           hire_date      = p_hire_date,
           job_id         = p_job_id,
           salary         = p_salary,
           commission_pct = p_commission_pct,
           manager_id     = p_manager_id,
           department_id  = p_department_id
     WHERE employee_id = p_employee_id;
  
    IF (SQL%NOTFOUND) THEN
      RAISE no_data_found;
    END IF;
  
  END update_row;

  /*=====================================
  ** PROCEDURE:   delete_row()
  **=====================================*/
  PROCEDURE delete_row(p_employee_id IN NUMBER)
  
   IS
  BEGIN
  
    DELETE FROM secom.employees WHERE employee_id = p_employee_id;
  
    IF (SQL%NOTFOUND) THEN
      RAISE no_data_found;
    END IF;
  
  END delete_row;
END employees_pkg;

FROM块头操作增删改查

CREATE OR REPLACE PACKAGE departments_private IS
  PROCEDURE insert_row;
  PROCEDURE lock_row;
  PROCEDURE update_row;
  PROCEDURE delete_row;

END departments_private;
CREATE OR REPLACE PACKAGE BODY departments_private IS
  /*=====================================
  ** PROCEDURE:   insert_row()
  **=====================================*/
  PROCEDURE insert_row IS
  
  BEGIN
  
    fnd_standard.set_who;
  
    IF :departments.department_id IS NULL THEN
      SELECT secom.departments_s.nextval
        INTO :departments.department_id
        FROM dual;
    END IF;
  
    departments_pkg.insert_row(x_row_id          => :departments.row_id,
                               x_department_id   => :departments.department_id,
                               p_department_name => :departments.department_name,
                               p_manager_id      => :departments.manager_id,
                               p_location_id     => :departments.location_id);
  END insert_row;

  /*=====================================
  ** PROCEDURE:   lock_row()
  **=====================================*/
  PROCEDURE lock_row IS
  
    i NUMBER := 0;
  BEGIN
  
    LOOP
      BEGIN
        i := i + 1;
        departments_pkg.lock_row(p_department_id   => :departments.department_id,
                                 p_department_name => :departments.department_name,
                                 p_manager_id      => :departments.manager_id,
                                 p_location_id     => :departments.location_id);
        RETURN;
      EXCEPTION
        WHEN app_exception.record_lock_exception THEN
          app_exception.record_lock_error(i);
      END;
    END LOOP;
  
  END lock_row;

  /*=====================================
  ** PROCEDURE:   update_row()
  **=====================================*/
  PROCEDURE update_row IS
  BEGIN
  
    fnd_standard.set_who;
  
    departments_pkg.update_row(p_department_id   => :departments.department_id,
                               p_department_name => :departments.department_name,
                               p_manager_id      => :departments.manager_id,
                               p_location_id     => :departments.location_id);
  END update_row;

  /*=====================================
  ** PROCEDURE:   delete_row()
  **=====================================*/
  PROCEDURE delete_row IS
  BEGIN
  
    departments_pkg.delete_row(p_department_id => :departments.department_id);
  END delete_row;

END departments_private;

FROM块行操作增删改查

CREATE OR REPLACE PACKAGE EMPLOYEES_PRIVATE IS

  PROCEDURE insert_row;
  PROCEDURE lock_row;
  PROCEDURE update_row;
  PROCEDURE delete_row;

END employees_private;
CREATE OR REPLACE PACKAGE BODY employees_private IS

  /*=====================================
  ** PROCEDURE:   insert_row()
  **=====================================*/
  PROCEDURE insert_row IS
  
  BEGIN
  
    fnd_standard.set_who;
  
    IF :employees.employee_id IS NULL THEN
      SELECT secom.employees_s.nextval
        INTO :employees.employee_id
        FROM dual;
    END IF;
  
    employees_pkg.insert_row(x_row_id         => :employees.row_id,
                             x_employee_id    => :employees.employee_id,
                             p_first_name     => :employees.first_name,
                             p_last_name      => :employees.last_name,
                             p_email          => :employees.email,
                             p_phone_number   => :employees.phone_number,
                             p_hire_date      => :employees.hire_date,
                             p_job_id         => :employees.job_id,
                             p_salary         => :employees.salary,
                             p_commission_pct => :employees.commission_pct,
                             p_manager_id     => :employees.manager_id,
                             p_department_id  => :employees.department_id);
  END insert_row;

  /*=====================================
  ** PROCEDURE:   lock_row()
  **=====================================*/
  PROCEDURE lock_row IS
  
    i NUMBER := 0;
  BEGIN
  
    LOOP
      BEGIN
        i := i + 1;
        employees_pkg.lock_row(p_employee_id    => :employees.employee_id,
                               p_first_name     => :employees.first_name,
                               p_last_name      => :employees.last_name,
                               p_email          => :employees.email,
                               p_phone_number   => :employees.phone_number,
                               p_hire_date      => :employees.hire_date,
                               p_job_id         => :employees.job_id,
                               p_salary         => :employees.salary,
                               p_commission_pct => :employees.commission_pct,
                               p_manager_id     => :employees.manager_id,
                               p_department_id  => :employees.department_id);
        RETURN;
      EXCEPTION
        WHEN app_exception.record_lock_exception THEN
          app_exception.record_lock_error(i);
      END;
    END LOOP;
  
  END lock_row;

  /*=====================================
  ** PROCEDURE:   update_row()
  **=====================================*/
  PROCEDURE update_row IS
  BEGIN
  
    fnd_standard.set_who;
  
    employees_pkg.update_row(p_employee_id    => :employees.employee_id,
                             p_first_name     => :employees.first_name,
                             p_last_name      => :employees.last_name,
                             p_email          => :employees.email,
                             p_phone_number   => :employees.phone_number,
                             p_hire_date      => :employees.hire_date,
                             p_job_id         => :employees.job_id,
                             p_salary         => :employees.salary,
                             p_commission_pct => :employees.commission_pct,
                             p_manager_id     => :employees.manager_id,
                             p_department_id  => :employees.department_id);
  END update_row;

  /*=====================================
  ** PROCEDURE:   delete_row()
  **=====================================*/
  PROCEDURE delete_row IS
  BEGIN
  
    employees_pkg.delete_row(p_employee_id => :employees.employee_id);
  END delete_row;

END employees_private;

生成表操作API:

点击查看代码
--生成表操作API
BEGIN
  -- Call the procedure
  hss_plsql_autocreate.table_handle_pkg
  hand_plsql_autocreate.table_handle_pkg(p_table_name  => 'DEPARTMENTS',
                                         p_owner       => 'APPS', --如果是在CUX或其他用户名下建立的对象,则用CUX或其他用户名
                                         p_primary_key => 'DEPARTMENT_ID');
END;

BEGIN
  -- Call the procedure
  hand_plsql_autocreate.table_handle_pkg(p_table_name  => 'EMPLOYEES',
                                         p_owner       => 'APPS', --如果是在CUX或其他用户名下建立的对象,则用CUX或其他用户名
                                         p_primary_key => 'EMPLOYEE_ID');
END;

--生成FORM块操作API
--参数p_table_name:如果是在CUX或其他用户名下建立的对象,此处是APPS下的同义词,实际对应 cux.xxx_all表                       
BEGIN
  hand_plsql_autocreate.form_table_handle(p_block_name   => 'DEPARTMENTS',
                                          p_package_name => 'DEPARTMENTS_PKG',
                                          p_table_name   => 'DEPARTMENTS',
                                          p_primary_key  => 'DEPARTMENT_ID');
END;

--生成FORM块操作API
--参数p_table_name:如果是在CUX或其他用户名下建立的对象,此处是APPS下的同义词,实际对应 cux.xxx_all表                       
BEGIN
  hand_plsql_autocreate.form_table_handle(p_block_name   => 'EMPLOYEES',
                                          p_package_name => 'EMPLOYEES_PKG',
                                          p_table_name   => 'EMPLOYEES',
                                          p_primary_key  => 'EMPLOYEE_ID');
END;
/

脚本

2. 行指示符、主从块、滚动条、Stacked&Tab画布、多行文本

2.1.行指示符

手工新建Item,名字和子类都是CURRENT_RECORD_INDICATOR。

前台FORM显示:

2.2.Master-Detail主从块

关于主从块
单据通常都可以划分为“头”与“行”的关系,在表设计中表现为“一对多”的主外键关系,在Form中的表现形式就是“主从块”。主从块有以下一些特征:
1、 通常希望输入完主块才允许用户输入从块。
2、 删除主块记录前,必须先删除从块记录。
3、 保存的时候,系统则不一定先保存主块,而是根据块在对象浏览器中的顺序。
4、 查询出主块记录时,通常希望自动带出明细块记录。
5、 在滚动主块记录时,如果从块还未保存,则无法移动。
6、 主从块都是基于数据库的,并且至少有一个可导航的字段。

设置头、行块互为前后导航块
DEPARTMENTS属性:

EMPLOYEES属性:

创建主从关系
主从块的创建异常简单。
N: 选中主块DEPARTMENTS下的Relations,从左边工具栏点击“+”

选择Detail块为EMPLOYEES、选中Prevent Maserless Operations、输入Join Condition:DEPARTMENTS.department_id = EMPLOYEES.department_id。
确定后,自动完成如下工作:
1、创建一个名为“DEPARTMENTS_EMPLOYEES”的Relation
2、创建一个Form级触发器ON-CLEAR-DETAILS

3、创建两个主块级触发器ON-POPULATE-DETAILS和ON-CHECK-DELETE-MASTER

4、创建一个过程Query_Master_Details

5、设置从块关联Item的Copy Value from Item属性

2.3.滚动条

关于滚动条
当Item在一个指定大小的区域内无法完整显示时,需要借助滚动条;根据需要可以用水平滚动条或垂直滚动条。Form中的滚动条有两个相互独立的来源:
1、块的滚动条
可决定是否为该块显示滚动条,垂直或者水平只能任选其一,基本上都是垂直,用来滚动记录。比如实际记录有10条,而块属性设置显示8条记录,如果不借助滚动条就显得不直观,记录间的导航也不方便。
2、画布的滚动条
画布有两个“区域”,一是Canvas—画布自身的大小,所有放在该画布上的Item,不能超越Canvas的边界;二是View—画布在计算机屏幕上的固定的、可见区域,如果View小于Canvas,那么需要借助滚动条来“挪动”Canvas,使其他Item也能有机会显示在View中。
画布的滚动条可以有垂直或者水平,可以同时显示内容画布没有滚动条,所以如果Item放置在内容画布上,必须保证水平方向能够全部显示在View中。
设置滚动条
N: 选中块(这里是EMPLOYEES),F4调出属性面板,设置显示Scrollbar属性为Yes,Scrollbar所在Canvas为选择所需显示的画布:

前端FORM显示:

2.4.Stacked&Tab画布

创建堆叠画布
在需要显示的Item比较多、内容画布显示不下的时候,我们需要使用一个或多个堆叠画布来处理。通常我们需要判断,哪些Item保留在内容画布上,不随着水平滚动条滚动,其他Item需要移到新的Stacked上,通常行指示符、弹性域是要保留的,其他字段则看情况。创建画布有两种方式。
N1: 启动画布创建向导,选择New Stacked,这个比较适用于调整布局前的首次创建:

N2: 在对象浏览器中选中Canvases,点击左边工具栏的“+”,手工创建,然后修改名字和子类如下图:

设置ITEM到新画布
除了行指示符,我们希望First Name和Last Name不随滚动条滚动。这样我们设置其他Item的画布属性为新建的STACKED_CUXPOEMP:

调整堆叠画布
堆叠画布的调整需要符合如下要求:
1、View在Canvas的位置是X=0,Y=0

2、Canvas左右都无空白区域,也就是全部被Item占满,第一个Item的X位置为0,Canvas的Width = 所有Item的Width之和
3、字段顶部基本无空白,即Item的Y位置是标准高度0.25,用来放Prompt

4、Canvas底部留出滚动条的位置,通常留0.2,这样如果有10行数据,总高是2.75+0.2 = 2.95。
5、View的高度和Canvas一致,宽度则看实际情况

6、设置画布的属性,使其仅显示水平滚动条
7、设置画布的属性,使其和主画布置于同一Window

调整堆叠画布在主画布的位置
1、切换到主画布,选择菜单View/Stacked Views,选中堆叠画布:


OK后堆叠画布显示在主画布的左上角:

这个需要我们调整到合适位置,即调整到Last Name位置后,可以手工拖动(麻烦),也可通过设置属性。
2、考察下当前Last Name的位置属性X、Y和宽度属性Width:

这样我们可以得出堆叠画布的位置X=1.366 + 1 = 2.366,Y=2.476 – 0.25 = 2.226:

前端FORM显示:

画布小结:
子类和画布
EBS通过进一步“标准化”Form Builder自身的对象,提供了丰富的“子类”,这个和Java等面向对象语言中的子类是相似的,其实际上是子对象!

对于画布来说,原始类型和子类对应如下:

原始类型 子类 说明
Content Canvas 内容画布,一个Windows上有且仅有一个Content画布
Stacked Canvss_Stacked 普通堆叠画布,属性Raise on Entry为No,意思是当导航到该画布的任一Item时,仅当该Item无法全部展示在View中,那么整个View将自动移动到所有画布的顶层,也就是全部显示
Canvss_Stacked_Fixed 固定堆叠画布,属性Raise on Entry为Yes,意思是当导航到该画布的任一Item时,那么整个View将自动移动到所有画布的顶层,也就是全部显示
Tab Tab_Canvas 标签页,如果Item直接放置在Tab画布上,那么点击不同的标签,将自动导航到该标签的第一个可导航的Item,反之,如果导航到某标签的Item,那么也将自动切换到该标签页;Tab Page使用起来类似内容画布,如果Item太多,需要借助Stacked画布,这个时候,就没法“自动导航”、“自动切换”了,必须用代码去响应Tab页的切换事件
V&H Toolbar 垂直和水平工具条,EBS开发中没用

从UI角度看对象关系
刚开始做Form,通常搞不清楚Item、块、画布、Window、Form这些对象的关系,有个简单的办法可以帮助大家了解。选择菜单View/Visual View,可以看的比较清楚:

可以看出,一个Form可以有任意个Window;一个Window上可以有任意个画布,反过来一个画布只能放置在一个Window上,另外一个这里看不出的限制是一个Windows上有且仅有一个Content画布;一个画布上可以放置任意多个Item,一个块的Item,可以分步在不同的画布上,所以块和画布没有什么必然的关系

2.5.TAB画布

创建Tab画布和标签页
创建Tab画布的步骤和其他画布一样,同样需要设置其Window属性,不过其子类为Tab_Canvas;然后在其下创建标签页,我们创建了2个,子类为Tab_Page:



设置Item到标签页并调整
把原来Header区的Department Name字段放在Headers标签页上,原来Line区的内容全部放到Lines标签页上,做如下设置:
1、设置Header区Department Name字段的物理显示属性到Headers标签页:

2、同理,把原先在内容画布上的行指示符等固定的Item也设置到Lines标签页。

3、同时,把EMPLOYEES块的滚动条也设置到Lines标签页。
4、单独调整Tab画布,大约如下

调整主画布
1、切换到主画布,先通过菜单View/Stacked Views,显示TAB_DEMO画布、隐藏CUXPOEMP_STACKED画布,这样先调整CUXPOEMP_TAB画布到合适位置:

Tips:在菜单View/Stacked Views中,按住Ctrl键来选中或取消画布。

2、再通过菜单View/Stacked Views,把CUXPOEMP_STACKED画布也显示出来,调整到合适位置:

注意:Tab+Stacked,不是所见即所得,看起来是对齐的,实际运行起来不对齐,所以需要耐心,不断运行、调整、再运行再调整…..
前端FORM显示:

可以看到,如果不加控制,即使切换到Lines页,堆叠画布也不显示,必须定位到行item用Tab键导航,才会使其Raise出来。

2.6.控制TAB画布

控制思路
实际上Tab画布及其标签页和堆叠画布完全是独立的,哪个堆叠画布和哪个标签页对应,必须通过代码来处理。
当标签页切换时,我们需要响应切换事件,决定该显示哪些堆叠画布、隐藏哪些堆叠画布;反过来,当导航到堆叠画布上的Item时,因为会导致该画布Raise出来,我们需要响应Item的导航事件,决定哪个标签页成为当前。
TAB控制代码
当切换到Headers标签页时,隐藏CUXPOEMP_STACKED画布,切换到Lines标签页时,显示CUXPOEMP_STACKED画布;要注意Form初始时,也需要默认一下当前标签页,也需要隐藏CUXPOEMP_STACKED画布。
在Form级WHEN-NEW-FORM-INSTANCE中追加:

SET_CANVAS_PROPERTY('CUXPOEMP_TAB', TOPMOST_TAB_PAGE, 'HEADERS');
hide_view('CUXPOEMP_STACKED');

新建Form级WHEN-TAB-PAGE-CHANGED触发器,该触发器是用鼠标点时才会触发;另外注意几个Form标准过程的使用:

IF :system.tab_previous_page = 'HEADERS' THEN
  validate(block_scope);
  IF :system.MODE = 'ENTER-QUERY' OR NOT form_success THEN
    --Message here
    set_canvas_property('CUXPOEMP_TAB',
                        topmost_tab_page,
                        :system.tab_previous_page);
    RETURN;
  END IF;
ELSIF :system.tab_previous_page = 'LINES' THEN
  validate(block_scope);
  IF :system.MODE = 'ENTER-QUERY' OR NOT form_success THEN
    --Message here
    set_canvas_property('CUXPOEMP_TAB',
                        topmost_tab_page,
                        :system.tab_previous_page);
    RETURN;
  END IF;
END IF;

IF :system.tab_new_page = 'LINES' THEN
  show_view('CUXPOEMP_STACKED');
  go_item('EMPLOYEES.FIRST_NAME');
ELSIF :system.tab_new_page = 'HEADERS' THEN
  hide_view('CUXPOEMP_STACKED');
  go_item('DEPARTMENTS.DEPARTMENT_NAME');
END IF;

Tips:在Forms Builder中通过Help菜单,输入过程名,可查看具体的解释和Example。

前端FORM显示:
当点击头部页时:

当点击行页时:

本例中,如果在头块中使用Shift+Pagedown切换到行块,尽管已经切换到Lines标签页了,但CUXPOEMP_STACKED还是没有显示。为解决此问题,需要响应行块的第一个可导航的Item(这里是FIRST_NAME)的WHEN-NEW-ITEM-INSTANCE事件,写入代码:
show_view('CUXPOEMP_STACKED');

Tips:通过Jinitiator的Help/Keyboard Help,可以查看常用的快捷键。

2.7.多行文本框

如果需要输入的文本比较多,单行输入可能不够又不直观,可以设置Item的Multi-Line属性为Yes,如本范例的头块DEPARTMENT_NAME字段。调整高度后运行结果如下:

3.Lov查询、块查询、Button

3.1.查询原理

Form标准功能支持F11查询,只要我们按下F11,输入条件值即可,再按Ctrl+F11就可以执行查询。
F11查询原理
F11,这个时候的Block其实是处于Enter-query状态,输入的东西Form会自动拼成Where语句(当然还要加上原来的default where,如果有Copy from item,也要加上)。
对于每个Item上输入的值,一般是用 = ;如果有%,就解析为like;如果有#,则把后边的表达式(比如between,甚至是子查询)直接作为条件。
理解其他查询
下面我们将学习基于Lov的查询和基于块的查询,其原理和F11一样。
当form内部执行堆栈Navigate到Pre-query时,block也是处于Enter-query状态,和F11一样,我们只管对Item赋值(相当于F11中人工输入),剩下的就交给Form去处理了。
需要注意的是当处于enter-query状态的block,是使用query length属性来限制输入的数据长度,而不是通常的maximum lengh,只不过query length默认是0,即等于maximum lengh,所以会出现当用app_find.query_range时长度不够的情况。

3.2.LOV查询

什么是Lov查询
当用户点击工具栏上的手电筒—查询按钮时,弹出的是一个简单的Lov,其内容通常是可以唯一确定一条记录的“主码”,比如订单号。
创建LOV查询
在基于Template的开发中,须遵循如下步骤:
1、创建一个Parameter参数,用以保存lov的返回值,这里是DEPARTMENT_ID:

2、根据实际需要创建LOV,并把条件值(通常是主键ID)返回给事先建好的Parameter,我们用如下SQL创建LOV,并把LOV改名为"DEPARTMENT_ID":

select dep.department_id,dep.department_name from SECOM.departments dep

并把department_id返回给PARAMETER.department_id:

3、添加块级QUERY_FIND触发器(该触发器不是Form标准的,所以需要手工输入),代码如下:

app_find.query_find('DEPARTMENT_ID');

4、添加块级PRE-QUERY触发器,代码如下:

if :parameter.g_query_find = 'TRUE' then
	:DEPARTMENTS.department_id:= :parameter.DEPARTMENT_ID;
	:parameter.g_query_find := 'FALSE';
end if;

3.3.块查询

什么是块查询
当Form比较复杂,需要用比较多的条件才能方便查询,比如订单号范围、日期范围等,或者希望查询条件用"选"而不是"输入"的方式时,需要专门做一个非数据库块来完成。
拷贝标准查询
除了不基于数据库外,做查询块和普通的块没什么区别;不过我们可以采用比较快捷的方法:
1、打开APPSTAND.fmb,把其中的对象组“QUERY_FIND”拖到我们自己的Form中:

并选择复制而非子类,因为我们需要修改
2、这样会自动产生QUERY_FIND的块、画布、Window,然后我们就可以删除对象组QUERY_FIND,因为用的是Copy,所以上述3个对象还保留着。
修改标准查询块
1、设置块、画布、Window的子类,修改Window的Title属性;这三个对象也可以改名,本例只有一个查询块,不需要。

2、设置块的下一导航块为目标块,上一导航块为自身。

3、仔细看下QUERY_FIND的块,有个块级触发器,还有三个标准Button,它们都有一个WHEN-BUTTON-PRESSED触发器,分别处理清除查询块内容、新建目标块记录、执行查询:

我们需要将其中的'your blockname here'全部改为目标块'EMPLOYEES'。

创建查询条件ITEM
手工创建需要的查询条件Item

修改触发器
1、添加块级QUERY_FIND触发器(该触发器不是Form标准的,所以需要手工输入),代码如下,具体参数含义请直接参考app_find包:

app_find.query_find('EMPLOYEES','QUERY_FIND','QUERY_FIND');

2、添加块级PRE-QUERY触发器,代码如下,注意赋值用Copy,范围查询用app_find.query_date_range:

IF :parameter.g_query_find = 'TRUE' THEN
  copy(name_in('query_find.phone_number'),'EMPLOYEES.phone_number');
  app_find.query_date_range(:query_find.hire_date_from,
                       			:query_find.hire_date_to,
                       			'EMPLOYEES.hire_date');
  :parameter.g_query_find := 'FALSE';
END IF;

修改目标ITEM 查询长度
如果是范围查询,通常Item默认的最大查询长度不够,需要设置得大点,比如200:

修改模块的的第一个导航数据块为:QUERY_FIND

前端FORM:

结果:

3.4.按钮

按钮最重要的触发器就是WHEN-BUTTON-PRESSED

4.触发器层次关系、常用触发器编写规范

4.1.层次关系

说明
当一个事件发生的时候,Forms Engine可一并触发由低到高3个级别(Item、Block、Form)的同名事件,如何触发,由定义低级别的事件时所设置的执行层次决定。
Execution Hierarchy(执行层次):
1、 Override模式,默认模式,不再触发高级别事件
2、 Before模式,触发完本级别的事件后,再触发高级别事件
3、 After模式,先触发高级别事件,再回来触发本级别事件
当然了,如果某一层次我们没定义事件代码,Forms Engine就跳过该级别,直接进入下一级别。
此外,Block中任何Item发生的事件,都可能引发该Block级事件,所以在Block级写本属于Item级的事件,要特别性能问题;Form级事件更有类似问题。

WHEN-VALIDATE-ITEM例子
假设:
1、Item XXX的WHEN-VALIDATE-ITEM的代码是“代码1”,模式是“After”;
2、Item XXX所在BlockWHEN-VALIDATE-ITEM的代码是“代码2”,模式是“Override”;
3、Form级WHEN-VALIDATE-ITEM的代码是“代码3”。
事件:发生Item XXX的WHEN-VALIDATE-ITEM
那么:实际先执行“代码2”,然后执行“代码1”,不会再执行"代码3"。

4.2.触发器原理

Forms的触发器模型类似Windows系统的事件驱动模型,即当某个事件,比如鼠标Click,发生的时候,Forms Engine会去找是否有相应的代码,如果有,就执行之,没有的话就忽略该事件。
学习Oracle Forms触发器,除了理解同一事件的“层次关系”外,更要理解不同事件的“先后关系”,这样才能在实际开发中选择准确合理的触发器,写出精要的代码。
触发器堆栈
当界面上某个动作发生的时候,Forms Engine会把一系列要发生的事件按照“先后关系”压入执行堆栈,然后再从堆栈中一个个事件POP出来逐一执行,任一事件遇到Raise Form-Trigger-Failure,Forms Engine就停止执行、清空堆栈、Rollback事务、设置光标回合适的Item。
比如“光标从块A点入块B”,实际将发生如下事件:

Event Trigger
Validate the item When-Validate-Item
Leave the item Post-Text-Item
Validate the record When-Validate-Record
Leave the record Post-Record
Leave the block Post-Block
Enter the block Pre-Block
Enter the record Pre-Record
Enter the Item Pre-Text-Item
Ready block for input When-New-Block-Instance
Ready record for input When-New-Record-Instance
Ready item for input When-New-Item-Instance
Forms Engine会把这些事件压入执行堆栈,然后逐一执行,如果在某一事件如Pre-Block中Raise Form-Trigger-Failure,Forms Engine会停止其下面所有事件的执行,并认为“光标从块A点入块B”失败,把光标仍然留在块A中。

常用触发器及其顺序
触发器及其触发顺序是最需要想象力和体会的东西

4.3.基于EBS模板开发的触发器

仔细观察Template.fmb,其Form级有很多事件,统一处理各种未被明确处理的事件,统一设置界面的颜色等。其中有些是不能在低级别进行Override的,有些只能在低级别中用Before或After。
比如有些人开发的Form,按F11进入查询模式,但记录颜色是白的而不是我们习惯的浅蓝色,问题的症结在于其在Block级覆盖了when-new-record-instace。

4.3.1. ACCEPT

可以删除原代码,并代之以自行开发的代码;或者编写BLOCK 级的代码并将其执行方式设置为Override。

4.3.2. KEY–DUPREC

默认代码禁止了复制记录;我们可用自己的代码取代它。

4.3.3. KEY–CLRFRM

客户化代码必须放置在原有代码的后面。

4.3.4. KEY–LISTVAL

我们可编写BLOCK 级或ITEM 级的触发器来Override。

4.3.5. POST–FORM

客户化代码须放在原有代码的前面。

4.3.6. PRE–FORM

开发人员需要输入FORM的有关信息,并更改BLOCKNAME。

4.3.7. QUERY_FIND

我们可编写BLOCK 级的触发器来Override。

4.3.8. WHEN–NEW–FORM–INSTANCE

客户化代码须放置在原有代码的前面。

4.3.9. WHEN–NEW–BLOCK–INSTANCE

创建BLOCK 级的触发器,并设置执行方式为Before。

4.3.10. WHEN–NEW–RECORD–INSTANCE

创建BLOCK 级的触发器,并设置执行方式为Before,否则最常见的问题是F11呈白色。

4.3.11. WHEN–NEW–ITEM–INSTANCE

创建BLOCK或Item 级的触发器,并设置执行方式为Before。

4.4.对触发器的一些理解:

On-lock
对On-lock的理解,由于先入为主的缘故,开始一直很苦恼,为什么If里面只用了一个Return,Form怎么知道要锁否?后来才知道On类型的数据库触发器是替换型的,On-lock也不例外,所以只要On-lock不Raise什么东西出来,Form就认为是锁成功了,至于实际的锁,我们有Select……For Update来完成,至于If判断只是进行更加严格的判定。
Pre-Form和When-New-Form-Instance
Pre-Form可以理解为打开Form最先触发的事件,如果其失败,Form就退出。
所以变量比如Global和Parameter的初始化应该最好在Pre-Form里面。
When-New-Form-Instance则是Form初始化完毕,定位到第一个块的第一个可导航的Item的时候触发的,通常用来定义弹性域和Folder、查询某个块。
Post-Query和When-New-Record-Instance
假定数据库中有10条记录,块设置显示行数为8,那么当执行完查询,将连续触发8次Post-Query,仅触发1次When-New-Record-Instance。这是因为前者是记录被Fetch到Form中触发的,后者是光标进入行时触发的。
如果我们在记录间移动光标,包括移回原来的记录,每次都将触发When-New-Record-Instance;而只有移入第9、10条记录时才会触发Post-Query,并且移回“老”记录,是不会再触发的。
如果想给某个字段赋值,通常在Post-Query中,而想根据字段的内容控制行或者某些字段的属性,通常在When-New-Record-Instance中处理。
When-Validate-Item和When-Validate-Record
但字段被修改(包括改回原来的值)、清空,并在光标欲离开该字段,将触发When-Validate-Item,我们可以在里面编写验证代码,验证失败不允许光标离开。
当光标欲离开记录,比如滚动、保存时,将触发When-Validate-Record,我们可以在这里对记录做总体验证。

posted @ 2023-01-06 13:46  胖大海527  阅读(276)  评论(2)    收藏  举报