Академический Документы
Профессиональный Документы
Культура Документы
De
Programacion en SQL
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
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'.
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.
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.
Por ejemplo, para llamar a un procedimiento con dos parámetros enteros, se debería utilizar la
siguiente sentencia:
EXECUTE PROCEDURE MyProcedureName( 6, 9 )
¿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.
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
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.
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
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.
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;
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
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
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