Вы находитесь на странице: 1из 12

Trabajo Practico

De
Programacion en SQL

Tema: Advantage Database Server


Alumno:
Curso:
Prof.:
Año:
Introduccion

En este trabajo práctico vamos a


interiorizarnos mas en lo que es
el motor de base de datos
Advantage Database Server,
conoceremos mejor sus
funcionalidades, la forma de
crear triggers y procedimientos
almacenados y tambien los
beneficios de utilizar este
motor.
Advantage Database Server (ADS)

Advantage Database Server es un sistema de gestión de bases de datos relacionales, que


permite migrar de forma sencilla, aplicaciones Clipper y FOXPRO a cliente/servidor,
obteniendo un alto rendimiento. Advantage Database Server combina la potencia de las
sentencias SQL y sus métodos relacionales de acceso a datos con el excelente rendimiento y
control de los tradicionales comandos navegacionales. Advantage dispone de interfaces de
desarrollo nativas que permiten aprovechar sus conocimientos sobre las herramientas de
programación más populares. Gracias a su metodología optimizada de acceso a datos y a su
inigualable rendimiento, Advantage le ofrece seguridad, estabilidad e integridad de datos en un
entorno que prácticamente no requiere mantenimiento. Advantage se instala fácilmente en su
actual infraestructura de red, sin que existan requerimientos de configuración específicos.

Procedimientos Almacenados
Aunque se puede crear un diccionario de datos, asi como muchos de los restantes objetos, en
Advantage Server existen limites a lo que uno puede hacer. Por ejemplo, podemos crear un
diccionario de datos y una tabla en el diccionario de datos, pero no hay comandos en
Advantage SQL para agregar una tabla libre a un diccionario de datos.

La razon de esto se debe a las normas, En su mayor parte, Advantage SQL está diseñado para
ajustarse a la mayoria de los estandares del SQL/92 de ANSI. Ningun proveedor de base de
datos cumple al cien por ciento con este estandar, pero todos tratan de soportar la mayoria de
los estandares y Advantage no es diferente

El problema con la conformidad de las normas es que desalientan la personalización, como la


introducción de nuevas palabras clave base. Mientras CREATE, GRANT y INVOKE forman
parte de la especificación SQL / 92, no hay palabras claves base como ADD y REMOVE.
Con el fin de mantener una estrecha conformidad con ANSI SQL / 92 y ser capaz de manejar
las muchas tareas de mantenimiento de diccionario de datos necesarias a través de SQL,
Advantage optó por implementar estas tareas mediante el uso de procedimientos almacenados
incorporados en ADS y ALS. En la versión 7.0 de ADS, hay 17 procedimientos almacenados
del sistema relacionados con los diccionarios de datos. Los nombres de estos procedimientos
almacenados se enumeran en la Tabla 11-11.

Tabla 11-11: Procedimientos Almacenados soportados

sp_AddIndexFileToDatabase sp_AddTableToDatabase
sp_AddUserToGroup sp_CreateGroup
sp_CreateLink sp_CreateReferentialIntegrity
sp_CreateUser sp_DropGroup
sp_DropLink sp_DropReferentialIntegrity
sp_DropUser sp_ModifyDatabase
sp_ModifyFieldProperty sp_ModifyGroupProperty
sp_ModifyTableProperty sp_ModifyUserProperty
sp_RemoveUserFromGroup
Un procedimiento almacenado es un bloque de código, ya sea una secuencia de comandos
SQL o una biblioteca compilada, que se ejecuta en el servidor a través de llamadas explícitas
utilizando instrucciones 'EXECUTE PROCEDURE'.

¿Porque utilizar un procedimiento almacenado?


 Rendimiento – Todo el procesamiento se realiza en el servidor, sin tráfico de red.

 Productividad – El desarrollo de nuevas interfaces o clientes para su aplicación no


requerirá la reescritura de código si su código común está contenido dentro de los
procedimientos almacenados.

 Escalabilidad – Aislar el procesamiento de aplicaciones en el servidor significa que


puede escribir aplicaciones cliente desde cualquier interfaz que admita la ejecución de
sentencias SQL y no está limitado por las capas de acceso a datos de diferentes
entornos de desarrollo.

 Mantenimiento – La lógica de aplicación está aislada en un área, facilitando las


