De Wikipedia, la enciclopedia libre
Saltar a navegación Saltar a búsqueda

PL / SQL ( lenguaje de procedimiento para SQL) es la extensión de procedimiento de Oracle Corporation para SQL y la base de datos relacional de Oracle . PL / SQL está disponible en Oracle Database (desde la versión 6: procedimientos / funciones / paquetes / activadores de PL / SQL almacenados desde la versión 7), base de datos en memoria Times Ten (desde la versión 11.2.1) e IBM DB 2 (desde la versión 9,7). [1] Oracle Corporation generalmente extiende la funcionalidad PL / SQL con cada lanzamiento sucesivo de Oracle Database.

PL / SQL incluye elementos de lenguaje procedimental como condiciones y bucles . Permite la declaración de constantes y variables , procedimientos y funciones, tipos y variables de esos tipos y disparadores. Puede manejar excepciones (errores en tiempo de ejecución). Se admiten matrices que implican el uso de colecciones PL / SQL. Las implementaciones desde la versión 8 de Oracle Database en adelante han incluido características asociadas con la orientación a objetos . Se pueden crear unidades PL / SQL como procedimientos, funciones, paquetes, tipos y disparadores, que se almacenan en la base de datos para que las aplicaciones que utilizan cualquiera de las interfaces programáticas de la base de datos Oracle las reutilicen.

Históricamente, la primera versión pública de la definición de PL / SQL [2] fue en 1995, y el año de inicio de Oracle ~ 1992. Implementa el estándar ISO SQL / PSM . [3]

Unidad de programa PL / SQL [ editar ]

La característica principal de SQL (no procedimental) también es un inconveniente de SQL: no se pueden usar declaraciones de control ( toma de decisiones o control iterativo ) si solo se va a usar SQL. PL / SQL es básicamente un lenguaje de procedimientos, que proporciona la funcionalidad de toma de decisiones, iteración y muchas más características como otros lenguajes de programación de procedimientos. Unidad de programa A PL / SQL es una de las siguientes: bloque PL / SQL anónimo, procedimiento , función , paquete de especificación, cuerpo del paquete, disparador, especificación de tipo, tipo de cuerpo, biblioteca. Las unidades del programa son el código fuente PL / SQL que se compila, desarrolla y finalmente se ejecuta en la base de datos. [4]

Bloque anónimo PL / SQL [ editar ]

La unidad básica de un programa fuente PL / SQL es el bloque, que agrupa declaraciones y declaraciones relacionadas. Un bloque PL / SQL se define mediante las palabras clave DECLARE, BEGIN, EXCEPTION y END. Estas palabras clave dividen el bloque en una parte declarativa, una parte ejecutable y una parte de manejo de excepciones. La sección de declaración es opcional y puede usarse para definir e inicializar constantes y variables. Si una variable no se inicializa, entonces toma el valor NULL de forma predeterminada . La parte opcional de manejo de excepciones se usa para manejar errores en tiempo de ejecución. Solo se requiere la parte ejecutable. Un bloque puede tener una etiqueta. [5]

Por ejemplo:

<<etiqueta>>  - esto es opcional DECLARAR - esta sección es opcional  número1  NÚMERO ( 2 );  number2  number1 % TIPO  : =  17 ;  - valor predeterminado  text1  VARCHAR2 ( 12 )  : =  'Hola mundo' ;  texto2  FECHA  : =  SYSDATE ;  - fecha y hora actuales BEGIN - esta sección es obligatoria, debe contener al menos una declaración ejecutable  SELECT  street_number  INTO  number1  FROM  address  WHERE  name  = 'INU' ; EXCEPCIÓN : esta sección es opcional  CUANDO  OTROS  ENTONCES  DBMS_OUTPUT . PUT_LINE ( 'El código de error es'  ||  TO_CHAR ( sqlcode ));  DBMS_OUTPUT . PUT_LINE ( 'El mensaje de error es'  ||  sqlerrm ); FIN ;

El símbolo :=funciona como un operador de asignación para almacenar un valor en una variable.

