El paquete de PLSQL Web sirve al programador de Oracle para poder desarrollar interfaces basados en WWW (World Wide Web) que manipulen bases de datos y por lo tanto interpretables por cualquier navegador como Interntet Eplorer! "etscape! #o$illa%%% &e esta forma! el programador de Oracle obtiene las siguientes venta'as( L)gica siempre del lado del servidor( el PLSQL Web se e'ecuta en el servidor *eb! en concreto mediante un m)dulo llamado mod+plsql! lo cual quiere decir que el peso de los procesos de verificaci)n en las transacciones corren del lado del servidor y no del cliente! con lo que se a,orra traba'o al ordenador cliente% Instalaci)n-.ctuali$aci)n del lado del servidor( al estar todo el c)digo del lado del servidor! la instalaci)n-actuali$aci)n de la aplicaci)n no obliga al programador a despla$arse a los ordenadores clientes o a dar soporte para que se descargue la aplicaci)n as/ como el tiempo necesario de soporte parta de'arla operativa% Independencia de la plataforma( sea cual sea el Sistema Operativo del cliente es seguro que dispondr0 de alg1n navegador que interpretar0 el programa desarrollado por el programador! lo cual ,ace que no sea necesario ning1n cambio traum0tico en los sistemas de la empresa cliente para adaptarse a la aplicaci)n% PLSQL Web se basa en la me$cla de dos lengua'es( PLSQL y 23#L! y su funcionamiento es muy parecido al de otros lengua'es como .SP! 4SP! P2P%%%! es decir! el c)digo PLSQL Web genera p0ginas 23#L! tambi5n llamadas *eb% Esto ,ace que sea un requerimiento que el programador de PLSQL Web sepa mane'arse en 23#L! adem0s del necesario conocimiento de desarrollo de aplicaciones PLSQL% II. ARQUITECTURA PLSQL Web Para desarrollar un sistema PLSQL Web se necesitan como m/nimo estos componentes( 6ase de datos Oracle Servidor *eb .pac,e #odulo PLSQL Web (mod+plsql! tambi5n llamado PLSQL 7ate*ay) "avegador *eb Los tres primeros son la parte servidor! es decir es la que contiene los datos y las presentaciones *eb a las que el cliente acceder0 mediante la cuarta% Esto supone que traba'aremos en un entorno cliente8servidor! de forma que la aplicaci)n no ser0 un ente 1nico sino que se desglosar0 en partes para su me'or desarrollo% Sin entrar en muc,o detalle se puede decir que antiguamente se me$claban en un mismo programa tres partes( La l)gica de la aplicaci)n( es decir el control de los datos (con el mayor peso de c)digo en la aplicaci)n)% El interfa$ de usuario( es la parte que comunica el cliente con la l)gica de la aplicaci)n% Los datos( la parte que tiene registrada la informaci)n necesaria en nuestra aplicaci)n% Este sistema era muy costoso en su desarrollo y mantenimiento( la dificultad de sincron/a en sistemas de datos en red! as/ como la gran cantidad de recursos que consum/a en la m0quina instalada! oblig) a separar estas partes% 2oy en d/a! las aplicaciones que tienen un peso importante tanto de datos! como de l)gica e interfaces aplican en la mayor/a de los casos estos dos esquemas( 9% En dos niveles( en este caso los datos (base de datos) y la l)gica de la aplicaci)n (PLSQL Web) est0n en un ordenador servidor y el cliente accede mediante el interfa$ (navegador *eb) a la aplicaci)n% .s/! el cliente que dispone de un navegador! no accede directamente a la informaci)n! sino que lo ,ace mediante el servidor *eb que mediante el m)dulo mod+plsql recoge los datos del servidor Oracle! siendo el flu'o de datos bidireccional (el cliente puede enviar datos a la base de datos pero la base de datos tambi5n env/a datos al cliente)% Arquitectura a 2 niveles :% . tres niveles( En esta configuraci)n los datos est0n en un ordenador servidor con la base de datos y en otro ordenador servidor est0 el servidor *eb; por otro lado est0 el cliente que accede a la *eb de la aplicaci)n con su navegador *eb% Arquitectura a 3 niveles Sin embargo si las transacciones a la base de datos no son muy altas el modelo a dos niveles es perfectamente factible! relegando el sistema de tres niveles a necesidades cr/ticas% 6ase de &atos Oracle Servidor Web .pac,e mod+plsql <liente Ordenador Servidor Ordenador <liente 6ase de &atos Oracle mod+plsql <liente Ordenador Servidor de &atos Ordenador <liente Servidor Web .pac,e Ordenador Servidor Web III. CONFIGURACION DEL SERVIDOR DATOS/WEB Para poder traba'ar con PLSQL Web necesitamos que todas las partes est5n perfectamente instaladas% . partir de la versi)n de la =i la instalaci)n es muy sencilla! pudiendo instalar el servidor *eb en la misma instalaci)n que el servidor de datos (que deber0 ser la versi)n Enterprise por supuesto)! quedando el primero de ambos instalado en el puerto =>! o en el ???= seg1n la versi)n de Oracle o seg1n el sistema operativo% Pero con esto no basta! deberemos adem0s configurar convenientemente el m)dulo PLSQL Web! para ello accederemos a las opciones de configuraci)n mediante un navegador que acceda al ordenador servidor% Esta ser/a la p0gina inicial a la que podr/amos acceder( Recordar que la IP y puerto pueden ser diferentes en su servidor. Tambin difiere ligeramente la pgina de presentacin del servidor web segn la versin de Oracle. .,ora accederemos al enlace de configuraci)n de del m)dulo PLSQL @mod plsqlA% Se nos presentar0 la siguiente p0gina( Seleccionaremos a,ora @Balores de los descriptores de .cceso a 6ase de datos del 7ate*aysA mostr0ndonos la siguiente p0gina( .qu/ vamos a seleccionar el descriptor SI#PLE&.& que es el que utili$aremos en todo este manual% .s/ pues pulsamos en el icono de editar que nos llevar0 a la p0gina de configuraci)n( &esde aqu/ podemos configurar todos los aspectos fundamentales del modulo PLSQL para el descriptor SI#PLE&.&! pero nosotros nos centraremos en la configuraci)n de la conei)n% .s/! b0sicamente! escogeremos dos maneras de configurar la conei)n 9% &e'ando vac/os los cuadros de username y pass*ord% &e esta forma para acceder a nuestros procedimientos *eb tendremos que ,acer un login% :% &etallando el username y el pass*ord de forma que cuando accedamos a nuestros programas no tengamos la necesidad de ,acer login% "i que decir tiene que este m5todo es muy inseguro y que ,ay que estar muy seguro de lo que se est0 ,aciendo! pues de'amos v/a libre a que cualquier persona e'ecute nuestros procedimientos *eb sin ninguna acreditaci)n% &e cualquier forma en el cuadro de teto de <adena de conei)n tendremos que poner la IP del servidor (o su nombre en la red si ,ay un servidor de nombres%%%) adem0s del puerto y del SI& al que nos conectaremos)! lo ,aremos con el siguiente formato( IP(Puerto(SI& Por 1ltimo aplicaremos los cambios y listo% .,ora despu5s de tanta instalaci)n podemos empe$ar a programar! recordando que para acceder a los procedimientos *eb deberemos poner la ruta base que es (si ,abe/s seguido los pasos anteriores) algo as/( 127:0:0:1:7778/pls/simpledad/<procedimiento a ejecutar> *Recordad que puede cambiar la Ip y el puerto. IV. EL LENGUAJE DE PLSQL Web <omo se ,a dic,o antes el PLSQL Web es una me$cla entre 23#L y PLSQL% En realidad! lo que se ,ace es crear p0ginas 23#L desde el c)digo PLSQL! de manera similar a como lo ,ace .SP! P2P %%% Beamos un simple e'emplo que lo ilustre( CREATE OR RE!ACE ROCE"#RE saludo $% &E'$( )T*R$(T+,)ola -undo,./ E("/ / <omo se puede ver es un simple procedimiento de PLSQL% La 1nica particularidad que tiene es que muestra el mensa'e de C2ola #undoC no lo muestra por consola(SQLPlus) o en un control de de teto(&EBELOPED) si no que lo ,ace en una pagina *eb% Esto lo ,ace mediante la llamada 23#L%PDI"3 que imprime en una p0gina *eb el par0metro que nosotros le pasemos% Este ser/a el resultado( 23P es un paquete que se utili$a para crear las p0ginas 23#L desde PLSQL% <on 5l podemos crear tablas! listas! formularios%%%! todo lo que nosotros queramos% El procedimiento b0sico de este paquete es precisamente el de PDI"3 que ,emos utili$ado en el e'emplo y su uso es precisamente el de escribir c)digo 23#L en la p0gina que se genere% Sin embargo! en el e'emplo anterior nos ,emos aprovec,ado de la fleibilidad de 23#L% Escribi5ndolo forma m0s correcta quedar/a( CREATE OR RE!ACE ROCE"#RE saludo $% &E'$( )T*+,<)T-!><&O"0>,./ )T*+,)ola -undo,./ )T*+,</&O"0></)T-!>,./ E("/ / Lo que ,emos cambiado en primer lugar es que a,ora utili$amos la versi)n contra/da del procedimiento 23P%PDI"3 que es el 23P%P% Lo siguiente es que ,emos aEadido a nuestra p0gina el inicio de 23#L y de 6O&F y tambi5n su final! respetando de esta forma las etiquetas b0sicas que componen una p0gina 23#L% &e esta forma podemos decir que 23P%P sirve para crear p0ginas *eb desde PLSQL% .s/ pues podemos incrustar c)digo 23#L en aplicaciones PLSQL con 23P%P ) podemos crear las p0ginas 23#L mediante el completo api que nos proporciona el paquete 23P% Para que el programador de PLSQL pueda utili$ar cualquiera de ambas s/gase el siguiente cuadro% Etiqueta HTML Funcin del paquete http G23#LH 23P%23#LOPE" G-23#LH 23P%23#L<LOSE G2E.&H 23P%2E.&OPE" G-2E.&H 23P%2E.&<LOSE G3I3LEH#i t/tuloG-3I3LEH 23P%3I3LE(@#i t/tuloA); G6O&FH 23P%6O&FOPE" G-6O&FH 23P%6O&F<LOSE GIOD# .<3IO"JA*eb+a+llamarA #E32O&JK7E3KH 23P%IOD#OPE" (@*eb+a+llamarA! cmet,odJHA7E3A) GI"PL3 3FPEJKtetK ".#EJKnombreK #.MLE"732J9> SINEJ9>H 23I%IOD#3EM3(@nombreA!9>!9>) GI"PL3 3FPEJKsubmitK H 23I%IOD#SL6#I3 GI"PL3 3FPEJKresetK H 23I%IOD#DESE3 G3.6LEH 23P%3.6LEOPE" G-3.6LEH 23P%3.6LE<LOSE G3DH 23P%3.6LEDOWOPE" G-3DH 23P%3.6LEDOW<LOSE G3&H#i&ato 23P%3.6LE&.3.(@#i&atoA); G. 2DEIJKmi*eb%,tmKHEnlaceG-.H 23P%."<2OD(@mi*eb%,tmA!AEnlaceA) GOP<omentario 23#L 8H 23P%<O##E"3(C<omentario 23#LC) "ota( este manual ,ace uso de 23P%P para la creaci)n de todos los e'emplos as/ que si le interesa ,acerlo mediante el api de ,ttp esta tabla se le quedar0 enseguida muy pobre (dada la rique$a en etiquetas y atributos del lengua'e 23#L)! por eso se recomienda en caso de no ,acer uso etensivo del m5todo 23P%P tener bien cerca la referencia en l/nea de Oracle% V. USOS FRECUENTES DE PLSQL WEB 1. Listados Imaginemos que nos interesa tener disponible el listado de las tablas que como usuarios de la base de datos ,emos ido creando% .dem0s! queremos tenerlo disponible v/a *eb! para poder as/ acceder a esta informaci)n siempre! sin necesidad de tener instalado ning1n producto de Oracle en el ordenador en el que reali$amos la consulta% Esto se podr/a ,acer de la forma siguiente( CREATE OR RE!ACE ROCE"#RE lista1ta2las $% C#R%OR C1 $% %E!ECT TA&!E1(A-E 3RO- #%ER1TA&!E%/ &E'$( )T*+,<)T-!><)EA"><T$T!E>!istado de Ta2las</T$T!E></)EA"><&O"0>,./ )T*+,<TA&!E &OR"ER42>,./ 3OR RE' $( C1 !OO E(" !OO/ )T*+,</TA&!E></&O"0></)T-!>,./ )T*+,<TR><T">,55RE'*TA&!E*(A-E55,</T"></TR>,./ E("/ / En este e'emplo podemos ver que en un procedimiento de PLSQL ,acemos que se vayan mostrando los nombres de las tablas que ,emos creado! gracias a uncursor tradicional de PLSQL que nos devuelve las tablas que tenemos (LSED+3.6LES es una tabla que tienen todos los usuarios y que contiene diversa informaci)n sobre nuestras tablas) cuya informaci)n es volcada a trav5s de una p0gina 23#L% .s/ pues siempre que queramos mostrar informaci)n de la base de datos lo podremos ,acer v/a *eb! incrustando la informaci)n de un cursor en una tabla (o en una lista o en cualquier tipo de estructura 23#L)% Otro e'emplo! en este caso aplicado a la tabla de alquileres de videoclub (E4E#+<L3E)% Decordando que estaba compuesta de la siguiente forma( E6E-1C!TE+$"1E6E-+37.8 "($1C!TE+37.8 3EC)A1A!98 "$A%1A!9. podr/amos mostrar sus datos de la siguiente forma( CREATE OR RE!ACE ROCE"#RE lista1al:uileres $% C#R%OR C1 $% %E!ECT ; 3RO- E6E-1C!TE OR"ER &0 3EC)A1A2/ &E'$( )T*+,<)T-!><&O"0><#!>,./ 3OR RE' $( C1 !OO )T*+,<!$>Al:uiler con <ec=a de ,55RE'*3EC)A1A255, de la pel>cula ,55RE'*$"1E6E-55, reali?ado por ,55RE'*"($1C!TE55, con una duraci@n de ,55RE'*"$A%1A255, d>as*,./ E(" !OO/ )T*+,</#!></&O"0></)T-!>,./ E("/ / .,ora ,emos presentado de otra forma la informaci)n( en una lista% En cada uno de sus items mostramos una pequeEa frase que describe la informaci)n de cada l/nea de alquileres! pero al igual que en el caso anterior utili$ando un cursor y entreme$clando la informaci)n de 5ste con c)digo 23#L% EJERCICIO: odi!ica el e"emplo anterior #aciendo que la in!ormaci$n se muestre en una p%&ina de t'tulo ()I*+A,O ,E A)-.I)ERE*(/ y que en esta caso muestre la in!ormaci$n en una tabla en ve0 de con listas. Adem%s deber1is conse&uir que en ve0 del I,2EJE sal&a el t'tulo de la pel'cula y en ve0 del ,3I2C)+E sal&a el nombre del cliente. 2. Formularios En 23#L! si queremos obtener entrada de datos del usuario! se utili$an controles (como ca'as de teto! botones de opci)n! etc%%% ) incrustados en formularios% &e esta forma! la p0gina 23#L es capa$ de interactuar con el usuario en ve$ de sacar de manera continua m0s y m0s listados de datos% &ic,o de otra manera! el formulario es la forma que el lengua'e 23#L tiene de recoger informaci)n del cliente% &e ,ec,o! una de las utilidades t/picas de los formularios es la de recopilar las opiniones de los visitantes de la p0gina sobre los aspectos a me'orar de la misma% Bamos a ver a,ora un sencillo e'emplo de un formulario creado con PLSQL Web( CREATE OR RE!ACE ROCE"#RE <ormulario $% &E'$( )T*+,<)T-!><&O"0><3OR- ACT$O(4Ainsertar1datosBopinion14opinion1A>,./ )T*+,<=C>Ejemplo de 3ormulario</=C>,./ )T*+,"anos tu opini@n***<&R>,./ )T*+,<$(#T T0E4AteDtA (A-E4Aopinion1A><&R>,./ )T*+,<$(#T T0E4Asu2mitA>,./ )T*+,</3OR-></&O"0></)T-!>,./ E("/ / QQu5 es lo que se ,ace en este bloque de c)digoR Lo primero! abrir un form en el procedimiento cuya acci)n es llamar a otro procedimiento (insertar+datos)% Sste se encargar/a de coger la informaci)n del control de teto (opini)n9) y gestionarla como fuese (por e'emplo insertarla a la base de datos para poder eaminarla m0s tarde)% Beamos a,ora como podr/a ser ese procedimiento de insertar+datos( CREATE OR RE!ACE ROCE"#RE insertar1datos +opinion1 in c=ar. $% &E'$( $(%ERT $(TO datos EA!#E%+opinion1./ )T*+,ReFistro insertado correctamente***,./; EGCET$O( H)E( OT)ER% T)E( )T*+,Error al insetar el reFistro***,./; E("/ / <omo se puede ver! el procedimiento recibe un par0metro que es el teto que vamos a insertar en la base de datos (el que ,aya escrito el usuario en el @tetA del procedimiento anterior)% 2ec,os con 5l! lo insertamos en la base de datos (en concreto en una tabla que ,emos llamado @datosA) informando de ello al usuario de la p0gina% .dem0s! si por alguna ra$)n se produ'era un error nos mostrar0 un mensa'e alternativo mostrando la imposibilidad de ,acer esta inserci)n% Estas versiones alternativas de p0ginas 23#L en tiempo de e'ecuci)n las conseguimos gracias a gesti)n de errores de PLSQL% * 3ota: no es aconse"able mostrar estos mensa"es sin #aber abierto las etiquetas 4+) y 5O,6 7y cerr%ndolas despu1s de mostrar el mensa"e8/ pero en este caso nos aprovec#amos de la !le9ibilidad de 4+) para &enerar un c$di&o al&o menor/ eso s'/ aconse"ando al pro&ramador que para proyectos importantes procure respetar todas las etiquetas necesarias para crear una p%&ina 4+). EJERCICIO: 4aced una p%&ina :)*-) ;eb que permita #acer las altas de los nuevos clientes de la cadena de videoclubs. 3. Las cookies 2ay muc,as veces en las que interesa que cierta informaci)n se guarde en el ordenador cliente% 23#L no es una ecepci)n a esta necesidad! pero su sistema de guardado esta ciertamente limitado debido a eigencias de seguridad! son las cooTies! pequeEos arc,ivos que nos env/an los servidores con informaci)n que interesa que este en el lado del servidor por dos ra$ones fundamentales( 9% Quitar ciertas transacciones cliente8servidor% .l guardar informaci)n en el lado del cliente evitaremos tener que recibir en el servidor peticiones de los clientes solicitando las mismas% Por supuesto esta manera de traba'o no es etensible a toda la informaci)n del cliente! s)lo a la adecuada(por e'emplo! el nombre de usuario y su pass*ord que se pide en muc,as p0ginas! de tal forma que no necesite ,acer login siempre que entre en la p0gina)% :% 7uardar variables en el ordenador cliente que contengan ciertas informaciones de la sesi)n del cliente U(por e'emplo! en una p0gina de compras online! podemos ,acer una cooTie que guarde los productos que vamos aEadiendo al carrito de la compra)% *:)*-) no tiene variables de sesi$n/ lo que obli&a a #acer un uso e9tensivo de las coo<ies para cuando 1stas variables se requieran. Beamos a continuaci)n un e'emplo de p0gina 23#L que use de las cooTies CREATE OR RE!ACE ROCE"#RE cooIie $% &E'$( OHA1#T$!*mime1=eader +,teDt/=tml,8 3A!%E./ OHA1COO7$E*send +,miFalletita,8 ,pls:l es lo mas,./ OHA1#T$!*=ttp1=eader1close/ )T*+,CooIie mandada***,./ EGCET$O( H)E( OT)ER% T)E( )T*+,ro2lema al mandar la CooIie***,./ E("/ / Este es un simple e'emplo que manda una cooTie al ordenador cliente% La cooTie se llama migalletita! y lo que 5sta contiene es una cadena de caracteres (@plsql es lo m0sA)% Las dos llamadas a OW.+L3IL ,acen que el mensa'e se env/e en la cabecera mime y que no est5 en formato ,tml (visible para todo el mundo)% . partir de este momento! podemos utili$ar la cooTie en toda la sesi)n en la que el usuario est5 en nuestro sitio *eb% Pues bien! a,ora ya sabemos como se guarda la cooTie en un ordenador cliente! pero! Qc)mo se recupera informaci)n de una cooTie ya guardadaR "ada me'or que un e'emplo( CREATE OR RE!ACE ROCE"#RE deJuelJe1cooIie $% micooIie OHA1COO7$E*cooIie/ &E'$( micooIie :4 OHA1COO7$E*Fet +,miFalletita,./
$3 micooIie*num1Jals 4 0 T)E( =tp*print+,error desconocido***,./ else )T*+,!a cooIie contiene: ,55 micooIie*Jals+1../ end i</ E("/ / Este procedimiento lee el contenido de la cooTie antes escrita utili$ando diferentes m5todos y definiciones del paquete OW.+<OOVIE que como su nombre indica nos sirve para el mane'o de 5stas% .l principio creamos una definici)n de cooTie vac/a para! ya en el 6E7W"! recogerla con la funci)n get% &espu5s! verificamos que la cooTie contenga algo% .s/ llamamos al m5todo num+vals que nos devolver0 > en el caso de que migalletita no tenga ning1n valor asociado! en ese caso informa de que se ,a producido alg1n error desconocido% En caso contrario escribimos el valor 9 (vals(9)) de la cooTie! que no es otro que el de @plsql es lo m0sA% .s/ pues! para mandar una cooTie utili$amos el m5todo send(nombre+cooTie!Avalor de la cooTieA)! y para si queremos devolverla lo ,acemos en una cooTie vac/a mediante el m5todo get% Para etraer de esta cooTie el valor que nos interese utili$aremos el m5todo vals(n1mero+de+valor8empe$ando por 98)% Nota: Este manual no profundiza en el uso de cookies pero si hace un uso ms o menos tpico de ellas. Para ms informacin acerca de las cookies aconsejamos un manual de referencia avanzado (por ejemplo el: O'Reilly Oracle Web Applications Plsql Developer'S Introduction) o la referencia en lnea de Oracle). Ejercicio: Desarrollad un procedimiento web que pida un nombre de usuario y contrasea. ste llamara a otro que verifique que el username y el password se correspondan con pepe y 6789 respectivamente. As, si el login es correcto se llamar a un procedimiento que mostrar los nombres de todas nuestras tablas en la base de datos. Si el login falla deber mostrarse un mensaje de error. "i que decir tiene que el procedimiento que muestra las tablas debe ser lo m0s seguro posible! es decir! que s)lo si se ,a pasado el login se debe poder e'ecutarlo! a,/ es donde deben entrar las cooTies% VI. Ejercicio !e PL"SQL Web 9% 2aced un listado ,tml con los clientes de la cadena mediante el uso de un cursor( create or replace procedure lista+cites is cursor c9 is select U from cite; begin ,tp%print(CG,tmlHC); ,tp%print(CGbodyHC); ,tp%print(CGtableHC); for reg in cl loop ,tp%print(CGtrHC); ,tp%print(CGtdHCXXreg%dni+clte); ,tp%print(CGtdHCXXreg%nom+clte); ,tp%print(CGtdHCXXreg%dir+clte); ,tp%print(CGtdHCXXreg%telefono); ,tp%print(CGtdHCXXreg%edad); ,tp%print(CG-trHC); end loop; ,tp%print(CG-tableHC); ,tp%print(CG-bodyHC); ,tp%print(CG-,tmlHC); end; - :% 2aced una aplicaci)n ,tml que pida en un form un dni mediante un control de teto y un bot)n de submit! y 5ste llame a un procedimiento que mediante un cursor nos liste los alquileres efectuados por el cliente% create or replace procedure formdni is begin ,tp%print(CG,tmlHC); ,tp%print(@GbodyHC); ,tp%print( @ Gform actionJY,ttp(--9Z:%9[=%9%9\-pls-simpledad-,ob:%alquilerdniR dniJdniYHC); ,tp%print(CGinput typeJtet nameJdniHC); ,tp%print(CGinput typeJsubmitHC); ,tp%print(CGformHC); ,tp%print(CG-bodyHC); ,tp%print(CG-,tmlHC); end; - create or replace procedure alquilerdni (dni c,ar) is cursor cl is select U from e'em+cIte *,ere dni+clteJdni; begin ,tp%print(CG,tmlHC); ,tp%print(CGbodyHC); ,tp%print(CGtable borderJ:HC); ,tp%print(CGtrHGtdHid+e'emGtdHdni+clteGtdHfec,aGtdHdiasG-trHC); for reg in c9 loop ,tp%print(CGtrHC); ,tp%print(CGtdHCXXreg%id+e'em); ,tp%print(CGtdHCXXreg%dni+clte); ,tp%print(CGtdHCXXlreg%fec,a+a:); ,tp%print(CGtdHCXXreg%dias+a:); ,tp%print(CG-trHC); end loop; ,tp%print(CG-tableHC); ,tp%print(CG-bodyHC); ,tp%print(CG-,tmlHC); end; - \% 2aced un procedimiento ,tm/ que inserte un nuevo registro en la base de datos% &ispondremos en primer lugar de un procedure que nos mostrar0 el form para dar de alta al cliente! y un segundo procedure que recibir0 los datos del primero y informar0 si se ,a insertado correctamente( create or replace procedure forminsertar is begin ,tp%print(CG,tmlHC); ,tp%print(CGbodyHC); ,tp%print(CIntroduce el nuevo cliente (dni! nombre!direccion!telefono!edad)(GbrHC); ,tp%print(CGform actionJY,ttp(--9Z:%9[=%9%9\-pls-simpledad-,ob:%insertarR dniJdni]nomJnom]dirJdir]teletonoJtelefono]edadJedadYHC); ,tp%print(CGinput typeJtet si$eJ9> nameJdniHC); ,tp%print(CGinput typeJtet si$eJ9> nameJnomHC); ,tp%print(CGinput type8tet si$eJ9> nameJdirHC); ,tp%print(CGinput typeJtet si$eJ9> nameJtelefonoHC); ,tp%print(CGinput typeJtet si$eJ9> nameJedadHC); ,tp%print(CGbrHC); ,tp%print(CGinput typeJsubmitHC); ,tp%print(CG-bodyHC); ,tp%print(CG-,tmlHC); end; - create or replace procedure insertar(dni c,ar!nom c,ar! dir c,ar! telefono c,ar!edad number) is begin insert into clte values(dni !nom!dir!telefono!edad); ,tp%print(CG,tmlHC); ,tp%print(CGbodyHC); ,tp%print(CG,:HDegistro insertado correctamenteG-,:HC); ,tp%print(CG-bodyHC); ,tp%print(CG-,tmlHC); end; - ^% 2aced una aplicaci)n que muestre los alquileres del d/a actual de la siguiente forma; create or replace procedure alq+,oy is cursor cl is select U from el e'em+clte *,ere fec,a+a:Jto+c,ar(sysdate); nom clte%nom+cIte _type; tit pel%titulo_type; begin ,tp%print(CG,tmlHC); ,tp%print(CGbodyHC); ,tp%print(CG,\H.lquileres del CXXsysdateCXXG-,\HC); ,tp%print(CGtable borderJ 9HC); ,tp%print(CGtrHC); ,tp%print(CGtdH"ombre clienteGtdHPel/culaC); ,tp%print(CG-trHC); for reg in c9 loop select nom+clte into nom from clte *,ere dni+clteJreg%dni+clte; select titulo into tit from pel *,ere id+pel in (select id+pel from e'em *,ere id+e'emJreg%id+e'em); ,tp%print(CGtrHC); ,tp%print(CGtdHCXXnomXXCGtdHCXXtit); ,tp%print(CG-trHC); end loop; ,tp%print(CG-tableHC); ,tp%print(CGbodyHC); ,tp%print(CG-,tmlHC); a:Jto+c,ar(sysdate); end; - `% 2aced un formulario *eb mediante pl8sql! de tal forma que al darle un apellido! nombre! o parte de ellos! nos saque todos los nombres de personas (con sus correspondientes datos%%%) eistentes en la base de datos% .dem0s! nos interesa que no distinga en la consulta entre may1sculas y min1sculas% create or replace procedure formlistanom is begin ,tp%print(CG,tmlHC); ,tp%print(CGbodyHC); ,tp%print(CGform actionJY,ob:%listanomRparamJparamYHC); ,tp%print(CG,\H6usqueda por nombre o apellido%%%G-,\HC); ,tp%print(CGinput typeJtet si$eJ9> nameJparamHC); ,tp%print(CGinput typeJsubmitHC); ,tp%print(CG-formHC); ,tp%print(CG-bodyHC); ,tp%print(CG-,tmlHC); end; - create or replace procedure listanom (param c,ar)is cursor cl is select U from clte *,ere upper(nom+clte) liTe C_CXXupper(param)XX C_C; begin ,tp%print(CG,tmlHC); ,tp%print(CGbodyHC); ,tp%print(CGtable borderJ9HC); ,tp%print(CGtrHC); ,tp%print(CGtdH&niGtdH"ombreGtdH&irecci)nGtdH3lfnoGtdHEdadC); ,tp%print(CG-trHC); for reg in c9 loop ,tp%print(CGtrHC); ,tp%print(CGtdHCXXreg%dni+clteXXCGtdHCXXreg%nom+clteXXCGtdHCXXreg%dir+clteXXCGtdHCXX reg%telefonoXXCGtdHCXXreg%edad); ,tp%print(CG-trHC); end loop; ,tp%print(CG-tableHC); ,tp%print(CG-bodyHC); ,tp%print(CG-,tmlHC); end; - Este manual ,a sido desarrollado por mi y no se basa en ninguna trascripci)n de manual alguno y por supuesto sus e'ercicios son originales% Por ello me gustar/a que si ,aces uso de 5l respetes este parrafo que identifica al autor% Pido adem0s que si ,aces uso de 5l seas tan amable de mandarme un mail para contarme brevemente lo para que lo quieres o que te ,a parecido% Oscar Polo Iern0nde$ :>>^% oraclemanatelefonica%net