Este es un ejemplo de un bucle o loop que funciona sobre Forms (Oracle).
1 2 3 4 5 6 7 8 9 10 11 12 | FIRST_RECORD; -- LOOP -- IF :SYSTEM.LAST_RECORD = 'TRUE' THEN Exit; ELSE Next_Record; END IF; -- END LOOP; |
Para conocer que objetos se quedan descompilados en la base de datos, podemos lanzar esta select que nos devolverá todos los objetos que estén actualmente descompilados. Nos devolverá el comando para que podamos ejecutarlo y recompilar el objeto.
1 2 3 4 5 6 7 8 9 10 11 12 13 | SELECT decode( object_type , 'VIEW' ,'Alter View ' || OBJECT_NAME || ' Compile;' , 'PACKAGE BODY' ,'Alter Package ' || OBJECT_NAME || ' Compile Body;' , 'TRIGGER' ,'Alter Trigger ' || OBJECT_NAME || ' Compile;' , 'FUNCTION' ,'Alter Function ' || OBJECT_NAME || ' Compile;' , 'PROCEDURE' ,'Alter Procedure ' || OBJECT_NAME || ' Compile;' , 'PACKAGE' ,'Alter Package ' || OBJECT_NAME || ' Compile;' ,'--'||object_type||'--'||OBJECT_NAME|| ' ??? ' ) COMANDO_COMPILAR_OBJETO FROM user_objects WHERE STATUS = 'INVALID' / |
Actualmente podemos encontrarnos con numerosos gestores de base de datos, que van desde Oracle, MySql, SqlServer, TransacSQL a otros no tan conocidos como Aerospike, CouchBase, Tokyo Cabinet, Big Table, MenCacheDB, etc.
Podemos realizar una división entre estos dos grupos de sistemas de gestión de bases de datos, por un lado tenemos los sistemas que utilizan SQL como el lenguaje para obtener y modelar los datos en la base de datos (Oracle, MySql, SqlServer,…). Por otro lado están los sistemas que no utilizan SQL (NoSQL) y que tienen lenguajes propietarios para modelar la base de datos (Aerospike, CouchBase, Big Table, Cassandra,…)
Recordemos que SQL es un lenguaje de consulta estructurado, SQL nos permite acceder a las bases de datos y obtener cualquier información o realizar operaciones con los datos. Utiliza el algebra y el cálculo relacional para obtener los datos de una manera sencilla.
Este estándar se utiliza mayoritariamente en la gestión de bases de datos, fue a principios de los 70 cuando se empezó a trabajar en el lenguaje SEQUEL, que es de dónde viene el lenguaje SQL. No obstante, hasta casi diez años después en 1979 no se introdujo comercialmente, fue en esta fecha cuando Oracle lo lanzo por primera vez en una aplicación comercial.
Las bases de datos No-SQL tienen en común que no utilizan el estándar SQL como lenguaje de interacción con las bases de datos, así pues cada una de ellas puede tener su propio lenguaje propietario e incluso su propia estructura. En cuanto a estructura se refiere podemos dejar a un lado las bases de datos relacionales para encontrarnos con bases de datos de tipo clave-valor (key-value), documentos Jason o XML, orientadas a grafos u orientadas a columnas, etc. Así pues, podemos observar que la manera de relacionar los datos en estas bases de datos no tienen porque utilizar el modelo entidad-relación.
Podemos encontrar varios inconvenientes siempre que trabajemos con bases de datos que no utilicen el estándar SQL, entre estos podemos encontrarnos con problemas para encontrar gente formada en este tipo de base de datos en particular, ya que al salirse del estándar SQL será más difícil encontrar soluciones a los problemas que puedan ir surgiendo con la base de datos.
Otro de los problemas de difícil solución que podemos encontrarnos es que este tipo de base de datos es la dificultad que podemos encontrar a la hora de migrar la aplicación a otro tipo de base de datos, por lo que, es posible que no podamos cambiar de sistema de gestión de base de datos tan fácilmente como cuando utilizamos un sistema basado en SQL.
Como ventajas, podemos observar que los sistemas de gestión de bases de datos basados en SQL utilizan el modelo relacional, en determinados casos este modelo no se adapta a tu modelo de negocio, por lo tanto, podemos encontrarnos con otros modelos que se adapten mucho mejor al modelo de negocio que quieres implantar.
La velocidad es una de las características más importantes que podemos obtener de un tipo de base de datos de este tipo. Por ejemplo, si necesitamos un modelo basado en estructuras de grafos, podemos encontrar bases de datos No-SQL basados en este modelo, que nos permitirán obtener los datos con mucha más velocidad que otros modelos basados en el modelo relacional y que queramos utilizarla para hacer consultas de tipo de estructura de grafos.
Podemos encontrar numerosos modelos diferentes, por ejemplo, el modelo Big Table de Google, es un modelo que está basado en columnas, Neo4j es una base de datos basada en grafos, HBase es una base de datos basada en el mapeo de columnas, Redis está basada en el tipo clave-valor.
Como podemos ver, hay numerosos tipos de bases de datos con unas diferencias en su estructuración considerables debido a esto es posible encontrar un SGBD que se adapte a las necesidades del cliente.
Big Table es un SGBD que creó Google para gestionar sus bases de datos en el año 2004, entre las características más importantes del desarrollo es que querían conseguir un sistema que fuese escalable fácilmente, el sistema iba a ser distribuido en multitud de máquinas y necesitaban que fuese altamente eficiente.
Google puso en marcha este proyecto porque los sistemas de bases de datos tradicionales no le convencían lo suficiente para almacenar grandes cantidades de datos, además la rapidez que ofrecían estas bases de datos no eran lo suficiente cuando hablamos de grandes cantidades de datos. La mayoría de los SGBD fueron diseñados para trabajar en un servidor o en arquitecturas poco escalables en comparación con lo que Google necesitaba para tratar sus enormes cantidades de datos, del orden de Petabytes.
Es un sistema que divide la información en columnas, para almacenar la información utiliza tablas multidimensionales compuestas de celdas, cada uno de estas celdas dispone de varias versiones para poder realizar un seguimiento de los valores que ha ido tomando esa celda en el tiempo. Como concepto podría entenderse como un mapa multidimensional dónde podemos ver las filas, las columnas y por último el tiempo.
El sistema de archivos que utiliza Big Table es el denominado GFS (Google File System), que no es más que un sistema de archivos distribuido del mismo propietario (Google).
Una característica muy importante de este sistema es la compresión de los datos, Big Table utiliza dos algoritmos de compresión muy rápidos para comprimir los datos. No obstante, con este algoritmo Big Table nos permite obtener parte de los datos sin tener que descomprimir el dato en su totalidad. Esto les da cierta flexibilidad y sobretodo velocidad frente a otros gestores de datos. Las estimaciones de velocidad en compresión y descompresión de datos apuntan a los valores de 100 – 200 MB/s y 400 – 1000 MB/s respectivamente.
Como viene siendo habitual en Google, el API de Big Table es de acceso público, por lo que cualquier persona puede acceder al API y realizar cualquier prueba o desarrollo. No obstante Big Table no se distribuye fuera de Google aunque se puede acceder a ella a través de Google App Engine. El lenguaje de implantación que utiliza es el lenguaje C y/o lenguaje C++.
Google utiliza este sistema de gestión de base de datos en muchas de sus aplicaciones entre otras en Gmail, Google Book Search, Google Finance, Google Reader, Google Maps y Google Analytics.
GFS está desarrollado para poder almacenar información sobre un sistema de ficheros distribuidos, de una manera rápida y eficaz, además GFS le da mucha importancia a la seguridad de los datos. Este sistema no guarda los datos en un mismo ordenador o servidor sino que cada vez que almacena un dato realiza varios trozos (chunk) y almacena hasta tres copias de cada trozo.
La arquitectura tiene dos tipos de ordenadores diferentes. Por un lado están los de tipo Master que almacenan la dirección dónde están guardados los trozos que componen los ficheros. Por otro lado, están los Chunk Server, que son los ordenadores o servidores que tienen almacenados los datos. Con esta jerarquía de trabajo logran no saturar los servidores Maestros de peticiones y respuestas de datos ya que ellos redirigen el trabajo a los Chunk Server, que serán los encargados de enviar los datos al usuario final.
Estos Chunk Server son los encargados de almacenar y enviar los datos, cuando almacenan no distinguen entre operaciones ya que solo utilizan la operación de escribir datos, es decir, solo es posible añadir datos, no se sobrescriben como otras muchos sistemas de almacenamiento de datos.
Este sistema tiene la capacidad de asignar más recursos a los ficheros que más se utilizan logrando así que la asignación de recursos no sea homogénea y se pueden liberar recursos de ficheros que se utilizan menos a otros ficheros que se utilizan más.
Por último, comentar que GFS es un sistema de archivos que no está dentro del sistema operativo, sino que es accesible por medio de librerías, esto nos permite utilizar GFS con varios sistemas operativos y no depender del sistema operativo.
Google pone a la disposición de los desarrolladores un plugin (Google Web Toolkit) que se incorpora en el entorno de desarrollo Eclipse, con el cual podrás desarrollar directamente desde este IDE. Una vez realizado esto podrás publicar tus aplicaciones desde la propia interface de Eclipse.
Puedes encontrar más información en la página que Google pone a disposición de los desarrolladores: la guía del desarrollador.
Por último, para poder utilizarlo debes de tener una cuenta de Google vinculada al AppEngine.
http://es.wikipedia.org/wiki/BigTable
http://www.nosql.es/blog/nosql/cassandra.html
http://es.wikipedia.org/wiki/NoSQL
Función para enviar emails utilizando el paquete UTL_HTTP de Oracle.
La función es básicamente esta, en la que tenéis que cambiar los datos de los destinatarios, del envío, adjuntos, y el link_mail desde dónde se realizará.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 | FUNCTION ejemplo_mail (envelope CLOB, link_mail VARCHAR2) RETURN CLOB IS vresult VARCHAR2 (512); verror VARCHAR2 (10); soapenvelope VARCHAR2 (32767); soapenvio VARCHAR2 (32767); soapcompleto CLOB; http_req UTL_HTTP.req; http_resp UTL_HTTP.resp; xmldoc XMLTYPE; xmlresp XMLTYPE; BEGIN soapenvelope := '<?xml version="1.0" encoding="utf-8"?> <SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> <SOAP-ENV:Header> <SOAP-ENV:Body> <mail:sendMail xmlns:mail="http://mail.example/"> <from>[email protected]</from> <to>[email protected]</to> <cc>[email protected]</cc> <bcc>[email protected]</bcc> <subject>Asunto del Mail</subject> <content>Este es un mail de prueba</content> <attachmentFileName>fichero_adjunto.txt</attachmentFileName> <attachMentContent></attachMentContent> </mail:sendMail> </SOAP-ENV:Body> </SOAP-ENV:Envelope>'; -- La conversión a UTF8 nos daba problemas, así que remplazamos los carácteres -- Evitamos el error "Invalid byte 2 of 2-byte UTF-8 sequence" soapenvelope := REPLACE(soapenvelope, 'Ñ', 'ñ'); soapenvelope := REPLACE(soapenvelope, 'á', 'á'); soapenvelope := REPLACE(soapenvelope, 'é', 'é'); soapenvelope := REPLACE(soapenvelope, 'í', 'í'); soapenvelope := REPLACE(soapenvelope, 'ó', 'ï'); UTL_HTTP.set_persistent_conn_support (TRUE); UTL_HTTP.set_transfer_timeout (180); BEGIN http_req := UTL_HTTP.begin_request (link_mail, 'POST', 'HTTP/1.1'); -- link_sw = http://enviarmail.com:7001/sendMail UTL_HTTP.set_header (http_req, 'Content-Type', 'text/xml'); UTL_HTTP.set_header (http_req, 'Content-Length', LENGTH (soapenvelope)); UTL_HTTP.set_header (http_req, 'SOAPAction', ''); UTL_HTTP.write_text (http_req, soapenvelope); http_resp := UTL_HTTP.get_response (http_req); soapcompleto := ''; LOOP UTL_HTTP.read_text (http_resp, soapenvio); soapcompleto := soapcompleto || soapenvio; END LOOP; UTL_HTTP.end_response (http_resp); EXCEPTION WHEN UTL_HTTP.end_of_body THEN UTL_HTTP.end_response (http_resp); END; RETURN (soapcompleto); END ; |
Partiendo de un fichero .dmp que contenga una copia o backup de una base de datos, o de la estructura de las tablas, podemos realizar una importación utilizando el comando IMP
El comando para importar datos en Oracle 9i…11g es imp.
Si queréis ver los detalles del comando o mostrar la ayuda, podéis hacerlo escribiendo por consola la siguiente sentencia:
imp help=yes |
Para hacer un import basta con introducir el comando acompañado del usuario/password, el fichero de log en el que queréis que se guarde la información referente al comando, y por último indicar dónde se encuentra el fichero .dmp que tiene almacenado la parte de la base de datos que quieres importar o restaurar.
IMP usuario13/pass LOG=fichero.log FILE=fichero.dmp |
Como muestra la siguiente imagen:
Leer másCon este Script en lenguaje Batch recuperamos los datos que se encuentran en el fichero archivo.sql (son INSERTS en la base de datos), y lo separamos en dos partes, cada parte en una línea diferente. Usamos el delimitador que se encuentra en el insert “;” para saltar de linea y escribir el texto restante en la siguiente linea. Al final de la lectura de todo el archivo.sql añadimos un “commit;”, que necesitabamos para completar los inserts.
El script creará el fichero formateado.sql que tendrá el formato que necesitamos para realizar nuestros inserts
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 | @echo off ::Elimina el archivo formateado.sql en caso de que exista del formateado.sql.txt CLS set /a contador=0 set /a porcentaje=0 set /a total=0 ::Primera cabecera ECHO Preparando archivo... ::Recorre el fichero SQL llamando a countSQL para cada linea ignorando la cabecera del archivo for /f "skip=1 tokens=1-2 delims=;" %%a in (archivo.sql) do call :countSQL "%%a" "%%b" ::Recorre el fichero SQL llamando a Formatear para cada linea ignorando la cabecera for /f "skip=1 tokens=1-2 delims=;" %%a in (archivo.sql) do call :Formatear "%%a" "%%b" ::Saltamos al final 'Done' e incluimos el commit que necesitamos GOTO Done ::Funcion que maqueta y guarda el insert :Formatear call:incrContador ECHO %~1)>>formateado.sql echo ;>>formateado.sql set /a porcentaje=(%contador%*100)/%total% cls ECHO Creando... %porcentaje%%% GOTO EOF ::Funcion que incrementa :incrContador set /a contador+=1 GOTO EOF ::Funcion que cuenta para % :countSQL set /a total=%total%+1 GOTO EOF ::Al terminar añade un commit :Done ECHO commit>>formateado.sql Echo ;>>formateado.sql PAUSE :EOF |
Adaptado de la Wikicode
Leer másPara crear un report con el wizard de Oracle Reports tenemos que seguir los siguientes pasos:
Creamos un nuevo report y le indicamos que queremos que se cree automáticamente, con el Wizard, en este caso vamos a seleccionar que cree sola la página web, de la que finalmente podemos ver el código HTML
Nos pedirá el nombre del Report que va a mostrar y el diseño de las columnas que queremos mostrar en el Report, aunque después nos dejará seleccionar un estilo que modificará el aspecto visual del report.
Seleccionamos SQL Query, para generar la consulta, e introducimos la consulta que queremos utilizar en el informe.
Seleccionamos las columnas y si queremos que salga el conteo de las columnas en el informe:
Finalmente le damos a terminar y podemos ver el código HTML que nos ha generado.
Al instalar la edición de Oracle 11g XE en un Windows 7 de 64 bits me ha mostrado una alerta con el siguiente error:
1 | The installer is unable to instantiate the file C:\Users\Miguel\AppData\Local\Temp\{078E83D7-3FCC-4A72-903B-995C7CE44681}\KEY_XE.reg. The file does not appear to exist. |
En la página de Oracle pone que esta edición no funciona en un equipo Windows con 64bits, no obstante como veremos más adelante, si corregimos este error funciona correctamente.
El error ocurre porque el instalador no es capaz de escribir en el registro de Windows la linea que muestra en el error.
Para solucionarlo, basta con ir al regedit y buscar la key o clave en la que tenemos que introducir el valor que nos muestra el error, en la siguiente imagen se ve más claro.
La ruta en el regedit es esta:
1 | HKEY_CLASSES_ROOT\Installer\Products\266B7A503A089BE4EAD1986A429434C1\SourceList\Media |
Incialmente la clave identificada con ’1′, tendrá el valor : DISK, que tenéis que cambiar por el valor que os indica el error, en mi caso es este:
1 | C:\Users\nombreDelEquipo\AppData\Local\Temp\{078E83D7-3FCC-4A72-903B-995C7CE44681}\ |
Vuestra cadena será muy parecida, solo tenéis que sustituir el nombre del equipo, que en mi caso es ‘miguel’ por el nombre que tenga vuestro equipo (lo encontráis en equipo-> botón derecho->propiedades…), nombre original para una máquina virtual :).
Y con esto funciona correctamente, y podéis correr la edición de Oracle 11g XE en un Windows 7 de 64 bits.
Leer másPara realizar esta práctica, vamos a desarrollar una pequeña aplicación para entornos LAMP que, dándole las tres primeras letras de un producto, devuelva todas las coincidencias de productos que existan en nuestra base de datos , debe devolverlos ordenados por el nombre, incluyendo todas las características y su situación en el mapa.
Tenemos dos tipos de productos, Cruceros (A) y Barcos (B), cada uno con sus características específicas. En el caso del producto A, además de su nombre, necesitamos conocer el número de estrellas y el tipo al que pertenecen (dejamos a tu elección proponer unos cuantos tipos pueden tener, …). En el caso del producto B y además de su nombre, queremos saber de cada producto el numero de pasajeors que pueden viajar y para cuantos adultos tienen espacio, sabiendo que solo existe un tipo de habitaciones.
Para conocer la ubicación de cualquier producto nos basta con indicar la ciudad y provincia.
Nos debe devolver, un listado del siguiente tipo:
.Crucero Mediterraneo, 4 estrellas, habitación doble con vistas, Barcelona, Barcelona
.Barco Vigo, 10 pasajeros, 4 adultos, Vigo, Vigo
.Crucero Italia, 3 estrellas, habitación doble, Mojacar, Almeria
.Crucero islas, 4 estrellas, habitación sencilla, Sanlucar, Cádiz
.Barco Andalucia Sol y playa, 50 pasajeros, 4 adultos, Almeria, Almeria
Esta práctica la realice como test de conocimientos PHP-MySql, seguramente encontréis mil formas de solucionarlo, con clases, utilizando la arquitectura modelo-vista-controlador, etc. En mi caso no me compliqué demasiado y aún así me llevo más de 2 o 3 horas.
La solución contiene el código PHP así como la creación de las tablas MySql que eran necesarias:
Fichero conexion.php
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | <?php // creamos la función que utilizaremos para conectarnos en la bd. // Si cambia la bd solo tendremos que cambiarlo en un sitio. // El archivo se llamara conexion.php que luego llamaremos desde el script que hará // la consulta en la bd. function Conectarse() { if (!($conectado=mysql_connect("host.com","user","password1"))) { echo "Error de conexion a la base de datos."; exit(); } if (!mysql_select_db("basededatos",$conectado)) { echo "Error al seleccionar la base de datos."; exit(); } return $conectado; } ?> |
Fichero consulta.php
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 | <?php include("conexion.php"); // Llamamos al fichero que tiene la función que nos permite conectarnos a la bd. // Realizamos la conexión $conectado=Conectarse(); // Recogemos el parámetro $consultaCiudad= $_REQUEST["consultaCiudad"]; if($conectado){ $sqlCiudad= "select * from ( select hos.nombre, h.estrellas || 'estrellas', h.tiphab, u.ciudad, u.provincia from crucero h, barco hos, ubicacion u where hos.idUbi = u.id and hos.id = h.idHos and (u.ciudad like '%$consultaCiudad%' or u.provincia like '%$consultaCiudad%') union select hos.nombre, a.disponibles || ' apartamentos', a.capacidad || ' adultos', u.ciudad, u.provincia from apartamento a, barco hos, ubicacion u where hos.idUbi = u.id and hos.id = a.idHos and (u.ciudad like '%$consultaCiudad%' or u.provincia like '%$consultaCiudad%') ) t order by nombre"; $resSqlCiudad = mysql_query($sqlCiudad) or mysql_error(); if (!$resSqlCiudad) { echo "Fallo la consulta: ".$resSqlCiudad; mysql_close($conectado); return 0; } else { echo "<ul>"; // creamos la lista while ($result_rowCiudad = mysql_fetch_row(($resSqlCiudad))) { echo "<li> ".$result_rowCiudad["0"].", ".$result_rowCiudad["1"].",".$result_rowCiudad["2"].",".$result_rowCiudad["3"].",".$result_rowCiudad["4"]." "; // mostramos cada resultado de la lista. } echo "</ul>"; // cerramos la lista } } else { die("Fallo en la conexión al servidor."); } ?> |
Fichero de creación de tablas MySql
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 | --Tabla ubicacion(id, ciudad, provincia) CREATE TABLE ubicacion (id INT PRIMARY KEY, ciudad VARCHAR(30), provincia VARCHAR(30)); --Tabla hospedaje(id, nombre, idUbi) --idUbi FK ubicacion.id CREATE TABLE hospedaje (id INT PRIMARY KEY, nombre VARCHAR(30), idUbi INT, FOREIGN KEY (idUbi) REFERENCES ubicacion (id)); --Tabla Crucerohotel(idHos, estrellas, tiphab) --idHos FK hospedaje.id CREATE TABLE cruecero (idHos INT, estrellas INT, tiphab VARCHAR(50), FOREIGN KEY (idHos) REFERENCES hospedaje (id)); --Tabla apartamento(idHos, disponibles, capacidad) --idHos FK hospedaje.id CREATE TABLE barco (idHos INT, disponibles INT, capacidad INT, FOREIGN KEY (idHos) REFERENCES hospedaje (id)); SELECT * FROM ( SELECT hos.nombre, h.estrellas || 'estrellas', h.tiphab, u.ciudad, u.provincia FROM crucero h, hospedaje hos, ubicacion u WHERE hos.idUbi = u.id AND hos.id = h.idHos AND (u.ciudad LIKE '%$consultaCiudad%' OR u.provincia LIKE '%$consultaCiudad%') UNION SELECT hos.nombre, a.disponibles || ' apartamentos', a.capacidad || ' adultos', u.ciudad, u.provincia FROM barco a, hospedaje hos, ubicacion u WHERE hos.idUbi = u.id AND hos.id = a.idHos AND (u.ciudad LIKE '%$consultaCiudad%' OR u.provincia LIKE '%$consultaCiudad%') ) t ORDER BY nombre |
Vamos a crear un nuevo usuario en Oracle.
Podemos crear directamente el usuario, pero es mejor empezar creando el tablespace para datos y para índices.
Aquí es donde se almacena los objetos que va a crear el usuario.
CREATE TABLESPACE "TABLAS4" LOGGING DATAFILE '/export/home/oracle/oradata/datafiles/tablas.dbf' SIZE 2000M REUSE EXTENT MANAGEMENT LOCAL SEGMENT SPACE MANAGEMENT AUTO ; CREATE TABLESPACE "INDICES4" LOGGING DATAFILE '/export/home/oracle/oradata/datafiles/indices.dbf' SIZE 1500M REUSE EXTENT MANAGEMENT LOCAL SEGMENT SPACE MANAGEMENT AUTO ; |
Ahora creamos el usuario:
CREATE TABLESPACE "NUEVOUSER" LOGGING DATAFILE '/export/home/oracle/oradata/datafiles/users01.dbf' SIZE 50M REUSE EXTENT MANAGEMENT LOCAL SEGMENT SPACE MANAGEMENT AUTO ; ALTER DATABASE DEFAULT TABLESPACE "USERS"; |
Ahora creamos el usuario y le decimos el tablespace que tiene por defecto y el que cogerá sino se lo indicamos:
CREATE USER "USU01" PROFILE "DEFAULT" IDENTIFIED BY "USU01PWD" DEFAULT TABLESPACE "TABLAS4" TEMPORARY TABLESPACE "TEMP" ACCOUNT UNLOCK; |
Lo mismo ocurre cuando creamos tablas e índices, tenemos que indicar el tablespace correspondiente para las tablas y los índices que hemos creado antes.
Y ahora le damos permisos:
GRANT CONNECT, RESOURCE TO USU01; |
Podemos darle permisos como administrador:
GRANT DBA TO USU01; |
O podemos darles privilegios sobre objetos que nosotros decidamos:
GRANT ALTER ANY INDEX TO USU01; GRANT CREATE ANY INDEX TO USU01; GRANT DROP ANY INDEX TO USU01; GRANT DROP ANY VIEW TO USU01; GRANT INSERT ANY TABLE TO USU01; GRANT SELECT ANY TABLE TO USU01; GRANT UNLIMITED TABLESPACE TO USU01; |
Y así sucesivamente. Podemos asignar permisos en ejecución de procesos, en directorios para el tratamiento de ficheros desde Oracle o paquetes Java, por ejemplo:
GRANT EXECUTE any PROCEDURE TO USU01; GRANT READ, WRITE ON directory dir_firmas TO USU01; EXEC dbms_java.grant_permission('USU01','java.io.FilePermission','/pruebas/-','read'); |
Cuando utilizamos Oracle Forms para crear aplicaciones nos encontramos con algunas limitaciones. No obstante, Oracle Forms nos permite incluir aplicaciones desarrolladas en Java (Bean) dentro del propio Forms.
En este caso queríamos incluir una imagen en Oracle Forms, y al ejecutarla desde Forms, Forms reduce tanto la resolución de la imagen como el número de colores.
Como no quedaba muy bien después de que Forms degradadase la imagen, hemos utilizado un Bean para llamar a la imagen original y así no Forms no tratará la imagen, dejando la imagen la calidad de la imagen original intacta.
La imagen de arriba muestra la imagen incluida en el Forms, mientras que la imagen de abajo sería el resultado de incluirla en un java Bean, así no perderá propiedades y se mostrará con la calidad original.
Este el código que he utilizado para incluir la imagen, solo tenéis que incluir vuestra imagen y cambiar los tamaños en el código.
Código
Clase Marco
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 | package mypackage; import java.beans.PropertyChangeEvent; import javax.swing.JFrame; import oracle.forms.ui.VBean; import oracle.forms.handler.IHandler; public class Marco extends VBean { //private JFrame framep = new JFrame(); private IHandler m_handler; Banner been; public Marco() { // framep.setVisible(true); } public void init(IHandler handler) { m_handler = handler; super.init(handler); been = new Banner(); this.add(been); this.setVisible(true); } public void propertyChange(PropertyChangeEvent evt) { // TODO Auto-generated method stub } } |
Clase Banner
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 | package mypackage; import javax.swing.ImageIcon; import javax.swing.JPanel; import java.awt.*; public class Banner extends JPanel { private Image imgFondo; public Banner(){ ImagenFondoPanel(); } public void ImagenFondoPanel() { preInit(); } private void preInit(){ imgFondo = new ImageIcon(getClass().getResource("imagen2.png")).getImage(); } protected void paintComponent(Graphics g) { g.drawImage(imgFondo,00,00,null); } } |
Si necesitas saber cómo incluir un Java Bean en tu aplicación sigue los siguientes pasos:
1- Copia el bean.jar dentro del directorio /forms/java
2- Edita el archivo formsweb.cfg y añadimos el bean.jar.
# Forms applet archive setting for JInitiator
archive_jini=f90all_jinit.jar, archivo.jar
# Forms applet archive setting for Microsoft Internet Explorer native
JVM archive_ie=f90all.cab, archivo.jar
3- Añadimos el Bean dentro de la pantalla (.fmb) y ponemos la ruta y el nombre del bean.jar
4- Dentro de la pantalla en tu editor de forms builder , navegamos hasta las propiedades del Bean, y en “Clases de implementación” añadimos: oracle/forms/archivo (sin la extensión).
Si quieres el código completo puedes descargártelo aquí
El password del zip es codigojavaoracle.com
Leer másDentro de la gestión documental y desarrollados en JAVA y totalmente aptos para correr sobre bases de datos Oracle existen distintos productos, entre ellos destaca Athento.
La digitalización y captura de documentos con su correspondiente automatización de tareas (clasificación de documentos, extracción de datos y enrutamiento de documentos) se está convirtiendo en la clave para mejorar procesos de negocio. En particular, existen 5 procesos organizacionales cuya mejora puede reportar enormes beneficios cuantificables y no cuantificables:
Gestión de Facturas: Según la IAPP (International Accounts Payable Professionals), la gestión manual de una factura cuesta alrededor de los $8 dólares a las empresas. No sólo porque este proceso es muy susceptible a la pérdida de información contable importante sino también porque es un proceso lento que requiere empleados administrativos dedicados a ello.
Gestión de Ordenes de Compra y de Ventas: Se ha demostrado que la gestión automática de estos procesos representa mejoras en la gestión de la liquidez de la empresa, permite detectar errores de manera más temprana en el proceso y reducir el tiempo del ciclo de gestión de este tipo de documentos.
Gestión de Contratos: Uno de los beneficios más importantes es evitar la pérdida de este tipo de documentos, dado sus implicaciones legales. Otro aspecto que hace atractiva la automatización de gestión de contratos es que según estudios en diversas empresas privadas y públicas, el volumen de contratos en las empresas es igual o ligeramente superior al volumen de facturas.
Gestión de Correspondencia de clientes y atención al cliente: Cartas, solicitudes, emails y otros mecanismos de comunicación del cliente con las empresas resulta crítico para la retención, gestión de reclamaciones y quejas u otros aspectos claves de las relaciones con clientes. La gestión de la correspondencia representa además beneficios producto de ahorros en costes y reducción del riesgo.
Gestión de documentos de Recursos Humanos: Los departamentos de personal son ricos en todo tipo de documentos. La gestión de estos documentos puede representar mejoras en los procesos de reclutamiento y contratación, gestión de salarios y vacaciones.
Athento, que como decimos, está desarrollado en JAVA y corre sobre distintas versiones de bases de datos ORACLE (así como otras tecnologías Oracle a nivel de servidor de aplicaciones, servidor web etc.) es una herramienta que elimina quebraderos de cabeza al personal técnico a la hora de instalar un ECM o gestor de contenido empresarial.
Leer más