Los bloques se pueden anidar, es decir, debido a que un bloque es una instrucción ejecutable, puede aparecer en otro bloque siempre que se permita una instrucción ejecutable. Un bloque se puede enviar a una herramienta interactiva (como SQL * Plus) o incrustarse dentro de un precompilador de Oracle o un programa OCI . La herramienta o programa interactivo ejecuta el bloque una vez. El bloque no se almacena en la base de datos, por lo que se denomina bloque anónimo (aunque tenga etiqueta).

Función [ editar ]

El propósito de una función PL / SQL se usa generalmente para calcular y devolver un solo valor. Este valor devuelto puede ser un único valor escalar (como un número, una fecha o una cadena de caracteres) o una sola colección (como una tabla o matriz anidada). Las funciones definidas por el usuario complementan las funciones integradas proporcionadas por Oracle Corporation. [6]

La función PL / SQL tiene la forma:

CREAR  O  SUSTITUIR  FUNCIÓN  < function_name >  [( entrada / salida  variables  declaraciones )]  RETURN  return_type [ AUTHID  < CURRENT_USER  |  DEFINER > ]  < ES | AS >  - número de importe de la  parte del título ; - bloque de declaración BEGIN - parte ejecutable < bloque PL / SQL con declaración de retorno > RETURN <        return_value > ; [ Excepción ninguna ]  RETURN  < return_value > ; FIN ;

Las funciones de tabla alineadas en tubería devuelven colecciones [7] y toman la forma:

CREAR  O  SUSTITUIR  FUNCIÓN  < function_name >  [( entrada / salida  variables  declaraciones )]  RETURN  return_type [ AUTHID  < CURRENT_USER  |  DEFINER > ]  [ < AGREGAR  |  CONDUCTOS > ]  < ES | USING > [ bloque de declaración  ] BEGIN < bloque PL / SQL con declaración de retorno >     PIPE  ROW  < tipo de retorno  > ; REGRESO ; [ Excepción excepción bloque ] TUBO ROW < retorno tipo > ; REGRESO ; FIN ;       

Una función solo debe utilizar el tipo de parámetro IN predeterminado. El único valor de salida de la función debería ser el valor que devuelve.

Procedimiento [ editar ]

Los procedimientos se asemejan a las funciones en que se denominan unidades de programa que pueden invocarse repetidamente. La principal diferencia es que las funciones se pueden usar en una declaración SQL, mientras que los procedimientos no . Otra diferencia es que el procedimiento puede devolver varios valores, mientras que una función solo debería devolver un único valor. [8]

El procedimiento comienza con una parte de encabezado obligatoria para contener el nombre del procedimiento y, opcionalmente, la lista de parámetros del procedimiento. Luego vienen las partes declarativas, ejecutables y de manejo de excepciones, como en el bloque anónimo PL / SQL. Un procedimiento simple podría verse así:

CREATE  PROCEDURE  create_email_address  (  - La parte del encabezado del procedimiento comienza  name1  VARCHAR2 ,  name2  VARCHAR2 ,  company  VARCHAR2 ,  email  OUT  VARCHAR2 )  - La parte del encabezado del procedimiento termina AS - La parte declarativa comienza (opcional) error_message  VARCHAR2 ( 30 )  : =  'La dirección de correo electrónico también es largo.' ; BEGIN  - Comienza la parte ejecutable (obligatorio)  email  : =  name1  ||  '.'  ||  nombre2  || '@'  ||  empresa ; EXCEPCIÓN  - La parte de manejo de excepciones comienza (opcional) WHEN  VALUE_ERROR  THEN  DBMS_OUTPUT . PUT_LINE ( mensaje_error ); END  create_email_address ;

El ejemplo anterior muestra un procedimiento independiente: este tipo de procedimiento se crea y almacena en un esquema de base de datos utilizando la instrucción CREATE PROCEDURE. También se puede crear un procedimiento en un paquete PL / SQL; esto se denomina Procedimiento de paquete. Un procedimiento creado en un bloque anónimo PL / SQL se denomina procedimiento anidado. Los procedimientos independientes o en paquete, almacenados en la base de datos, se denominan " procedimientos almacenados ".