modificaciones.

Contenedores de procedimientos almacenados


Los procedimientos almacenados se pueden escribir como secuencias de comandos SQL, DLL
de WIN32, objetos COM, objetos compartidos de Linux o ensamblados .NET.

Los scripts SQL son el tipo de contenedor recomendado. Los procedimientos almacenados
escritos como otras bibliotecas se denominan Procedimientos ampliados Advantage (AEP).
Podemos encontrar mas informacion sobre estos en el tema de Procedimientos extendidos de
Advantage.

Creando un procedimiento almacenado


Los procedimientos almacenados se pueden crear mediante la sentencia CREATE
PROCEDURE o visualmente utilizando Advantage Data Architect (que es el método
recomendado). Se requiere un diccionario de datos para usar los procedimientos almacenados.
Al crear un nuevo procedimiento almacenado, se define los parámetros de entrada y salida que
el procedimiento aceptará. Estos parámetros pueden ser cualquier tipo de datos soportado por
el formato de tabla ADT.
Los parámetros de entrada y salida se pasan al procedimiento almacenado mediante
referencias de tabla virtual con una columna por parámetro. Por ejemplo, si define un nuevo
procedimiento almacenado con dos parámetros de entrada, X e Y, entonces dentro de su
procedimiento puede acceder a estos valores haciendo referencia a la X cualquier columna Y
en una tabla virtual llamada __input:
DECLARE localX Integer, localY Integer;
DECLARE input AS SELECT * FROM __input;
localX = input.X;
localY = input.Y;

De forma similar, los parámetros de salida se pueden devolver configurando sus valores en una
tabla virtual llamada __output:
INSERT INTO __output VALUES ( ‘output param one’, ‘output param two’ );

La tabla virtual __output no se limita a una fila. Su procedimiento puede devolver varias filas,
devolviendo efectivamente un conjunto de datos de varias filas al llamante, que el llamante
puede manipular como cualquier otro conjunto de resultados. Debe tenerse en cuenta que este
conjunto de resultados se devuelve como un cursor estático.
La estructura de columnas de las tablas __input y __output refleja directamente los nombres de
los parámetros y los tipos de datos que se especifican al crear el procedimiento en el
diccionario de datos.

Llamando a un procedimiento almacenado

Los procedimientos almacenados se llaman ejecutando sentencias EXECUTE PROCEDURE a


través de cualquier interfaz SQL. Por ejemplo, la siguiente consulta establece la contraseña de
la cuenta administrativa del diccionario de datos en la contraseña:

EXECUTE PROCEDURE sp_ModifyDatabase('ADMIN_PASSWORD', 'password')

Si un procedimiento almacenado incluye un parámetro de entrada, pero proporcionar un valor


para ese parámetro es opcional, simplemente puede pasar el valor NULL. Esto se demuestra
en la siguiente invocación de procedimiento almacenado, que crea un nuevo grupo pero no
establece la descripción del grupo:

EXECUTE PROCEDURE sp_CreateGroup('accounting', NULL)

Por ejemplo, para llamar a un procedimiento con dos parámetros enteros, se debería utilizar la
siguiente sentencia:
EXECUTE PROCEDURE MyProcedureName( 6, 9 )

El mismo procedimiento podría ser llamado usando parámetros nombrados:


EXECUTE PROCEDURE MyProcedureName( :param1, :param2 )

Privilegios de los procedimientos almacenados


Los privilegios del usuario no se comprueban durante la ejecución del procedimiento
almacenado. Esta funcionalidad, entre otras cosas, permite ocultar tablas a los usuarios, pero
permite el acceso y las modificaciones a esas tablas sólo a través de los procedimientos
almacenados que controla.

Procedimientos almacenados y transacciones


Todas las operaciones realizadas dentro de un procedimiento almacenado se incluyen en el
contexto de transacciones existentes. Si devuelve una transacción después de llamar a un
procedimiento almacenado, todas las operaciones de datos realizadas por ese procedimiento
almacenado también se revertirán.
Triggers

