Para crear formas con procedimientos, es decir, usar la propiedad Query Data Source Type con valor PROCEDURE …
Seguir los siguientes pasos:
Paso 1 Crear la tabla BONUS
CREATE TABLE BONUS(
EMPNO NUMBER PRIMARY KEY,
ENAME VARCHAR2(80),
JOB VARCHAR2(30),
SAL NUMBER,
COMM NUMBER );
Paso 2 Crear la especificación del paquete BONUS_PKG
CREATE OR REPLACE PACKAGE bonus_pkg
AUTHID CURRENT_USER
IS
TYPE bonus_rec IS RECORD(
empno_bonus.empno%TYPE,
ename_bonus.ename%TYPE,
job_bonus.job%TYPE,
sal_bonus.sal%TYPE,
comm_bonus.comm%TYPE);
TYPE b_cursor IS REF CURSOR RETURN bonus_rec;
-- este codigo sirve si usamos collections
TYPE bontab IS TABLE OF bonus_rec INDEX BY BINARY_INTEGER;
- este codigo sirve si usamos ref cursor
PROCEDURE bonus_refcur( bonus_data IN OUT b_cursor);
-- procedimiento para hacer la consulta
PROCEDURE bonus_query(bonus_data IN OUT bontab);
-- procedimientos necesarios si usamos ref cursor
PROCEDURE bonus_insert (r IN bonus_rec);
PROCEDURE bonus_lock (s IN bonus.empno%TYPE);
PROCEDURE bonus_update (t IN bonus_rec);
PROCEDURE bonus_delete (t IN bonus_rec);
FUNCTION count_query RETURN number;
END bonus_pkg;
Paso 3 Crear el cuerpo del paquete BONUS_PKG
CREATE OR REPLACE PACKAGE BODY bonus_pkg IS
PROCEDURE bonus_query(bonus_data IN OUT bontab)
AS
ii NUMBER;
CURSOR bonselect IS
SELECT empno
, ename
, job
, sal
, comm
FROM bonus;
BEGIN
OPEN bonselect;
ii := 1;
LOOP
FETCH bonselect
INTO bonus_data( ii ).empno,
bonus_data( ii ).ename,
bonus_data( ii ).job,
bonus_data( ii ).sal,
bonus_data( ii ).comm;
EXIT WHEN bonselect%NOTFOUND;
ii := ii + 1;
END LOOP;
END bonus_query;
PROCEDURE bonus_refcur(bonus_data IN OUT b_cursor)
AS
BEGIN
OPEN bonus_data FOR SELECT empno
, ename
, job
, sal
, comm
FROM bonus;
END bonus_refcur;
PROCEDURE bonus_insert(r IN bonus_rec)
AS
BEGIN
INSERT INTO bonus VALUES(r.empno, r.ename, r.job, r.sal, r.comm);
END bonus_insert;
PROCEDURE bonus_lock(s IN bonus.empno%TYPE)
AS
v_rownum NUMBER;
BEGIN
SELECT empno
INTO v_rownum
FROM bonus WHERE empno=s
FOR UPDATE OF ename;
END bonus_lock;
PROCEDURE bonus_update(t IN bonus_rec)
AS
BEGIN
UPDATE bonus
SET ename=t.ename
, job=t.job
, sal=t.sal
, comm=t.comm
WHERE empno=t.empno;
END bonus_update;
PROCEDURE bonus_delete(t IN bonus_rec)
AS
BEGIN
DELETE FROM bonus WHERE empno=t.empno;
END bonus_delete;
FUNCTION count_query
RETURN NUMBER
AS
r NUMBER;
BEGIN
SELECT COUNT(*)
INTO r
FROM bonus;
RETURN r;
END count_query;
END bonus_pkg;
Paso 4 Crear la forma y el bloque
Construir el bloque usando el wizard basandose en la tabla BONUS, después abrir la paleta de propiedades del bloque que se ha creado
cambiar las siguientes propiedades:
- Cambiar “Query Data Source Type” a procedure
- Cambiar “Query Data Source Name” con el nombre del procedimiento
En este ejemplo usar bonus_pkg.bonus_refcur, si se desea usar tablas plsql o “collections” se deberá usar bonus_pkg.bonus_query - Cambiar “Query Data Source Arguments” con los argumentos apropiados para la establecer la consulta, en este ejemplo “bonus_data” es el nombre para ambos procedimientos
- Cambiar “Type” a nivel argumento ingresar TABLE para hacer usar tablas plsql, REFCURSOR para referenciar al cursor; para este ejemplo usar TABLE
- Cambiar “Type name” poner para este ejemplo “bonus_pkg.bontab”, para el REFCURSOR usar “bonus_pkg.b_cursor”
- Cambiar “Mode” ingresar “IN OUT”
- “Value” es opcional.
Como se construye un bloque basado en un procedimiento y no en un tabla o vista, es necesario codificar los disparadores llamados “transactional triggers”,
en el paso 5 se muestra el código para hacer las operaciones
DML del bloque. Si no se codifican estos disparadores se muestra un error a tiempo de ejecución “FRM-40401 No changes to save” cuando se establece una operación DML como es insert, delete, update.
| Argument | Type | Type Name | Mode | Value |
| bonus_data | REFCURSOR | bonus_pkg.b_cursor | IN OUT | dejar en blanco |
| bonus_data | TABLE | bonus_pkg.bontab | IN OUT | dejar en blanco |
Paso 5Crear los disparadores transacionales “transactional triggers”
los disparadores deben ser creados a nivel bloque
| Disparador | Codigo |
| ON-INSERT | |
| ON-LOCK | bonus_pkg.bonus_lock(:bonus.empno); |
| ON-UPDATE | DECLARE |
| ON-DELETE | |
| ON-COUNT | DECLARE |