Los procedimientos pueden tener tres tipos de parámetros: IN, OUT e IN OUT.

  1. Un parámetro IN se utiliza solo como entrada. Un parámetro IN se pasa por referencia, aunque el programa inactivo puede modificarlo.
  2. Un parámetro OUT es inicialmente NULL. El programa asigna el valor del parámetro y ese valor se devuelve al programa que realiza la llamada.
  3. Un parámetro IN OUT puede tener o no un valor inicial. Ese valor inicial puede o no ser modificado por el programa llamado. Cualquier cambio realizado en el parámetro se devuelve al programa de llamada de forma predeterminada mediante la copia, pero, con la sugerencia NO-COPY, se puede pasar por referencia .

PL / SQL también admite procedimientos externos a través del ext-procproceso estándar de la base de datos de Oracle . [9]

Paquete [ editar ]

Los paquetes son grupos de funciones, procedimientos, variables, tablas PL / SQL y declaraciones de TIPO de registro, constantes, cursores, etc. vinculados conceptualmente. El uso de paquetes promueve la reutilización del código. Los paquetes se componen de la especificación del paquete y un cuerpo de paquete opcional. La especificación es la interfaz de la aplicación; declara los tipos, variables, constantes, excepciones, cursores y subprogramas disponibles. El cuerpo define completamente los cursores y subprogramas y, por lo tanto, implementa la especificación. Dos ventajas de los paquetes son: [10]

  1. Enfoque modular, encapsulación / ocultación de la lógica empresarial, seguridad, mejora del rendimiento, reutilización. Apoyan la programación orientada a objetos características como la sobrecarga de funciones y la encapsulación.
  2. Usando variables de paquete, uno puede declarar variables de nivel de sesión (con alcance) ya que las variables declaradas en la especificación del paquete tienen un alcance de sesión.

Activador [ editar ]

Un disparador de base de datos es como un procedimiento almacenado que Oracle Database invoca automáticamente cada vez que ocurre un evento específico. Es una unidad PL / SQL con nombre que se almacena en la base de datos y se puede invocar repetidamente. A diferencia de un procedimiento almacenado, puede habilitar y deshabilitar un desencadenador, pero no puede invocarlo explícitamente. Mientras un desencadenante está habilitado, la base de datos lo invoca automáticamente, es decir, el desencadenador se activa siempre que se produce su evento desencadenante. Mientras un disparador está desactivado, no dispara.

Creas un disparador con la sentencia CREATE TRIGGER. Usted especifica el evento desencadenante en términos de declaraciones desencadenantes y el elemento sobre el que actúan. Se dice que el disparador se crea o se define en el elemento, que es una tabla, una vista , un esquema o la base de datos. También especifica el punto de tiempo, que determina si el disparador se activa antes o después de que se ejecute la declaración de activación y si se activa para cada fila a la que afecta la declaración de activación.

Si el desencadenante se crea en una tabla o vista, el evento desencadenante se compone de declaraciones DML y el desencadenador se denomina desencadenador DML. Si el desencadenador se crea en un esquema o en la base de datos, el evento desencadenante se compone de declaraciones de operación de base de datos o DDL, y el desencadenador se denomina desencadenador del sistema.

Un disparador INSTEAD OF es: un disparador DML creado en una vista o un disparador del sistema definido en una instrucción CREATE. La base de datos dispara el desencadenador INSTEAD OF en lugar de ejecutar la declaración desencadenante.

Propósito de los desencadenantes [ editar ]

Los disparadores se pueden escribir para los siguientes propósitos:

  • Generando algunos valores de columna derivados automáticamente
  • Hacer cumplir la integridad referencial
  • Registro de eventos y almacenamiento de información sobre el acceso a la mesa
  • Revisión de cuentas
  • Replicación síncrona de tablas
  • Imponer autorizaciones de seguridad
  • Previniendo transacciones inválidas

Tipos de datos [ editar ]

Los principales tipos de datos en PL / SQL incluyen NUMBER, CHAR, VARCHAR2, DATE y TIMESTAMP.