¿Que es un Trigger?
Un trigger es una parte de código (similar a un procedimiento almacenado) que se ejecuta en el
servidor. Los triggers se diferencian de los procedimientos almacenados porque los triggers no
son llamados por el cliente, sino que se ejecutan automáticamente en respuesta a una
operación de inserción, actualización o eliminación.
Los triggers son compatibles con operaciones de SQL y operaciones de actualización de
navegación. A lo largo de esta documentación, las operaciones de actualización se
especificarán mediante anotaciones en mayúsculas (por ejemplo, INSERT), pero esto no
implica una limitación de SQL solamente.
Cuando un trigger es "ejecutado" contiene alguna información de estado, la cual se puede usar
dentro del cuerpo del trigger. Dos tablas en la memoria están disponibles dentro de un trigger;
Un new table y un old table. El new __table contiene nuevos valores de campo que estaban o
están a punto de ser insertados en la tabla. El old __table contiene valores de campo antiguos
para el registro en cuestión.
Los triggers pueden proporcionar un medio muy poderoso para mantener las reglas de
negocio dentro de una base de datos.
Los triggers se pueden definir para cualquier tipo de tabla soportado, y no se limitan al formato
ADT propietario.
Tanto el Servidor de base de datos Advantage como el Servidor local de Advantage soportan
triggers. Las transacciones implícitas son la única funcionalidad de activación que varía según
el tipo de servidor.

[ALTER | CREATE] TRIGGER


Sintaxis
[ALTER | CREATE] TRIGGER <trigger-name> ON <table-name> <trigger-type>
<trigger-event> <trigger-container> [trigger-options]

trigger-type ::= BEFORE | INSTEAD OF | AFTER | CONFLICT [ON]

trigger-event ::= INSERT | UPDATE | DELETE

trigger-container <library-container> | <script-container>


::=

library-container ::= FUNCTION <function-name> IN <library-type> <library-name>

function-name ::= Nombre de la funcion definido por el usuario.

library-type ::= LIBRARY | ASSEMBLY

library-name ::= Un Nombre de biblioteca definido por el usuario. Si el library-tipe es LIBRARY,


este es el nombre del objeto compartido de Windows DLL o Linux que
contiene la funcion del trigger. Si el library-tipe es ASSEMBLY, este es el
nombre del COM ProgID o del ensamblado .NET que contiene la funcion del
trigger. Si el nombre del archivo contiene alguna caracter especial, el nombre
debe estar entre comillas dobles o entre corchetes

script-container ::= BEGIN <sentencia> ; [, <sentencia> ; ] END

statement ::= Cual sentencia SQL que sea valida.


trigger-options ::= NO VALUES | NO MEMOS | NO TRANSACTION | PRIORITY <trigger-
priority>

trigger-priority ::= Un valor entero definido por el usuario, especificando la prioridad de


activacion de los triggers.

Observaciones

CREATE TRIGGER y ALTER TRIGGER sólo pueden ser llamados por un usuario con
permisos ALTER en la tabla asociada. La sentencia CREATE TRIGGER crea un nuevo trigger
para la tabla. La instrucción ALTER TRIGGER modifica la definición de un trigger existente. La
creación o modificación de un trigger no comprueba la existencia de la biblioteca o de la
asamblea .NET. Si se define un trigger en una biblioteca o ensamblado que no existe, se
producirá un error en tiempo de ejecución cuando se ejecuta el trigger. Las declaraciones
dentro de los triggers se validan sólo para corrección sintáctica. Si existen errores semánticos,
se producirá un error en tiempo de ejecución cuando se ejecuta el desencadenador. Si se está
utilizando un contenedor de activación y se realizan modificaciones en la definición de un
trigger (incluida la adición o eliminación de triggers), los cambios no tendrán efecto hasta que
todos los usuarios que hayan utilizado un trigger en dicho contenedor se desconecten de la
base de datos. Actualmente, la creación y eliminación de triggers no afectará a las tablas ya
abiertas por el servidor. Por ejemplo, si table1 es abierto por clientes activos y el administrador
agrega un nuevo trigger a table1, el trigger no se activará hasta que todos los usuarios activos
hayan cerrado table1 y se haya vuelto a abrir.

Ejemplos

CREATE TRIGGER mytrigger ON orders AFTER DELETE


BEGIN
INSERT INTO backup_orders SELECT * FROM __old;
END

