Como diferenciar entre SQL e PL / SQL?

16

Eu sei que a pergunta pode parecer muito estúpida, mas nunca entendi essa parte.

O SQL * Plus funciona com SQL e PL / SQL. Como sei se algum código é SQL ou PL / SQL? Se meu código tem um loop for, não é mais SQL?

PL / SQL é uma extensão para o SQL ter loops, condicionais etc. Então algum código SQL é por padrão código PL / SQL? Não é assim?

Existe uma demarcação entre SQL e PL / SQL?

Dois exemplos de diferenciação entre b / w SQL e PL / SQL que acionaram essa pergunta:

Qual é a diferença entre essas duas instruções create table?

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

lazer
fonte

Respostas:

12

É uma pergunta interessante, com certeza. A maioria das pessoas que estão familiarizadas com o desenvolvimento do Oracle não pensou nisso, mas quando se trata disso, às vezes é confuso definir a demarcação entre SQL e PL / SQL.

Observando a definição dos acrônimos, você começa a ter uma idéia de quais áreas de funcionalidade cada uma abrange:

SQL - Linguagem de Consulta Estruturada

PL / SQL - Linguagem processual / linguagem de consulta estruturada

O leitor atento pode perceber como o SQL aparece duas vezes 8) Isso ocorre porque o SQL é frequentemente incorporado ao PL / SQL - PL / SQL é uma linguagem criada para fornecer uma linguagem de quarta geração proprietária (4GL) que funciona muito bem com objetos de banco de dados em Oráculo.

A Wikipedia possui um material muito bom em SQL e PL / SQL

A parte confusa é onde PL / SQL e SQL se sobrepõem um pouco. O alcance do SQL inclui inserção de dados, consulta, atualização e exclusão, as chamadas operações de linguagem de manipulação de dados ou DML, mas também inclui criar, alterar, renomear, eliminar, que são operações de linguagem de definição de dados ou DDL. É aqui que alguns podem ficar confusos. A operação para criar um procedimento armazenado, algo escrito usando PL / SQL, é realmente SQL - você usa SQL para criar o objeto de banco de dados que representa um bloco de PL / SQL.

Da mesma forma, você pode incorporar o código SQL dentro do seu PL / SQL. Um loop FOR no PL / SQL pode ser baseado em uma consulta SQL, por exemplo. Assopra sua mente um pouco, não é? Você cria um procedimento usando o SQL que realmente usa o SQL internamente para executar alguma ação nos registros do banco de dados.

Coisas legais se você me perguntar.

ScottCher
fonte
2
De fato, a linha está embaçada. Você poderia escrever uma instrução SQL para criar um procedimento PL / SQL que tem uma instrução SQL em que ela chama uma função PL / SQL que tem uma instrução SQL nele, etc.
Leigh Riffel
1
@ Desça a toca do coelho, vamos!
ScottCher
Eu não diria que a linha estava borrada. PL / SQL é o invólucro de procedimento para SQL. A maioria dos PL / SQL contém instruções SQL, embora não seja necessário. Você pode rastrear os cursores SQL reais em v$sqletc.
William Robertson
12

Se estiver envolto em

  • BEGIN ... END
  • DECLARE ... END
  • CREATE OR REPLACE ... END
  • É um prefixo de uma linha EXECUTE

Então é PL / SQL. O que isso significa sob o capô? O SQL é "compilado" em um plano de consulta e executado, retornando imediatamente um conjunto de resultados no evento SELECTou no número de linhas afetadas em outros casos ou em um erro. No entanto, o PL / SQL está mais envolvido. Todos os objetos mencionados nele são verificados quanto à existência e concessões necessárias, e o PL / SQL é compilado até o código quase nativo , que é executado em velocidade máxima. As dependências são rastreadas e, se uma tabela for alterada, qualquer referência PL / SQL a ela requer recompilação. A razão para isso é a velocidade; como tudo é feito antecipadamente no momento da compilação, não há necessidade de realizar verificações de tempo de execução no PL / SQL, enquanto as instruções SQL devem ser verificadas sempre (mesmo que os planos de consulta sejam armazenados em cache, a chamada análise suave, os privilégios ainda devem ser verificados e até uma análise suave tem um custo associado a ela).

Essa é uma das "principais vantagens" dos procedimentos armazenados, como a Oracle os faz; na verdade, executar um proc ou gatilho armazenado PL / SQL faz a quantidade mínima absoluta de cálculo para obter o resultado. O código do aplicativo executado fora do kernel do Oracle, onde não é confiável, precisa passar por mais obstáculos para obter os dados. É o mesmo argumento para linguagens de alto nível referenciadas e fortemente tipadas, como OCaml ou Haskell - trabalham mais uma vez, em tempo de compilação, e colhem os benefícios nos milhões de vezes que o código é executado.

Gaius
fonte
2
Para adicionar ao mix, CALL é uma instrução SQL usada para executar uma unidade de programa armazenada e é reescrita sob o capô como um BEGIN ... END
Gary
2
Como é EXECUTAR, é açúcar sintático
Gaius
5

Existe uma demarcação entre SQL e PL / SQL?

SQL é um padrão *.

PL / SQL é uma extensão de fornecedor para o padrão SQL *.

* SQL é uma linguagem que possui uma gramática explícita e regras sobre como essa gramática deve ser implementada, e que não é, por si só, um padrão . No entanto, como existe uma especificação de linguagem na qual todos podem concordar, qualquer coisa escrita em SQL seria portátil se o programa fosse escrito apenas em SQL.

Porém, como o PL / SQL é uma extensão de fornecedor, ele terá partes de idioma que outros fornecedores podem não suportar.

jcolebrand
fonte
3
Eu diria que a PL / SQL é um padrão de facto, enquanto SQL é um padrão de jure :-)
Gaius
3
@Gaius ea partir dessa declaração só eu diria duas coisas: Você é um dev ORA, e você acha TSQL é apenas confuso: p
jcolebrand
@jcolebrand Meu primeiro trabalho de DBA foi na Sybase, mas você está certo, eu trabalho principalmente com a Oracle atualmente. Eu ficaria muito feliz se você pudesse escrever T-SQL ou PL / SQL em qualquer banco de dados, mas as linguagens refletem suas plataformas (por exemplo, T-SQL é como é porque cursores e bloqueios são caros no SQL Server e seus descendentes e PL / SQL é o jeito que é porque alguém na Oracle trabalhou pela última vez no DoD) :-)
Caio
@ Gaio Ah, sim, o velho argumento sobre os padrões serem tão bons, porque há muitos por onde escolher. Eu acho que é bom indicar que o SQL é um "padrão" e que o PL / SQL é proprietário, então marque +1 em @jcolebrand.
21311 ScottCher
@ ScottCher ~ Obrigado por isso. Sinto-me idiota ao dizer que é um padrão, porque não existe um órgão de padrões para carimbá-lo com um selo de aprovação e fornecer um número. Mas está bem definido e acordado. ;)
jcolebrand