Come distinguere tra SQL e PL / SQL?


16

So che la domanda potrebbe sembrare troppo stupida, ma non ho mai capito questa parte.

SQL * Plus funziona sia con SQL che con PL / SQL. Come faccio a sapere se un codice è SQL o PL / SQL? Se il mio codice ha un ciclo for, non è più SQL?

PL / SQL è un'estensione per SQL con loop, condizionali ecc. Quindi, per impostazione predefinita, qualsiasi codice SQL è il codice PL / SQL? Non è così?

Esiste una demarcazione tra SQL e PL / SQL?

Due esempi di differenziazione tra b / n SQL e PL / SQL che hanno scatenato questa domanda:

Qual è la differenza tra queste due istruzioni table create?

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

Risposte:


12

È una domanda interessante, certo. La maggior parte delle persone che hanno familiarità con lo sviluppo di Oracle non ci pensano, ma quando ci si arriva, a volte è confuso definire la demarcazione tra SQL e PL / SQL.

Osservando la definizione degli acronimi, inizi a farti un'idea delle aree di funzionalità che ciascuna copre:

SQL: linguaggio di query strutturato

PL / SQL - Linguaggio procedurale / Linguaggio di query strutturato

Il lettore osservatore potrebbe notare come SQL viene visualizzato due volte 8) Questo perché SQL è spesso incorporato in PL / SQL - PL / SQL è un linguaggio creato per fornire un linguaggio proprietario di 4a generazione (4GL) che gioca molto bene con gli oggetti del database in Oracolo.

Wikipedia ha del materiale abbastanza buono su SQL e PL / SQL

La parte confusa è dove PL / SQL e SQL si sovrappongono un po '. Il campo di applicazione di SQL include l'inserimento di dati, la query, l'aggiornamento e l'eliminazione, il cosiddetto DML o le operazioni del linguaggio di manipolazione dei dati, ma include anche la creazione, l'alterazione, la ridenominazione, l'eliminazione di DDL o operazioni del linguaggio di definizione dei dati. È qui che alcuni potrebbero confondersi. L'operazione per creare una procedura memorizzata, scritta in PL / SQL, è in realtà SQL: si utilizza SQL per creare l'oggetto database che rappresenta un blocco di PL / SQL.

Allo stesso modo, puoi incorporare il codice SQL nel tuo PL / SQL. Un ciclo FOR in PL / SQL può essere basato, ad esempio, su una query SQL. Ti colpisce un po 'la testa, eh? Si crea una procedura utilizzando SQL che utilizza SQL internamente per eseguire alcune azioni sui record dal database.

Roba interessante se me lo chiedi.


2
In effetti, la linea è sfocata. È possibile scrivere un'istruzione SQL per creare una procedura PL / SQL che contiene un'istruzione SQL che chiama una funzione PL / SQL che contiene un'istruzione SQL, ecc.
Leigh Riffel,

1
@Leigh giù nella tana del coniglio andiamo!
ScottCher,

Non direi che la linea fosse del tutto sfocata. PL / SQL è il wrapper procedurale per SQL. La maggior parte dei PL / SQL contiene istruzioni SQL, anche se non è necessario. È possibile tracciare i cursori SQL effettivi in v$sqlecc.
William Robertson,

12

Se è avvolto

  • BEGIN ... END
  • DECLARE ... END
  • CREATE OR REPLACE ... END
  • È preceduto da una riga EXECUTE

Quindi è PL / SQL. Cosa significa questo sotto il cofano? SQL viene "compilato" in un piano di query ed eseguito, restituendo immediatamente un set di risultati in caso di SELECTo il numero di righe interessate in altri casi o un errore. PL / SQL tuttavia è più coinvolto. Ogni oggetto a cui viene fatto riferimento viene verificato per l'esistenza e le concessioni necessarie, quindi il PL / SQL viene compilato in codice quasi nativo , che viene eseguito alla massima velocità. Le dipendenze vengono monitorate e se una tabella cambia, quindi qualsiasi riferimento PL / SQL richiede la ricompilazione. La ragione di ciò è la velocità; poiché tutto viene eseguito in anticipo al momento della compilazione, non è necessario effettuare controlli di runtime in PL / SQL, mentre le istruzioni SQL devono essere controllate ogni volta (anche se i piani di query vengono memorizzati nella cache, il cosiddetto soft anal, i privilegi devono ancora essere controllati e anche un soft analse ha un costo associato).

Questo è uno dei "vantaggi killer" delle procedure memorizzate come Oracle le fa; effettivamente l'esecuzione di un proc o trigger memorizzato PL / SQL esegue la quantità minima assoluta di calcolo per ottenere il risultato. Il codice dell'applicazione in esecuzione al di fuori del kernel Oracle in cui non è attendibile deve passare attraverso più cerchi per ottenere i dati. È lo stesso argomento per linguaggi di alto livello fortemente tipizzati e trasparenti dal punto di vista referenziale come OCaml o Haskell - fai più lavoro una volta, al momento della compilazione, e raccogli i benefici nei milioni di volte in cui il codice viene eseguito.


2
Per aggiungere al mix CALL è un'istruzione SQL utilizzata per eseguire un'unità di programma memorizzata, ed è riscritta sottotitoli come BEGIN ... END
Gary

2
Come EXECUTE, è zucchero sintattico
Gaius,

5

Esiste una demarcazione tra SQL e PL / SQL?

SQL è uno standard *.

PL / SQL è un'estensione del fornitore allo standard SQL *.

* SQL è un linguaggio che ha una grammatica esplicita e le regole per come dovrebbe essere attuato che la grammatica, ed è , ma non è uno standard per-sé . Tuttavia, poiché esiste una specifica del linguaggio che tutti possono concordare, qualsiasi cosa scritta in SQL sarebbe portatile se il programma fosse scritto solo in SQL.

Ma poiché PL / SQL è un'estensione del fornitore, avrà parti linguistiche che altri fornitori potrebbero non supportare.


3
Direi che PL / SQL è uno standard di fatto, mentre SQL è uno standard di diritto :-)
Gaius

3
@Gaius e da quella sola affermazione indovinerei due cose: sei uno sviluppatore di ORA e pensi che TSQL sia solo disordinato: p
jcolebrand

@jcolebrand Il mio primo lavoro DBA è stato in realtà su Sybase, ma hai ragione, attualmente lavoro principalmente con Oracle. Sarei abbastanza felice se potessi scrivere T-SQL o PL / SQL su entrambi i database, ma le lingue riflettono le loro piattaforme (ad esempio T-SQL è come è perché i cursori e i blocchi sono costosi in SQL Server e nei suoi discendenti , e PL / SQL è il modo in cui è stato perché qualcuno alla Oracle ha lavorato per l'ultima volta al DoD) :-)
Gaius,

@Gaius Ah, sì, la vecchia discussione sugli standard è così buona perché ce ne sono così tante tra cui scegliere. Penso che sia buono indicare che SQL è uno "standard" e che PL / SQL è proprietario quindi +1 @jcolebrand.
ScottCher,

@ScottCher ~ Grazie per quello. Mi sento stupido dicendo che è uno standard perché non esiste (afaik) un organismo di standard che lo sigilli con un sigillo di approvazione e gli dia un numero. Ma è ben definito e concordato. ;)
jcolebrand
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.