Variables numéricas [ editar ]

 número de nombre de variable ([ P ,  S ])  : =  0 ;

Para definir una variable numérica, el programador agrega el tipo de variable NÚMERO a la definición del nombre. Para especificar la precisión (opcional) (P) y la escala (opcional) (S), se pueden agregar más entre paréntesis, separados por una coma. ("Precisión" en este contexto se refiere a la cantidad de dígitos que puede contener la variable y "escala" se refiere a la cantidad de dígitos que pueden seguir al punto decimal).

Una selección de otros tipos de datos para variables numéricas incluiría: binary_float, binary_double, dec, decimal, double precision, float, integer, int, numeric, real, small-int, binary_integer.

Variables de carácter [ editar ]

variable_name  varchar2 ( 20 )  : =  'texto' ;- por ejemplo: dirección  varchar2 ( 20 )  : =  'camino con vista al lago' ;

Para definir una variable de carácter, el programador normalmente agrega el tipo de variable VARCHAR2 a la definición del nombre. A continuación, entre paréntesis, el número máximo de caracteres que puede almacenar la variable.

Otros tipos de datos para variables de caracteres incluyen: varchar, char, long, raw, long raw, nchar, nchar2, clob, blob y bfile.

Variables de fecha [ editar ]

variable_name  fecha  : =  to_date ( '01-01-2005 14:20:23 ' ,  ' DD-MM-AAAA hh24: mi: ss ' );

Las variables de fecha pueden contener fecha y hora. El tiempo puede quedar fuera, pero no hay forma de definir una variable que solo contenga el tiempo. No hay ningún tipo DATETIME. Y hay un tipo TIME. Pero no hay ningún tipo TIMESTAMP que pueda contener una marca de tiempo detallada de hasta milisegundos o nanosegundos. Tipos de datos de Oracle

La TO_DATEfunción se puede utilizar para convertir cadenas en valores de fecha. La función convierte la primera cadena entre comillas en una fecha, utilizando como definición la segunda cadena entre comillas, por ejemplo:

 to_date ( '31-12-2004 ' ,  ' dd-mm-aaaa ' )

o

 to_date  ( '31 -dic-2004 ' ,  ' dd-mon-aaaa ' ,  ' NLS_DATE_LANGUAGE = Americano ' )

Para convertir las fechas en cadenas, se usa la función TO_CHAR (date_string, format_string).

PL / SQL también admite el uso de literales de intervalo y fecha ANSI. [11] La siguiente cláusula da un rango de 18 meses:

DONDE fecha  Campo  ENTRE  FECHA  '2004-12-30'  -  INTERVALO  '1-6'  AÑO  A  MES  Y  FECHA  '2004-12-30'

Excepciones [ editar ]

Las excepciones (errores durante la ejecución del código) son de dos tipos: definidas por el usuario y predefinidas.

Las excepciones definidas por el usuario siempre son planteadas explícitamente por los programadores, utilizando los comandos RAISEo RAISE_APPLICATION_ERROR, en cualquier situación en la que determinen que es imposible que continúe la ejecución normal. El RAISEcomando tiene la sintaxis:

RAISE  < nombre de excepción  > ;

Oracle Corporation ha predefinido varias excepciones como NO_DATA_FOUND, TOO_MANY_ROWS, etc. Cada excepción tiene un mensaje de número de error SQL y error SQL asociado con él. Los programadores pueden acceder a estos mediante las funciones SQLCODEy SQLERRM.

Tipos de datos para columnas específicas [ editar ]

Variable_name Table_name . Column_name % type;

Esta sintaxis define una variable del tipo de la columna referenciada en las tablas referenciadas.

Los programadores especifican tipos de datos definidos por el usuario con la sintaxis:

tipo  tipo_datos  es  registro  ( campo_1  tipo_1  : =  xyz ,  campo_2  tipo_2  : =  xyz ,  ... ,  campo_n  tipo_n  : =  xyz );

Por ejemplo:

declarar  tipo  t_address  es  registro  (  nombre  dirección . nombre % tipo ,  dirección de calle  . calle % tipo , número de calle dirección . street_number % tipo , código postal dirección . código postal % tipo ); v_address t_address ; comience a seleccionar nombre , calle , número de calle , código postal en v_address desde la dirección donde                 rownum  =  1 ; terminar ;

Este programa de muestra define su propio tipo de datos, llamado t_address , que contiene los campos nombre, calle, número de calle y código postal .

Entonces, de acuerdo con el ejemplo, podemos copiar los datos de la base de datos a los campos del programa.

Usando este tipo de datos, el programador ha definido una variable llamada v_address y la ha cargado con datos de la tabla ADDRESS.

Los programadores pueden abordar atributos individuales en tal estructura por medio de la notación de puntos, así:

v_address.street: = 'Calle principal';

Declaraciones condicionales [ editar ]

El siguiente segmento de código muestra la construcción IF-THEN-ELSIF-ELSE. Las partes ELSIF y ELSE son opcionales, por lo que es posible crear construcciones IF-THEN o IF-THEN-ELSE más simples.

SI  x  =  1  ENTONCES  secuencia_de_enunciados_1 ; ELSIF  x  =  2  ENTONCES  secuencia_de_enunciados_2 ; ELSIF  x  =  3  ENTONCES  secuencia_de_enunciados_3 ; ELSIF  x  =  4  ENTONCES  secuencia_de_enunciados_4 ; ELSIF  x  =  5  ENTONCES  secuencia_de_enunciados_5 ; ELSE  sequence_of_statements_N ; END  IF ;

La instrucción CASE simplifica algunas estructuras grandes IF-THEN-ELSIF-ELSE.

CASE  WHEN  x  =  1  THEN  secuencia_de_enunciados_1 ;  CUANDO  x  =  2  ENTONCES  secuencia_de_enunciados_2 ;  CUANDO  x  =  3  ENTONCES  secuencia_de_enunciados_3 ;  CUANDO  x  =  4  ENTONCES  secuencia_de_enunciados_4 ;  CUANDO  x  =  5  ENTONCES  secuencia_de_enunciados_5 ;  ELSE  sequence_of_statements_N ; FINALIZAR  CASO ;

La sentencia CASE se puede utilizar con un selector predefinido:

CASE  x  CUANDO  1  ENTONCES  secuencia_de_enunciados_1 ;  CUANDO  2  ENTONCES  secuencia_de_enunciados_2 ;  CUANDO  3  ENTONCES  secuencia_de_enunciados_3 ;  CUANDO  4  ENTONCES  secuencia_de_enunciados_4 ;  CUANDO  5  ENTONCES  secuencia_de_enunciados_5 ;  ELSE  sequence_of_statements_N ; FINALIZAR  CASO ;

Manejo de matrices [ editar ]

PL / SQL se refiere a matrices como "colecciones". El idioma ofrece tres tipos de colecciones:

  1. Matrices asociativas (tablas de índice)
  2. Mesas anidadas
  3. Varrays (matrices de tamaño variable)

Los programadores deben especificar un límite superior para varrays, pero no es necesario para tablas indexadas o tablas anidadas. El lenguaje incluye varios métodos de recopilación que se utilizan para manipular los elementos de la recopilación: por ejemplo, FIRST, LAST, NEXT, PRIOR, EXTEND, TRIM, DELETE, etc. Las tablas indexadas se pueden usar para simular matrices asociativas, como en este ejemplo de una función de memo. para la función de Ackermann en PL / SQL .

Matrices asociativas (tablas indexadas) [ editar ]

Con las tablas indexadas, la matriz se puede indexar por números o cadenas. Es paralelo a un mapa de Java , que comprende pares clave-valor. Solo hay una dimensión y no tiene límites.

Tablas anidadas [ editar ]

Con tablas anidadas, el programador necesita comprender qué está anidado. Aquí, se crea un nuevo tipo que puede estar compuesto por varios componentes. Luego, ese tipo se puede usar para hacer una columna en una tabla, y anidados dentro de esa columna están esos componentes.

Varrays (matrices de tamaño variable) [ editar ]

