Crear formas basadas en procedimientos

Posted: octubre 30, 2009 in Forms
Etiquetas: ,

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
DECLARE
r bonus_pkg.bonus_rec;
BEGIN
r.empno := :bonus.empno;
r.ename :=:bonus.ename;
r.job := :bonus.job;
r.sal := :bonus.sal;
r.comm := :bonus.comm;
bonus_pkg.bonus_insert(r);
END;
ON-LOCK bonus_pkg.bonus_lock(:bonus.empno);
ON-UPDATE DECLARE
t bonus_pkg.bonus_rec;
BEGIN
t.empno :=:bonus.empno;
t.ename :=:bonus.ename;
t.job := :bonus.job;
t.sal := :bonus.sal;
t.comm := :bonus.comm;
bonus_pkg.bonus_update(t);
END;
ON-DELETE
DECLARE
t bonus_pkg.bonus_rec;
BEGIN
t.empno :=:bonus.empno;
t.ename :=:bonus.ename;
t.job := :bonus.job;
t.sal := :bonus.sal;
t.comm := :bonus.comm;
bonus_pkg.bonus_delete(t);
END;
ON-COUNT DECLARE
recs NUMBER;
BEGIN
recs := bonus_pkg.count_query;
SET_BLOCK_PROPERTY('bonus', query_hits,recs);
END;
Advertisement

Deja un comentario

Fill in your details below or click an icon to log in:

Logo de WordPress.com

You are commenting using your WordPress.com account. Log Out / Cambiar )

Twitter picture

You are commenting using your Twitter account. Log Out / Cambiar )

Facebook photo

You are commenting using your Facebook account. Log Out / Cambiar )

Connecting to %s