Este artículo tiene varios problemas. Ayude a mejorarlo o discuta estos problemas en la página de discusión . ( Obtenga información sobre cómo y cuándo eliminar estos mensajes de plantilla ) ( Aprenda cómo y cuándo eliminar este mensaje de plantilla )
|
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.
- Un parámetro IN se utiliza solo como entrada. Un parámetro IN se pasa por referencia, aunque el programa inactivo puede modificarlo.
- 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.
- 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-proc
proceso 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]
- 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.
- 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_DATE
funció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 RAISE
o RAISE_APPLICATION_ERROR
, en cualquier situación en la que determinen que es imposible que continúe la ejecución normal. El RAISE
comando 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 SQLCODE
y 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:
- Matrices asociativas (tablas de índice)
- Mesas anidadas
- 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_SQL
biblioteca 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 IMMEDIATE
sintaxis 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 ]
- ^ 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 )
- ^ Steven Feuerstein (1995), "Programación de Oracle PL / SQL", 1ª, primera edición.
- ^ https://docs.oracle.com/en/database/oracle/oracle-database/18/sqlrf/Oracle-Compliance-with-SQLPSM2011.html#GUID-651F9066-1511-407B-A002-C04AB2F2A534
- ^ "Características del servidor Oracle" . Oracle . Consultado el 21 de septiembre de 2020 .
- ^ "Bloques anónimos PL / SQL" . Oracle . Consultado el 21 de septiembre de 2020 .
- ^ "Referencia de SQL de la base de datos" . Oracle . Consultado el 21 de septiembre de 2020 .
- ^ 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.
- ^ "Referencia de SQL de la base de datos" . Oracle . Consultado el 21 de septiembre de 2020 .
- ^ 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.
- ^ "Codificación de paquetes y procedimientos de PL / SQL" . Oracle . Consultado el 21 de septiembre de 2020 .
- ^ "Literales" . Oracle iSQL Reference 10g Release 2 (10.2) . Oracle . Consultado el 20 de marzo de 2009 .
- ^ Feuerstein, Steven. "Trabajar con cursores" . oracle.com .
- ^ "Guía y referencia del usuario de base de datos PL / SQL" . download.oracle.com .
- ^ "Novedades de MariaDB Server 10.3" (PDF) . MariaDB . Consultado el 21 de agosto de 2018 .
- ^ "SQL PL" . Publib.boulder.ibm.com . Consultado el 26 de julio de 2012 .
- ^ Documentación de Oracle "Elementos públicos y privados en PL / SQL"
- ^ "Migración de Oracle a SQL Server - T-SQL, diferencias PL / SQL: página de inicio de Narayana Vyas Kondreddi" . vyaskn.tripod.com .
- ^ 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)" .
- ^ "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 ]
La programación de Wikibook Oracle tiene una página sobre el tema de: Hoja de referencia de SQL |
- 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