Con Varrays, debe comprender que la palabra "variable" en la frase "matrices de tamaño variable" no se aplica al tamaño de la matriz de la forma en que podría pensar que lo haría. De hecho, el tamaño con el que se declara la matriz es fijo. El número de elementos de la matriz es variable hasta el tamaño declarado. Entonces, podría decirse que las matrices de tamaño variable no son tan variables en tamaño.

Cursores [ editar ]

Un cursor es un mecanismo, puntero a un área SQL privada que almacena información proveniente de una instrucción SELECT o de lenguaje de manipulación de datos (DML) (INSERT, UPDATE, DELETE o MERGE). Un cursor contiene las filas (una o más) devueltas por una instrucción SQL. El conjunto de filas que contiene el cursor se denomina conjunto activo. [12]

Un cursor puede ser explícito o implícito. En un bucle FOR, se utilizará un cursor explícito si la consulta se reutilizará; de lo contrario, se prefiere un cursor implícito. Si usa un cursor dentro de un bucle, se recomienda usar un FETCH cuando necesite realizar una recopilación masiva o cuando necesite SQL dinámico.

Bucle [ editar ]

Como lenguaje de procedimiento por definición, PL / SQL proporciona varias construcciones de iteración , incluidas declaraciones LOOP básicas, bucles WHILE , bucles FOR y bucles FOR de cursor. Desde Oracle 7.3, se introdujo el tipo REF CURSOR para permitir la devolución de conjuntos de registros desde funciones y procedimientos almacenados. Oracle 9i introdujo el tipo SYS_REFCURSOR predefinido, lo que significa que ya no tenemos que definir nuestros propios tipos REF CURSOR.

Declaraciones LOOP [ editar ]

<<parent_loop>> declaraciones LOOP<<child_loop>> las sentencias de bucle salen de parent_loop cuando < condición > ; - Termina la salida de ambos bucles cuando < condición > ; - Devuelve el control a parent_loop end loop child_loop ; si < condición > entonces continúe ; - continuar hasta el final de la siguiente iteración si ;                salir  cuando  < condición > ; END  LOOP  parent_loop ;

[13]

Los bucles se pueden terminar utilizando la EXIT palabra clave o generando una excepción .

FOR bucles [ editar ]

DECLARE  var  NUMBER ; BEGIN  / * NB para las variables de bucle en PL / SQL son declaraciones nuevas, con alcance solo dentro del bucle * /  FOR  var  IN  0  ..  10  LOOP  DBMS_OUTPUT . PUT_LINE ( var );  END  LOOP ; SI  var  ES  NULL  ENTONCES  DBMS_OUTPUT . PUT_LINE ( 'var es nulo' );  ELSE  DBMS_OUTPUT . PUT_LINE ( 'var no es nulo' );  END  IF ; FIN ;

Producción:

 0 1 2 3 4 5 6 7 8 9 10 var es nulo

Cursor FOR bucles [ editar ]

PARA  RecordIndex  IN  ( SELECT  person_code  FROM  people_table ) LOOP  DBMS_OUTPUT . PUT_LINE ( RecordIndex . Person_code ); END  LOOP ;

Los bucles de cursor para abren automáticamente un cursor , leen sus datos y vuelven a cerrar el cursor.

Como alternativa, el programador PL / SQL puede predefinir la instrucción SELECT del cursor de antemano para (por ejemplo) permitir la reutilización o hacer que el código sea más comprensible (especialmente útil en el caso de consultas largas o complejas).

DECLARE  CURSOR  cursor_person  ES  SELECT  person_code  FROM  people_table ; COMIENZO  DE  RecordIndex  EN  cursor_person  BUCLE  DBMS_OUTPUT . PUT_LINE ( recordIndex . Person_code );  END  LOOP ; FIN ;

El concepto de person_code dentro del bucle FOR se expresa con notación de puntos ("."):

RecordIndex . person_code

SQL dinámico [ editar ]