CREATE TRIGGER mytrigger ON orders INSTEAD OF UPDATE


FUNCTION MyFunction IN ASSEMBLY [MyAssembly.MyClass] PRIORITY 68

CREATE TRIGGER mytrigger ON orders AFTER INSERT


FUNCTION MyFunction IN LIBRARY [mytriggers.dll]

CREATE TRIGGER mytrigger ON orders BEFORE INSERT


FUNCTION MyFunction IN ASSEMBLY [MyAssembly.MyClass]
NO VALUES PRIORITY 23

CREATE TRIGGER mytrigger ON orders AFTER DELETE


BEGIN
INSERT INTO backup_orders SELECT * FROM __old;
END
NO MEMOS PRIORITY 1
ALTER TRIGGER mytrigger ON orders AFTER DELETE
BEGIN
INSERT INTO log_orders_delete SELECT * FROM __old;
END
PRIORITY 2

Funciones
¿Que es una funcion?
Las funciones definidas por el usuario (UDF) permiten a un desarrollador crear funciones
reutilizables que se pueden utilizar en una sentencia SQL o un script SQL, al igual que las
funciones escalares existentes del sistema. Al encapsular operaciones frecuentemente
realizadas o complejas en funciones definidas por el usuario, las sentencias o scripts de SQL
se vuelven más fáciles de escribir, comprender y depurar. En cierto sentido, las UDFs permiten
ampliar la funcionalidad del motor SQL.

Los UDF también facilitan que los desarrolladores alteren el comportamiento de su aplicación
sin recompilarlos. Por ejemplo, diferentes países en el mundo tienen diferentes formatos para
mostrar datos monetarios. En lugar de crear versiones separadas de sentencias SQL para
cada país, el desarrollador puede tener una versión de la sentencia SQL que utiliza UDF para
realizar la transformación de los datos monetarios en formato de caracteres. Haciendo que el
UDF devuelva diferentes cadenas de caracteres basadas en una variable de entorno o
implementando diferentes implementaciones de la misma UDF en diferentes países, la
aplicación puede presentar los datos monetarios en el formato correcto.

Advantage Database Server admite el concepto de Function Packages para proporcionar


espacios de nombres independientes para las funciones. Esto permite a los desarrolladores
desplegar UDFs en una base de datos existente sin preocuparse por los conflictos de nombres.

CREATE FUNCTION
Crea una nueva función en la base de datos.

Sintaxis
CREATE FUNCTION package_name.]function_name( [parameter, …] )
RETURNS data-type
[DESCRIPTION function_description]
BEGIN sql-script END

package_name ::= identificador

function_name ::= identificador

parameter ::= identificador de tipo de dato

function_description ::= string-literal

sql-script ::= declare_statements;statement_block | statement_block

Observaciones
La instrucción CREATE FUNCTION se puede utilizar para crear una función definida por el
usuario (UDF) en la base de datos. La función se almacena completamente dentro del archivo
de diccionario de datos de Advantage.

El usuario conectado debe tener el permiso CREATE FUNCTION para crear una función
El opcional package_name se puede usar para colocar la función en el paquete o grupo de
funciones especificado. Los paquetes proporcionan espacios de nombres independientes para
las funciones, permitiendo que las funciones con nombre idéntico existan en paquetes
diferentes. Para crear la función en el paquete especificado, el paquete debe existir en la base
de datos (vea CREATE PACKAGE) y el usuario conectado debe tener el permiso ALTER sobre
el paquete. Las funciones de un paquete no tienen permisos individuales. El permiso de un
usuario sobre las funciones del paquete se deriva del permiso del usuario en el paquete.

Los parámetros pueden ser cualquier tipo de datos que se admita en una secuencia de
comandos SQL (véase DECLARE), excepto el tipo de cursor.

La cláusula RETURNS se utiliza para especificar el tipo de datos devueltos.

La cláusula opcional DESCRIPCIÓN se puede utilizar para almacenar comentarios adicionales


sobre la función en el diccionario de datos.

En el script sql, la instrucción RETURN puede usarse para devolver el resultado al llamador.

Un UDF, una vez definido, puede ser utilizado en el motor SQL como cualquier otra función
escalar nativa soportada por el motor Advantage SQL. La única diferencia en el uso entre un
UDF y una función nativa es que el usuario debe tener el permiso de ejecución en el UDF para
evaluarlo.

