Академический Документы
Профессиональный Документы
Культура Документы
Tip
In Forms 5.x and above , a block can have separate sources for
each of the SELECT, INSERT, UPDATE, DELETE, and LOCK DML
operations, and each of these can be changed dynamically.
Here is an additional tip that will help as you work with base
tables based on a FROM clause query:
empno NUMBER(4),
ename VARCHAR2(10),
job VARCHAR2(9),
hiredate DATE,
sal NUMBER(11,2),
deptno NUMBER(2),
dname NUMBER(14));
errm OUT
VARCHAR2);
PROCEDURE insert_procedure(insert_rec IN
OUT dept_emp,
retcd OUT NUMBER,
errm OUT
VARCHAR2);
PROCEDURE update_procedure(update_rec IN
OUT dept_emp,
errm OUT
VARCHAR2);
PROCEDURE delete_procedure(delete_rec IN
OUT dept_emp,
errm OUT
VARCHAR2);
END PKGDEPTEMP_FROMCLAUSE;
BEGIN
RETURN(SUCCESS);
END;
BEGIN
SELECT empno
INTO v_temp
FROM emp
WHERE empno=lock_rec.empno
FOR UPDATE;
retcd := SUCCESS;
errm := SQLERRM;
END lock_procedure;
FROM dept
WHERE deptno=insert_rec.deptno;
v_temp NUMBER(4);
BEGIN
OPEN csr_deptemp;
IF csr_deptemp%NOTFOUND THEN
END IF;
CLOSE csr_deptemp;
VALUES (insert_rec.empno,
insert_rec.ename, insert_rec.job,
insert_rec.hiredate,
insert_rec.sal, insert_rec.deptno);
retcd := SUCCESS;
retcd := SQLCODE;
errm := SQLERRM;
END insert_procedure;
FROM dept
WHERE deptno=update_rec.deptno;
v_temp NUMBER(4);
BEGIN
based on EMPNO */
OPEN csr_dept;
FETCH csr_dept INTO v_temp;
IF csr_dept%NOTFOUND THEN
VALUES(update_rec.deptno,update_rec.dname);
END IF;
CLOSE csr_dept;
--
UPDATE emp
SET ename=update_rec.ename,
job=update_rec.job,
hiredate=update_rec.hiredate,
sal =update_rec.sal,
deptno=update_rec.deptno
WHERE empno=update_rec.empno;
retcd := SUCCESS;
errm := SQLERRM;
END update_procedure;
BEGIN
retcd := SUCCESS;
retcd := SQLCODE;
errm := SQLERRM;
END delete_procedure;
END PKGDEPTEMP_FROMCLAUSE;
ON-INSERT trigger
DECLARE
dept_emp_rec pkgdeptemp_fromclause.dept_emp;
retcd NUMBER;
errm VARCHAR2(100);
BEGIN
dept_emp_rec.empno := :fromclause_blk.empno;
dept_emp_rec.ename := :fromclause_blk.ename;
dept_emp_rec.job := :fromclause_blk.job;
dept_emp_rec.hiredate :=
:fromclause_blk.hiredate;
dept_emp_rec.sal := :fromclause_blk.sal;
dept_emp_rec.deptno :=
:fromclause_blk.deptno;
dept_emp_rec.dname := :fromclause_blk.dname;
Pkgdeptemp_fromclause.insert_procedure(dept_emp_
rec, retcd, errm);
IF (retcd !=
pkgdeptemp_fromclause.get_success) THEN
MESSAGE(errm);
RAISE FORM_TRIGGER_FAILURE;
END IF;
END;
ON-UPDATE trigger
DECLARE
dept_emp_rec pkgdeptemp_fromclause.dept_emp;
retcd NUMBER;
errm VARCHAR2(100);
BEGIN
dept_emp_rec.empno := :fromclause_blk.empno;
dept_emp_rec.ename := :fromclause_blk.ename;
dept_emp_rec.job := :fromclause_blk.job;
dept_emp_rec.hiredate :=
:fromclause_blk.hiredate;
dept_emp_rec.sal := :fromclause_blk.sal;
dept_emp_rec.deptno :=
:fromclause_blk.deptno;
dept_emp_rec.dname := :fromclause_blk.dname;
Pkgdeptemp_fromclause.update_procedure(dept_emp_
rec, retcd, errm);
IF (retcd !=
pkgdeptemp_fromclause.get_success) THEN
MESSAGE(errm);
RAISE FORM_TRIGGER_FAILURE;
END IF;
END;
ON-DELETE trigger
DECLARE
dept_emp_rec pkgdeptemp_fromclause.dept_emp;
retcd NUMBER;
errm VARCHAR2(100);
BEGIN
dept_emp_rec.empno := :fromclause_blk.empno;
dept_emp_rec.ename := :fromclause_blk.ename;
dept_emp_rec.job := :fromclause_blk.job;
dept_emp_rec.hiredate :=
:fromclause_blk.hiredate;
dept_emp_rec.sal := :fromclause_blk.sal;
dept_emp_rec.deptno :=
:fromclause_blk.deptno;
dept_emp_rec.dname := :fromclause_blk.dname;
Pkgdeptemp_fromclause.delete_procedure(dept_emp_
rec, retcd, errm);
IF (retcd !=
pkgdeptemp_fromclause.get_success) THEN
MESSAGE(errm);
RAISE FORM_TRIGGER_FAILURE;
END IF;
END;
ON-LOCK_trigger
DECLARE
dept_emp_rec pkgdeptemp_fromclause.dept_emp;
retcd NUMBER;
errm VARCHAR2(100);
BEGIN
dept_emp_rec.empno := :fromclause_blk.empno;
dept_emp_rec.ename := :fromclause_blk.ename;
dept_emp_rec.job := :fromclause_blk.job;
dept_emp_rec.hiredate :=
:fromclause_blk.hiredate;
dept_emp_rec.sal := :fromclause_blk.sal;
dept_emp_rec.deptno :=
:fromclause_blk.deptno;
dept_emp_rec.dname := :fromclause_blk.dname;
Pkgdeptemp_fromclause.lock_procedure(dept_emp_re
c, retcd, errm);
IF (retcd !=
pkgdeptemp_fromclause.get_success) THEN
MESSAGE(errm);
RAISE FORM_TRIGGER_FAILURE;
END IF;
END;
Tip
empno NUMBER(4),
ename VARCHAR2(10),
job VARCHAR2(9),
hiredate DATE,
sal NUMBER(11,2),
deptno NUMBER(2),
dname VARCHAR2(14));
p_empno IN NUMBER);
END PKGDEPTEMP;
p_empno IN NUMBER)
IS
BEGIN
/* The code below selects from the EMP and DEPT tables
into a REF cursor and
automatically */
END query_procedure;
tempout NUMBER(4);
BEGIN
written by Forms */
SELECT empno
INTO tempout
FROM emp
WHERE empno=dmlset(i).empno
FOR UPDATE;
END LOOP;
END lock_procedure;
SELECT deptno
FROM dept
WHERE deptno=dmlset(i).deptno;
tempout NUMBER(4);
BEGIN
OPEN c_dept(i);
IF c_dept%NOTFOUND THEN
END IF;
CLOSE c_dept;
VALUES(dmlset(i).empno,dmlset(i).ename,
dmlset(i).job,
dmlset(i).hiredate, dmlset(i).sal,
dmlset(i).deptno);
NULL;
END LOOP;
END insert_procedure;
SELECT deptno
FROM dept
BEGIN
OPEN c_dept(i);
IF c_dept%NOTFOUND THEN
VALUES(dmlset(i).deptno,dmlset(i).dname);
ELSE
UPDATE dept
END IF;
CLOSE c_dept;
--
UPDATE emp
SET ename=dmlset(i).ename,
job=dmlset(i).job,
hiredate=dmlset(i).hiredate,
sal =dmlset(i).sal,
deptno=dmlset(i).deptno
WWWHERE empno=dmlset(i).empno;
END LOOP;
END update_procedure;
BEGIN
END LOOP;
END delete_procedure;
END PKGDEPTEMP;
Here are some additional tips that will help when you base
blocks on stored procedures:
1. Specify extra parameters, one each for the items that are
Query Allowed, to the Query Data Source procedure.
This can be done while defining the stored package or at
a later stage.
2. Specify the value clause for each parameter as the item
name or form parameter name that supplies the IN value
to each query procedure parameter defined in step 1.
Again, this can be done while creating the block or later
on, using the Data Block Wizard.
Tip
Note that the technique described here works only for exact
equality matches and without involving any other operators,
such as >, <, and so on. For example, if the user enters > 1000
in the EMPNO item, an error occurs. Additional functionality for
nonequality and LIKE matches should be coded explicitly in the
Query procedure.