Mientras que los programadores pueden incrustar fácilmente declaraciones de lenguaje de manipulación de datos (DML) directamente en el código PL / SQL utilizando declaraciones SQL sencillas, el lenguaje de definición de datos (DDL) requiere declaraciones de "SQL dinámico" más complejas en el código PL / SQL. Sin embargo, las declaraciones DML sustentan la mayoría del código PL / SQL en aplicaciones de software típicas.

En el caso de SQL dinámico PL / SQL, las primeras versiones de Oracle Database requerían el uso de una complicada DBMS_SQLbiblioteca de paquetes de Oracle . Sin embargo, las versiones más recientes han introducido un "SQL dinámico nativo" más simple, junto con una EXECUTE IMMEDIATEsintaxis asociada .

Idiomas similares [ editar ]

PL / SQL funciona de forma análoga a los lenguajes de procedimiento integrados asociados con otras bases de datos relacionales . Por ejemplo, Sybase ASE y Microsoft SQL Server tienen Transact-SQL , PostgreSQL tiene PL / pgSQL (que emula PL / SQL hasta cierto punto), MariaDB incluye un analizador de compatibilidad PL / SQL [14] e IBM DB2 incluye SQL Procedural Language, [15] que se ajusta a la ISO SQL ‘s SQL / PSM estándar.

Los diseñadores de PL / SQL modelaron su sintaxis en la de Ada . Tanto Ada como PL / SQL tienen a Pascal como un antepasado común, por lo que PL / SQL también se parece a Pascal en la mayoría de los aspectos. Sin embargo, la estructura de un paquete PL / SQL no se parece a la estructura básica del programa Object Pascal implementada por una unidad Borland Delphi o Free Pascal . Los programadores pueden definir tipos de datos globales públicos y privados, constantes y variables estáticas en un paquete PL / SQL. [dieciséis]

PL / SQL también permite la definición de clases y la instanciación de estas como objetos en el código PL / SQL. Esto se asemeja al uso en lenguajes de programación orientados a objetos como Object Pascal , C ++ y Java . PL / SQL se refiere a una clase como un "Tipo de datos abstracto" (ADT) o "Tipo definido por el usuario" (UDT), y la define como un tipo de datos SQL de Oracle en lugar de un tipo definido por el usuario PL / SQL, lo que permite su uso tanto en Oracle SQL Engine como en OracleMotor PL / SQL. El constructor y los métodos de un tipo de datos abstracto están escritos en PL / SQL. El tipo de datos abstracto resultante puede funcionar como una clase de objeto en PL / SQL. Estos objetos también pueden persistir como valores de columna en las tablas de la base de datos de Oracle.

PL / SQL es fundamentalmente distinto de Transact-SQL , a pesar de las similitudes superficiales. La transferencia de código de uno a otro generalmente implica un trabajo no trivial, no solo debido a las diferencias en los conjuntos de características de los dos lenguajes, [17] sino también a las diferencias muy significativas en la forma en que Oracle y SQL Server tratan la concurrencia. y bloqueo .

El producto StepSqlite es un compilador PL / SQL para la popular base de datos pequeña SQLite que admite un subconjunto de sintaxis PL / SQL. La versión Berkeley DB 11g R2 de Oracle agregó soporte para SQL basado en la popular API SQLite al incluir una versión de SQLite en Berkeley DB. [18] En consecuencia, StepSqlite también se puede utilizar como una herramienta de terceros para ejecutar código PL / SQL en Berkeley DB. [19] .plsql contiene sql dinámico para ejecutar consultas en tiempo de ejecución.

Ver también [ editar ]

  • T-SQL
  • SQL PL
  • SQL / PSM
  • Editores PL / SQL
  • Sistemas de gestión de bases de datos relacionales