Ejemplos
1. Una función simple que devuelve un nombre completo concatenado.
CREATE FUNCTION FullName( lastname char(15), firstname char(15))
RETURNS char(31)
DESCRIPTION 'This function constructs comma separated name with blanks
trimmed'
BEGIN
RETURN Trim(lastname)+','+Trim(firstname);
END;

Ejemplo de uso de la funcion:


SELECT FullName( lastname, firstname ) FROM customers

2. Creando funciones en un paquete


CREATE PACKAGE Local
DESCRIPTION 'Functions returning locally formatted string.';

// pad the string with zero or truncate it so it's length is


// equal to the specified length
CREATE FUNCTION local.ZeroPadI2Str( i Integer, len integer )
RETURNS String
BEGIN
DECLARE curr_len Integer;
DECLARE str String;

Str = Trim( Convert( i, SQL_CHAR ));


curr_len = length( str );

if curr_len < len then


return repeat( '0', len - curr_len ) + str;
elseif curr_len > len then
return left( str, len );
end;

return str;
end;
// This function returns a date in a string format that is
// traditionally used in the United State
CREATE FUNCTION Local.strDate( dDate Date )
RETURNS Char( 10 )
BEGIN
RETURN Local.ZeroPadI2Str( Month( dDate ), 2 ) + '/' +
Local.ZeroPadI2Str( DayOfMonth( dDate ), 2 ) + '/' +
Local.ZeroPadI2Str( Year( dDate ), 4 );
END

Ejemplo de uso de la funcion:


SELECT Local.StrDate( CURDATE() ) FROM system.iota

ALTER FUNCTION
Modifica el nombre o la definición de una función. Se mantienen los permisos existentes en la
función.

Sintaxis
ALTER FUNCTION [package_name.]function_name [new_function_name]
( [parameter, …] )
[RETURNS data-type | NULL]
[DESCRIPTION string]
BEGIN sql-script END

package_name ::= identifier

function_name ::= identifier

new_function_name ::= function_name | package_name.function_name

parameter ::= identifier data-type

sql-script ::= declare_statements;statement_block | statement_block

Observaciones
La instrucción ALTER FUNCTION tiene la sintaxis idéntica como la sentencia CREATE
FUNCTION, excepto la primera palabra y el nuevo nombre de función opcional.

Permite modificar la función sin tener que volver a conceder los permisos a los usuarios. Si la
función se cierra y se vuelve a crear, los permisos se deben volver a conceder al usuario que
tenía permiso en la función.

El nuevo nombre de función opcional se puede utilizar para cambiar el nombre de la función.
Se puede especificar un package_name como parte del nuevo function_name, pero debe
coincidir con el nombre del paquete existente. ALTER FUNCTION no se puede utilizar para
cambiar la propiedad del paquete de la función.

Para modificar una función que no pertenece a ningún paquete, el usuario debe tener el
permiso ALTER sobre la función. Para alterar una función que es propiedad de un paquete, el
usuario debe tener el permiso ALTER sobre el paquete.
Ejemplos

1. ALTER FUNCTION sin cambiar el nombre de la funcion


ALTER FUNCTION FullName( lastname char(15), firstname char(15))
RETURNS char(31)
DESCRIPTION 'This function constructs a conventional name with blanks
trimmed'
BEGIN
RETURN Trim(firstname) + ' ' + Trim(lastname);
END;

2. Cambiando el nombre de la funcion


// Correct the spelling of the function name
ALTER FUNCTION local.squar square( i Integer )
RETURNS integer
BEGIN
return i * i;
end;
Bibliografia
Extended Systems GmbH. (2004). Advantage Database Server.
28 de Abril del 2017, de Extended Systems GmbH Sitio web:
http://www.abox.com/PDFM/ADS_Kat_0704_Sp_2.pdf

Cary Jensen, Ph.D.Loy Anderson, Ph.D. (2007). Advantage


Database Server: A Developer's Guide. 04 de mayo del 2017,
de AuthorHouse Sitio web:
http://www.authorhouse.co.uk/Bookstore/BookDetail.aspx?Book
Id=SKU-000221142

Вам также может понравиться