¿Cómo diferenciar entre SQL y PL / SQL?

16

Sé que la pregunta puede sonar demasiado estúpida, pero nunca entendí esta parte.

SQL * Plus funciona con SQL y PL / SQL. ¿Cómo sé si algún código es SQL o PL / SQL? Si mi código tiene un bucle for, ¿ya no es SQL?

PL / SQL es una extensión para que SQL tenga bucles, condicionales, etc. Entonces, ¿cualquier código SQL es por defecto código PL / SQL? ¿No es así?

¿Hay una demarcación entre SQL y PL / SQL?

Dos ejemplos de diferenciación de b / w SQL y PL / SQL que desencadenaron esta pregunta:

¿Cuál es la diferencia entre estos dos enunciados de tabla de creación?

/programming/2267386/oracle-11g-varray-of-objects/2267813#2267813

Lazer
fuente

Respuestas:

12

Es una pregunta interesante, para estar seguro. La mayoría de las personas que están familiarizadas con el desarrollo de Oracle no lo pensarían, pero a fin de cuentas, a veces es confuso definir la demarcación entre SQL y PL / SQL.

Al observar la definición de las siglas, comienza a tener una idea de qué áreas de funcionalidad cubre cada una:

SQL: lenguaje de consulta estructurado

PL / SQL: lenguaje de procedimiento / lenguaje de consulta estructurado

El lector observador podría notar cómo aparece SQL dos veces 8) Esto se debe a que SQL a menudo está incrustado en PL / SQL: PL / SQL es un lenguaje creado para proporcionar un lenguaje patentado de cuarta generación (4GL) que juega muy bien con objetos de base de datos en Oráculo.

Wikipedia tiene bastante buen material tanto en SQL como en PL / SQL

La parte confusa es donde PL / SQL y SQL se superponen un poco. El alcance de SQL incluye la inserción, consulta, actualización y eliminación de datos, el llamado DML, o las operaciones del lenguaje de manipulación de datos, pero también incluye crear, alterar, renombrar, soltar, que son DDL o las operaciones del lenguaje de definición de datos. Es aquí donde algunos pueden confundirse. La operación para crear un procedimiento almacenado, algo escrito usando PL / SQL, es en realidad SQL: usted usa SQL para crear el objeto de base de datos que representa un bloque de PL / SQL.

Del mismo modo, puede incrustar código SQL dentro de su PL / SQL. Un bucle FOR en PL / SQL puede basarse en una consulta SQL, por ejemplo. Sopla tu mente un poco, ¿eh? Crea un procedimiento usando SQL que en realidad usa SQL internamente para realizar alguna acción en los registros de la base de datos.

Cosas geniales si me preguntas.

ScottCher
fuente
2
De hecho, la línea está borrosa. Se puede escribir una instrucción SQL para crear un procedimiento PL / SQL que tiene una instrucción SQL en él que llama a una función PL / SQL que tiene una instrucción SQL en el mismo, etc
Leigh Riffel
1
@Leigh abajo de la madriguera del conejo vamos!
ScottCher
No diría que la línea estaba borrosa en absoluto. PL / SQL es el contenedor de procedimientos para SQL. La mayoría de PL / SQL contiene sentencias de SQL, aunque no es necesario. Puede rastrear los cursores SQL reales en v$sqletc.
William Robertson
12

Si está envuelto en

  • BEGIN ... END
  • DECLARE ... END
  • CREATE OR REPLACE ... END
  • Es un prefijo de una línea EXECUTE

Entonces es PL / SQL. ¿Qué significa esto debajo del capó? SQL se "compila" en un plan de consulta y se ejecuta, devolviendo inmediatamente un conjunto de resultados en el caso de SELECTo el número de filas afectadas en otros casos, o un error. PL / SQL, sin embargo, está más involucrado. Cada objeto al que se hace referencia se verifica su existencia y las concesiones necesarias, luego el PL / SQL se compila en un código casi nativo , que se ejecuta a toda velocidad. Las dependencias se rastrean y si una tabla cambia, entonces cualquier referencia de PL / SQL requiere una nueva compilación. La razón de esto es la velocidad; Como todo se hace por adelantado en tiempo de compilación, no es necesario realizar ninguna verificación de tiempo de ejecución en PL / SQL, mientras que las declaraciones SQL deben verificarse cada vez (incluso si los planes de consulta se almacenan en caché, el llamado análisis suave, los privilegios aún deben verificarse e incluso un análisis suave tiene un costo asociado).

Esta es una de las "ventajas asesinas" de los procedimientos almacenados como lo hace Oracle; En realidad, ejecutar un proceso almacenado PL / SQL o un disparador hace la cantidad mínima absoluta de cálculo para obtener el resultado. El código de la aplicación que se ejecuta fuera del núcleo de Oracle, donde no es de confianza, tiene que saltar a través de más aros para obtener los datos. Es el mismo argumento para lenguajes de alto nivel fuertemente tipados y referencialmente transparentes como OCaml o Haskell: haga más trabajo una vez, en tiempo de compilación, y obtenga los beneficios en los millones de veces que se ejecuta el código.

Gayo
fuente
2
Para agregar a la mezcla, CALL es una instrucción SQL utilizada para ejecutar una unidad de programa almacenada, y se reescribe bajo el capó como un COMIENZO ... FIN
Gary
2
Como es EJECUTAR, es azúcar sintáctico
Gaius
5

¿Hay una demarcación entre SQL y PL / SQL?

SQL es un estándar *.

PL / SQL es una extensión de proveedor para el estándar SQL *.

* SQL es un lenguaje que tiene una gramática explícita y reglas sobre cómo se debe implementar esa gramática, y no es un estándar per se . Sin embargo, dado que hay una especificación de lenguaje en la que todos pueden estar de acuerdo, cualquier cosa escrita en SQL sería portátil si el programa solo se escribiera en SQL.

Pero debido a que PL / SQL es una extensión de proveedor, tendrá partes de lenguaje que otros proveedores pueden no admitir.

jcolebrand
fuente
3
Yo diría que PL / SQL es un estándar de facto, mientras que SQL es un estándar de jure :-)
Gaius
3
@Gaius y solo de esa declaración, adivinaría dos cosas: eres un desarrollador de ORA y crees que TSQL es simplemente desordenado: p
jcolebrand
@jcolebrand Mi primer trabajo de DBA fue realmente en Sybase, pero tienes razón, principalmente trabajo con Oracle en estos días. Me encantaría poder escribir T-SQL o PL / SQL en cualquiera de las bases de datos, pero los idiomas reflejan sus plataformas (por ejemplo, T-SQL es así porque los cursores y bloqueos son caros en SQL Server y sus descendientes , y PL / SQL es así porque alguien en Oracle trabajó por última vez en el DoD) :-)
Gaius
@Gaius Ah, sí, el viejo argumento sobre los estándares es tan bueno porque hay muchos para elegir. Creo que es bueno indicar que SQL es un "estándar" y que PL / SQL es propietario, por lo que +1 @jcolebrand.
ScottCher
@ScottCher ~ Gracias por eso. Me siento tonto al decir que es un estándar porque no existe (afaik) un organismo de estándares para sellarlo con un sello de aprobación y darle un número. Pero está bien definido y acordado. ;)
jcolebrand