Comment différencier SQL et PL / SQL?


16

Je sais que la question peut sembler trop stupide, mais je n'ai jamais compris cette partie.

SQL * Plus fonctionne avec SQL et PL / SQL. Comment savoir si du code est SQL ou PL / SQL? Si mon code a une boucle for, n'est-ce plus SQL?

PL / SQL est une extension pour SQL pour avoir des boucles, des conditions, etc. Alors, tout code SQL est par défaut du code PL / SQL? N'est-ce pas?

Y a-t-il une démarcation entre SQL et PL / SQL?

Deux exemples de différenciation SQL n / b et PL / SQL qui ont déclenché cette question:

Quelle est la différence entre ces deux instructions create table?

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

Réponses:


12

C'est une question intéressante, bien sûr. La plupart des gens qui connaissent le développement Oracle n'y penseraient pas, mais quand vous y arrivez, il est parfois déroutant de définir la démarcation entre SQL et PL / SQL.

En regardant la définition des acronymes, vous commencez à vous faire une idée des domaines de fonctionnalité que chacun couvre:

SQL - Langage de requête structuré

PL / SQL - Langage procédural / Langage de requête structuré

Le lecteur attentif remarquera peut-être comment SQL apparaît deux fois 8) En effet, SQL est souvent intégré à PL / SQL - PL / SQL est un langage conçu pour fournir un langage propriétaire de 4e génération (4GL) qui fonctionne très bien avec les objets de base de données dans Oracle.

Wikipédia a du bon matériel sur SQL et PL / SQL

La partie déroutante est où PL / SQL et SQL se chevauchent un peu. La compétence de SQL comprend l'insertion, la requête, la mise à jour et la suppression de données, ce qu'on appelle le DML ou les opérations du langage de manipulation de données, mais il comprend également la création, la modification, le renommage, la suppression qui sont des opérations de langage DDL ou de définition de données. C'est ici que certains pourraient être confus. L'opération pour créer une procédure stockée, quelque chose écrite en utilisant PL / SQL, est en fait SQL - vous utilisez SQL pour créer l'objet de base de données qui représente un bloc de PL / SQL.

De même, vous pouvez intégrer du code SQL dans votre PL / SQL. Une boucle FOR en PL / SQL peut être basée sur une requête SQL, par exemple. Ça vous souffle un peu, hein? Vous créez une procédure à l'aide de SQL qui utilise réellement en interne SQL pour effectuer une action sur les enregistrements de la base de données.

Des trucs sympas si vous me demandez.


2
En effet, la ligne est floue. Vous pouvez écrire une instruction SQL pour créer une procédure PL / SQL contenant une instruction SQL qui appelle une fonction PL / SQL contenant une instruction SQL, etc.
Leigh Riffel

1
@ Leigh dans le terrier du lapin, nous allons!
ScottCher

Je ne dirais pas que la ligne était floue du tout. PL / SQL est l'encapsuleur procédural pour SQL. La plupart des PL / SQL contiennent des instructions SQL, même si cela n'est pas obligatoire. Vous pouvez retracer les curseurs SQL réels dans v$sqletc.
William Robertson

12

S'il est enveloppé dans

  • BEGIN ... END
  • DECLARE ... END
  • CREATE OR REPLACE ... END
  • Est un préfixe à une ligne EXECUTE

Ensuite, c'est PL / SQL. Qu'est-ce que cela signifie sous le capot? SQL est "compilé" dans un plan de requête et exécuté, renvoyant immédiatement un jeu de résultats en cas de SELECTou le nombre de lignes affectées dans d'autres cas, ou une erreur. PL / SQL est cependant plus impliqué. Chaque objet référencé est vérifié pour l'existence et les autorisations nécessaires, puis le PL / SQL est compilé en code quasi natif , qui s'exécute à pleine vitesse. Les dépendances sont suivies et si une table change, alors tout PL / SQL y faisant référence nécessite une recompilation. La raison en est la vitesse; comme tout est fait à l'avance au moment de la compilation, il n'est pas nécessaire d'avoir des vérifications d'exécution en PL / SQL, tandis que les instructions SQL doivent être vérifiées à chaque fois (même les plans de requête sont mis en cache, ce qu'on appelle l'analyse syntaxique douce, les privilèges doivent encore être vérifiés, et même une analyse souple a un coût associé).

C'est l'un des "avantages les plus importants" des procédures stockées comme Oracle le fait; l'exécution d'un proc ou d'un déclencheur stocké PL / SQL fait le minimum absolu de calcul pour obtenir le résultat. Le code d'application s'exécutant en dehors du noyau Oracle où il n'est pas approuvé doit passer par plus de cerceaux pour accéder aux données. C'est le même argument pour les langages de haut niveau fortement typés et référentiellement transparents tels que OCaml ou Haskell - faites plus de travail une fois, au moment de la compilation, et profitez des millions de fois que le code est exécuté.


2
Pour ajouter au mix CALL est une instruction SQL utilisée pour exécuter une unité de programme stockée, et est réécrite sous le capot en tant que BEGIN ... END
Gary

2
Comme c'est EXECUTE, c'est du sucre syntaxique
Gaius

5

Y a-t-il une démarcation entre SQL et PL / SQL?

SQL est un standard *.

PL / SQL est une extension du fournisseur de la norme SQL *.

* SQL est un langage qui a une grammaire explicite et des règles sur la façon dont cette grammaire doit être implémentée, et ce n'est pas un standard en soi . Cependant, comme il existe une spécification de langage sur laquelle tout le monde peut s'entendre, tout ce qui est écrit en SQL serait portable si le programme n'était écrit qu'en SQL.

Mais comme PL / SQL est une extension de fournisseur, elle comportera des parties de langage que d'autres fournisseurs pourraient ne pas prendre en charge.


3
Je dirais que PL / SQL est une norme de facto, alors que SQL est une norme de jure :-)
Gaius

3
@Gaius et à partir de cette seule déclaration, je devine deux choses: vous êtes un développeur ORA, et vous pensez que TSQL est juste désordonné: p
jcolebrand

@jcolebrand Mon premier emploi DBA était en fait sur Sybase, mais vous avez raison, je travaille principalement avec Oracle ces jours-ci. Je serais très heureux si vous pouviez écrire T-SQL ou PL / SQL sur l'une ou l'autre base de données, mais les langages reflètent leurs plates-formes (par exemple, T-SQL est comme ça parce que les curseurs et les verrous sont chers dans SQL Server et ses descendants) , et PL / SQL est comme ça parce que quelqu'un chez Oracle a travaillé pour la dernière fois au DoD) :-)
Gaius

@Gaius Ah, oui, l'ancien argument selon lequel les normes sont si bonnes parce qu'il y en a tellement parmi lesquelles choisir. Je pense qu'il est bon d'indiquer que SQL est un "standard" et que PL / SQL est propriétaire donc +1 @jcolebrand.
ScottCher

@ScottCher ~ Merci pour cela. Je suis stupide de dire que c'est une norme parce qu'il n'y a pas (afaik) d'organisme de normalisation pour l'apposer avec un sceau d'approbation et lui donner un numéro. Mais il est bien défini et convenu. ;)
jcolebrand
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.