Referencias [ editar ]

  1. ^ Serge Rielau ([email protected]), arquitecto SQL, STSM, IBM. "DB2 10: Ejecute aplicaciones Oracle en DB2 10 para Linux, UNIX y Windows" . Ibm.com . Consultado el 26 de julio de 2012 .CS1 maint: varios nombres: lista de autores ( enlace )
  2. ^ Steven Feuerstein (1995), "Programación de Oracle PL / SQL", 1ª, primera edición.
  3. ^ https://docs.oracle.com/en/database/oracle/oracle-database/18/sqlrf/Oracle-Compliance-with-SQLPSM2011.html#GUID-651F9066-1511-407B-A002-C04AB2F2A534
  4. ^ "Características del servidor Oracle" . Oracle . Consultado el 21 de septiembre de 2020 .
  5. ^ "Bloques anónimos PL / SQL" . Oracle . Consultado el 21 de septiembre de 2020 .
  6. ^ "Referencia de SQL de la base de datos" . Oracle . Consultado el 21 de septiembre de 2020 .
  7. ^ Nanda, Arup; Feuerstein, Steven (2005). Oracle PL / SQL para administradores de bases de datos . Serie O'Reilly. O'Reilly Media, Inc. págs. 122, 429. ISBN 978-0-596-00587-0. Consultado el 11 de enero de 2011 . Una función de tabla canalizada devuelve [...] un conjunto de resultados como una colección [...] de forma iterativa. [...] Como cada fila está lista para ser asignada a la colección, se 'canaliza' fuera de la función.
  8. ^ "Referencia de SQL de la base de datos" . Oracle . Consultado el 21 de septiembre de 2020 .
  9. ^ Gupta, Saurabh K. (2016) [2012]. "5: Uso de métodos de interfaz avanzados". Guía avanzada para desarrolladores de Oracle PL / SQL . Experiencia profesional destilada (2 ed.). Birmingham: Packt Publishing Ltd. p. 143. ISBN 9781785282522. Consultado el 8 de junio de 2017 . Siempre que el motor de tiempo de ejecución PL / SQL encuentra una llamada a un procedimiento externo, Oracle Database inicia el proceso extproc. La base de datos pasa la información recibida de la especificación de la llamada al proceso extproc , lo que le ayuda a localizar el procedimiento externo dentro de la biblioteca y ejecutarlo utilizando los parámetros proporcionados. El proceso extproc carga la biblioteca vinculada dinámica, ejecuta el procedimiento externo y devuelve el resultado a la base de datos.
  10. ^ "Codificación de paquetes y procedimientos de PL / SQL" . Oracle . Consultado el 21 de septiembre de 2020 .
  11. ^ "Literales" . Oracle iSQL Reference 10g Release 2 (10.2) . Oracle . Consultado el 20 de marzo de 2009 .
  12. ^ Feuerstein, Steven. "Trabajar con cursores" . oracle.com .
  13. ^ "Guía y referencia del usuario de base de datos PL / SQL" . download.oracle.com .
  14. ^ "Novedades de MariaDB Server 10.3" (PDF) . MariaDB . Consultado el 21 de agosto de 2018 .
  15. ^ "SQL PL" . Publib.boulder.ibm.com . Consultado el 26 de julio de 2012 .
  16. ^ Documentación de Oracle "Elementos públicos y privados en PL / SQL"
  17. ^ "Migración de Oracle a SQL Server - T-SQL, diferencias PL / SQL: página de inicio de Narayana Vyas Kondreddi" . vyaskn.tripod.com .
  18. ^ Burd, Gregory (24 de marzo de 2010). "@humanications No re-implementamos la API de SQLite, incluimos una versión de SQLite que usa Berkeley DB para almacenamiento (reemplazando btree.c)" .
  19. ^ "Preguntas frecuentes oficiales de Berkeley DB" . Oracle Corporation . Consultado el 30 de marzo de 2010 . ¿Berkeley DB es compatible con PL / SQL?

Lectura adicional [ editar ]

  • Feuerstein, Steven ; Bill Pribyl (2014). Programación Oracle PL / SQL (6ª ed.). O'Reilly y asociados . ISBN 978-1449324452.
  • Naudé, Frank (9 de junio de 2005). "Preguntas frecuentes de Oracle PL / SQL rev 2.08" .

Enlaces externos [ editar ]

  • Preguntas frecuentes de Oracle: PL / SQL
  • Centro de tecnología de Oracle
  • Motor de búsqueda Oracle Tahiti
  • Biblioteca de Morgan
  • ORACLE-BASE: Artículos PL / SQL