dynamic SQL este o tehnică de programare care vă permite să construiți declarații SQL dinamic în timpul rulării. Puteți crea aplicații mai flexibile, cu scop general, utilizând SQL dinamic, deoarece textul complet al unei instrucțiuni SQL poate fi necunoscut la compilare. De exemplu, SQL dinamic vă permite să creați o procedură care funcționează pe un tabel al cărui nume nu este cunoscut până la runtime.,Oracle include două moduri de a implementa SQL dinamic într-o aplicație PL/SQL:
- SQL dinamic nativ, unde plasați instrucțiuni SQL dinamice direct în blocuri PL/SQL.
- apelarea procedurilor în pachetul
DBMS_SQL
.
acest capitol acoperă următoarele subiecte:
- „ce este SQL dinamic?”
- ” De ce să folosiți SQL dinamic?,”
- „Un SQL Dinamic Scenariu Folosind SQL Dinamic Nativ”
- „Alegerea Între Nativ SQL Dinamic și Pachetul DBMS_SQL”
- „Folosind SQL Dinamic în Alte Limbi Decât PL/SQL”
- „Folosind PL/SQL Înregistrări în SQL INSERT și UPDATE Declarații”
puteți găsi detalii despre DBMS_SQL
pachetul în Oracle9i Furnizate PL/SQL Pachete și Tipuri Referință.
ce este SQL dinamic?
dynamic SQL vă permite să scrieți programe care fac referință la instrucțiunile SQL al căror text complet nu este cunoscut până la runtime., Înainte de a discuta SQL dinamic în detaliu, o definiție clară a SQL static poate oferi un bun punct de plecare pentru înțelegerea SQL dinamic. Declarațiile SQL statice nu se schimbă de la execuție la execuție. Textul complet al declarațiilor SQL statice sunt cunoscute la compilare, care oferă următoarele beneficii:
- compilarea de succes verifică dacă declarațiile SQL referință obiecte de bază de date valide.
- compilarea cu succes verifică dacă privilegiile necesare sunt în vigoare pentru a accesa obiectele bazei de date.,
- performanța SQL static este, în general, mai bună decât SQL dinamic.din cauza acestor avantaje, ar trebui să utilizați SQL dinamic numai dacă nu puteți utiliza SQL static pentru a vă atinge obiectivele sau dacă utilizarea SQL static este greoaie în comparație cu SQL dinamic. Cu toate acestea, SQL static are limitări care pot fi depășite cu SQL dinamic. Este posibil să nu cunoașteți întotdeauna textul complet al instrucțiunilor SQL care trebuie executate într-o procedură PL/SQL., Programul dvs. poate accepta introducerea utilizatorului care definește instrucțiunile SQL de executat sau poate fi necesar ca programul dvs. să finalizeze unele lucrări de procesare pentru a determina cursul corect de acțiune. În astfel de cazuri, ar trebui să utilizați SQL dinamic.
de exemplu, este posibil ca o aplicație de raportare dintr-un mediu data warehouse să nu cunoască numele exact al tabelului până la momentul rulării., Aceste tabele ar putea fi numit în funcție la început de lună și an de trimestru, de exemplu
INV_01_1997
,INV_04_1997
,INV_07_1997
,INV_10_1997
,INV_01_1998
, și așa mai departe. Puteți utiliza SQL dinamic în aplicația de raportare pentru a specifica numele tabelului în timpul rulării.De asemenea, este posibil să doriți să rulați o interogare complexă cu o ordine de sortare selectabilă de utilizator., În loc de codificare interogare de două ori, cu diferite
ORDER BY
clauze, puteți construi interogare dinamic pentru a include o anumităORDER BY
clauză.programele SQL dinamice pot gestiona modificările definițiilor de date, fără a fi necesară recompilarea. Acest lucru face SQL dinamic mult mai flexibil decât SQL static. SQL dinamic vă permite să scrie cod reutilizabile, deoarece SQL poate fi ușor adaptat pentru diferite medii..,dinamic SQL, de asemenea, vă permite să execute date definition language (DDL) declarații și alte declarații SQL care nu sunt acceptate în programe SQL pur statice.de ce să folosiți SQL dinamic?
ar trebui să utilizați SQL dinamic în cazurile în care SQL static nu acceptă operația pe care doriți să o efectuați sau în cazurile în care nu cunoașteți instrucțiunile SQL exacte care trebuie executate printr-o procedură PL/SQL. Aceste instrucțiuni SQL pot depinde de introducerea utilizatorului sau pot depinde de procesarea lucrărilor efectuate de program.,DL and SCL Statements in PL/SQL
In PL/SQL, you can only execute the following types of statements using dynamic SQL, rather than static SQL:
- Data definition language (DDL) statements, such as
CREATE
,DROP
,GRANT
, andREVOKE
- Session control language (SCL) statements, such as
ALTER
SESSION
andSET
ROLE
See Also:Oracle9i SQL Reference for information about DDL and SCL statements.,de asemenea, puteți utiliza numai clauza
TABLE
în instrucțiuneaSELECT
prin SQL dinamic. De exemplu, următoarele PL/SQL bloc conține unSELECT
declarație care utilizeazăTABLE
clauză și nativ SQL dinamic:de Executare Interogări Dinamice
puteți utiliza SQL dinamic pentru a crea aplicații care executa interogări dinamice, al cărui text integral nu este cunoscut până la execuție., Mai multe tipuri de aplicații, trebuie să utilizați interogări dinamice, inclusiv:
- Aplicații care permit utilizatorilor să introducă sau alege interogare de căutare sau de sortare criterii la runtime
- Aplicații care permit utilizatorilor să introducă sau alege optimizare aluzii la timp a alerga
- Aplicații care interoga o bază de date în care datele definiții din tabele sunt în continuă schimbare
- Aplicații care interoga o bază de date în cazul în care noi tabele sunt create de multe ori
Pentru exemple, a se vedea „Interogarea Folosind SQL Dinamic: Exemplu”, și a vedea exemple de interogare într-Un „SQL Dinamic Scenariu Folosind SQL Dinamic Nativ”.,
referențierea obiectelor bazei de date care nu există la compilare
multe tipuri de aplicații trebuie să interacționeze cu datele generate periodic. De exemplu, este posibil să cunoașteți definițiile tabelelor la momentul compilării, dar nu și numele tabelelor.SQL dinamic poate rezolva această problemă, deoarece vă permite să așteptați până la runtime pentru a specifica numele tabelelor. De exemplu, în aplicația exemplu data warehouse discutată în „ce este SQL dinamic?”, noi tabele sunt generate în fiecare trimestru, iar aceste tabele au întotdeauna aceeași definiție., Puteți lăsa un utilizator să specifice numele tabelului în timpul rulării cu o interogare SQL dinamică similară cu următoarea:
optimizarea dinamică a execuției
puteți utiliza SQL dinamic pentru a construi o instrucțiune SQL într-un mod care optimizează execuția prin concatenarea sugestiilor într-o instrucțiune SQL dinamic. Acest lucru vă permite să modificați indicii bazate pe statisticile bazei de date curente, fără a necesita recompilare.,
De exemplu, următoarea procedură folosește o variabilă numită
a_hint
pentru a permite utilizatorilor să treacă un indiciu opțiunea de aSELECT
declarație:În acest exemplu, utilizatorul poate trece la oricare dintre următoarele valori pentru
a_hint
:a_hint = '/*+ ALL_ROWS */'
a_hint = '/*+ FIRST_ROWS */'
a_hint = '/*+ CHOOSE */'
sau orice alte valabilă opțiunea de indiciu.A se vedea, de asemenea:Oracle9i baza de date Ghid de performanță și de referință pentru mai multe informații despre utilizarea indicii.,
de Executare Dinamic PL/SQL Blocuri
puteți folosi
EXECUTE
IMMEDIATE
declarație să execute anonim PL/SQL blocuri. Puteți adăuga flexibilitate prin construirea conținutului blocului în timpul rulării.de exemplu, să presupunem că ythroughthrough doriți să scrieți o aplicație care ia un număr de eveniment și expediază către un handler pentru eveniment. Numele handler este în formă
EVENT_HANDLER_
event_num, unde event_num este numărul de eveniment., O abordare este de a pune în aplicare dispecer ca o declarație comutator, în cazul în care codul se ocupă de fiecare eveniment prin efectuarea unui apel static la handler corespunzătoare. Acest cod nu este foarte extensibil, deoarece codul dispecerului trebuie actualizat ori de câte ori se adaugă un handler pentru un nou eveniment.,folosind SQL dinamic nativ, puteți scrie un dispecer de evenimente mai mic, mai flexibil, similar cu următoarele:efectuarea operațiunilor dinamice folosind Invoker-Rights
folosind caracteristica invoker-rights cu SQL dinamic, puteți construi aplicații care emite instrucțiuni SQL dinamice sub privilegiile și schema invoker. Aceste două caracteristici, invoker-rights și dynamic SQL, vă permit să construiți subcomponente de aplicații reutilizabile care pot funcționa și accesa datele și modulele invoker.,
A se vedea, de asemenea:PL / SQL Ghidul utilizatorului și de referință pentru informații despre utilizarea invokers-drepturi și SQL dinamic nativ.,
Un SQL Dinamic Scenariu Folosind SQL Dinamic Nativ
Acest scenariu vă arată cum să efectuați următoarele operații folosind SQL dinamic nativ:
- Executa DDL și DML operațiunile
- Executa singur rând și rând mai multe întrebări
date în acest scenariu este o companie de resurse umane baza de date (nume
hr
) cu următorul model de date:Un maestru tabel numit
offices
conține lista cu toate locatiile companiei.,offices
tabel are următoarea definiție:Column Name Null? Type LOCATION NOT_NULL VARCHAR2(200)
mai Multe
emp_
locație tabele conțin informații angajat, în cazul în care locația este numele orașului în cazul în care biroul este situat. De exemplu, un tabel numitemp_houston
conține informații angajat pentru compania Houston birou, în timp ce un tabel numitemp_boston
conține informații angajat pentru compania Boston.,Fiecare
emp_
locație tabel are următoarea definiție:următoarele secțiuni descriu diverse nativ SQL dinamic operațiunile care pot fi efectuate asupra datelor din
hr
baza de date.Eșantion DML Operație Folosind SQL Dinamic Nativ
următoarele nativ SQL dinamic procedură oferă o mărire de salariu pentru toți angajații cu un anumit titlu job:
Eșantion DDL Operație Folosind SQL Dinamic Nativ
EXECUTE IMMEDIATE
declarație poate efectua DDL operațiuni., De exemplu, următoarea procedură adaugă un birou locație:următoarea procedură șterge o locație birou:
Probă de un Singur Rând de Interogare Folosind SQL Dinamic Nativ
EXECUTE
IMMEDIATE
declarație poate efectua dinamic cu un singur rând de interogări. Puteți specifica lega variabile înUSING
clauză și aduce rezultate rând în țintă specificate înINTO
clauza de declarație.,următoarele funcții preia numărul de angajați la o anumită locație efectuează o anumită muncă:
Eșantion mai Multe Rânduri de Interogare Folosind SQL Dinamic Nativ
OPEN-FOR
,FETCH
șiCLOSE
declarații pot efectua dinamice multiple-row interogări., De exemplu, procedura următoare listează toți angajații cu un anumit loc de muncă la o locație specificată:Alegerea Între Nativ SQL Dinamic și Pachetul DBMS_SQL
Oracle oferă două metode pentru utilizarea dinamice SQL în PL/SQL: SQL dinamic nativ și
DBMS_SQL
pachet. SQL dinamic nativ vă permite să plasați declarații SQL dinamice direct în PL / cod SQL. Aceste declarații dinamice includ declarații DML( inclusiv interogări), blocuri anonime PL/SQL, declarații DDL, declarații de control al tranzacțiilor și declarații de control al sesiunii.,To process most native dynamic SQL statements, you use the
EXECUTE
IMMEDIATE
statement. To process a multi-row query (SELECT
statement), you useOPEN-FOR
,FETCH
, andCLOSE
statements.Note:To use native dynamic SQL, the
COMPATIBLE
initialization parameter must be set to 8.1.0 or higher. See Oracle9i Database Migration for more information about theCOMPATIBLE
parameter.,DBMS_SQL
pachetul este o bibliotecă PL / SQL care oferă un API pentru a executa instrucțiuni SQL dinamic. PachetulDBMS_SQL
are proceduri pentru a deschide un cursor, a analiza un cursor, a lega alimentarea și așa mai departe. Programele care utilizează pachetulDBMS_SQL
efectuează apeluri către acest pachet pentru a efectua operații SQL dinamice.următoarele secțiuni oferă informații detaliate despre avantajele ambelor metode.,Vezi de Asemenea și:PL/SQL Ghidul Utilizatorului și de Referință pentru informații detaliate despre utilizarea SQL dinamic nativ și Oracle9i Furnizate PL/SQL Pachete și Tipuri Referință pentru informații detaliate despre utilizarea
DBMS_SQL
pachet. În ghidul și referința utilizatorului PL/SQL, SQL dinamic nativ este denumit pur și simplu SQL dinamic.,Avantajele oferite de SQL Dinamic Nativ
SQL dinamic Nativ oferă următoarele avantaje față de
DBMS_SQL
ambalaj:Nativ SQL Dinamic este Ușor de Utilizat
Pentru nativ SQL dinamic este integrat cu SQL, puteți să-l utilizați în același mod în care utilizați SQL static în termen de cod PL/SQL. Codul SQL dinamic nativ este de obicei mai compact și mai ușor de citit decât codul echivalent care utilizează pachetul
DBMS_SQL
.,cu pachetulDBMS_SQL
trebuie să apelați multe proceduri și funcții într-o secvență strictă, făcând chiar și operații simple necesită mult cod. Puteți evita această complexitate utilizând SQL dinamic nativ în schimb.tabelul 8-1 ilustrează diferența dintre cantitatea de cod necesară pentru a efectua aceeași operație folosind pachetul
DBMS_SQL
și SQL dinamic nativ.,Tabelul 8-1 Cod Comparație a Pachetului DBMS_SQL și Nativ SQL Dinamic
Nativ SQL Dinamic este mai Rapid decât DBMS_SQL
Nativ dinamic SQL în PL/SQL efectuează relativ la performanța de SQL static, deoarece PL/SQL interpret a construit-in-suport pentru ea. Programele care utilizează SQL dinamic nativ sunt mult mai rapide decât programele care utilizează pachetul
DBMS_SQL
. De obicei, declarațiile SQL dinamice native efectuează apeluri de 1,5 până la 3 ori mai bune decât echivalentulDBMS_SQL
. (Câștigurile dvs. de performanță pot varia în funcție de aplicația dvs.,)SQL dinamic nativ grupează pregătirea instrucțiunii, legarea și pașii de execuție într-o singură operație, care minimizează copierea datelor și procedura de apel deasupra capului și îmbunătățește performanța.
DBMS_SQL
pachetul se bazează pe un API procedural și suportă apeluri de proceduri ridicate și copierea datelor deasupra capului. De fiecare dată când legați o variabilă, pachetulDBMS_SQL
copiază variabila PL/SQL bind în spațiul său pentru a fi utilizată în timpul execuției., De fiecare dată când executați o aduce, datele sunt copiate în spațiul gestionat deDBMS_SQL
pachet și apoi preluat de date este copiat, o coloană la un moment dat, în caz PL/SQL variabile, rezultând în regie substanțiale.sfat de performanță: utilizarea variabilelor Bind
când utilizați fie SQL dinamic nativ, fie pachetul
DBMS_SQL
, puteți îmbunătăți performanța folosind variabile bind, deoarece variabilele bind permit Oracle să partajeze un singur cursor pentru mai multe instrucțiuni SQL.,de exemplu, următorul cod SQL dinamic nativ nu utilizează variabile bind:
pentru fiecare variabilă distinctă
my_deptno
, este creat un nou cursor, provocând dispută de resurse și performanțe slabe. În schimb, se leagămy_deptno
ca o lega variabile:Aici, la fel cursorul este refolosite pentru diferite valori ale bind
my_deptno
, îmbunătățirea performanței și scalabilty.,SQL dinamic nativ suportă tipuri definite de utilizatorSQL dinamic nativ suportă toate tipurile acceptate de SQL static în PL / SQL, inclusiv tipuri definite de utilizator, cum ar fi obiecte definite de utilizator, colecții, și
REFs
. PachetulDBMS_SQL
nu acceptă aceste tipuri definite de utilizator.Notă:DBMS_SQL
pachetul oferă suport limitat pentru matrice. A se vedea Oracle9i furnizate PL/SQL pachete și tipuri de referință pentru informații.,SQL dinamic nativ acceptă preluarea în înregistrări
SQL dinamic nativ și SQL static ambele acceptă preluarea în înregistrări, dar
DBMS_SQL
pachetul nu. Cu SQL dinamic nativ, rândurile rezultate dintr-o interogare pot fi preluate direct în înregistrări PL/SQL.,În exemplul următor, rânduri dintr-o interogare sunt preluate în
emp_rec
record:Avantaje ale Pachetului DBMS_SQL
DBMS_SQL
pachet oferă următoarele avantaje față de nativ SQL dinamic:DBMS_SQL este Susținută în Parte de Client Programe
DBMS_SQL
pachetul este susținută în parte de client programe, dar nativ SQL dinamic nu este., Fiecare apel către pachetulDBMS_SQL
din programul client-side se traduce printr-un apel de procedură la distanță PL/SQL (RPC); aceste apeluri apar atunci când trebuie să legați o variabilă, să definiți o variabilă sau să executați o instrucțiune.DBMS_SQL Sprijină DESCRIE
DESCRIBE_COLUMNS
procedura înDBMS_SQL
pachet poate fi folosit pentru a descrie coloanele pentru un cursor deschis și analizat prinDBMS_SQL
. Această caracteristică este similară cu comandaDESCRIBE
din SQL * Plus., SQL dinamic nativ nu are unDESCRIBE
facilitate.DBMS_SQL Suportă mai Multe rânduri Actualizări și Șterge cu un REVENIND Clauza
DBMS_SQL
pachet acceptă declarații cu unRETURNING
clauză care a actualiza sau a șterge mai multe rânduri. SQL dinamic nativ acceptă doar o clauzăRETURNING
dacă un singur rând este returnat.,See Also:„Performing DML with RETURNING Clause Using Dynamic SQL: Example” for examples of
DBMS_SQL
package code and native dynamic SQL code that uses aRETURNING
clause.DBMS_SQL Supports SQL Statements Larger than 32KB
The
DBMS_SQL
package supports SQL statements larger than 32KB; native dynamic SQL does not.DBMS_SQL Lets You Reuse SQL Statements
The
PARSE
procedure in theDBMS_SQL
package parses a SQL statement once., După parsarea inițială, puteți utiliza instrucțiunea de mai multe ori cu diferite seturi de argumente bind.SQL dinamic nativ pregătește o instrucțiune SQL de fiecare dată când instrucțiunea este utilizată, care implică de obicei parsarea, optimizarea și generarea planului. Deși operațiunile suplimentare de pregătire suportă o penalizare mică de performanță, încetinirea este de obicei depășită de beneficiile de performanță ale SQL dinamic nativ.,Exemple de DBMS_SQL Pachet de Cod și SQL Dinamic Nativ Cod
următoarele exemple ilustrează diferențele în codul necesar pentru a finaliza operațiunile cu
DBMS_SQL
pachet și SQL dinamic nativ. În mod special, următoarele tipuri de exemple sunt prezentate:- O interogare
- UN DML de funcționare
- UN DML revenind funcționare
În general, nativ SQL dinamic codul este mai ușor de citit și compact, care poate îmbunătăți producător de productivitate.,
Interogarea Folosind SQL Dinamic: Exemplu
următorul exemplu include o interogare dinamic declarație cu o leagă variabila (
:jobname
) și două selectați coloane (ename
șisal
):stmt_str := 'SELECT ename, sal FROM emp WHERE job = :jobname';
Acest exemplu interogări pentru angajații cu descrierea de locuri de muncă
SALESMAN
înjob
coloana deemp
masă. Tabelul 8-2 arată codul eșantion care realizează această interogare folosindDBMS_SQL
pachet și SQL dinamic nativ.,Tabelul 8-2 Interogarea Folosind Pachetul DBMS_SQL și Nativ SQL Dinamic
Efectuarea DML Folosind SQL Dinamic: Exemplu
următorul exemplu include o dinamică
INSERT
declarație pentru un tabel cu trei coloane:stmt_str := 'INSERT INTO dept_new VALUES (:deptno, :dname, :loc)';
Acest exemplu inserează un rând nou pentru care valorile coloanelor sunt în PL/SQL variabile
deptnumber
,deptname
șilocation
. Tabelul 8-3 arată codul eșantion care realizează această operație DML folosindDBMS_SQL
pachet și SQL dinamic nativ.,Tabel 8-3 DML Funcționării cu Ajutorul Pachetului DBMS_SQL și Nativ SQL Dinamic
Efectuarea DML cu REVENIREA Clauza Folosind SQL Dinamic: Exemplu
următorul exemplu folosește o dinamică
UPDATE
declarație pentru a actualiza locația de un departament, apoi se întoarce numele departamentului:stmt_str := 'UPDATE dept_new SET loc = :newloc WHERE deptno = :deptno RETURNING dname INTO :dname';
Tabel 8-4 prezinta mostre de cod care realizează această operație folosind atât
DBMS_SQL
pachet și SQL dinamic nativ.,Tabel 8-4 DML Revenind Funcționării cu Ajutorul Pachetului DBMS_SQL și Nativ SQL Dinamic
Folosind SQL Dinamic în Alte Limbi Decât PL/SQL
Deși în acest capitol se discută PL/SQL suport pentru SQL dinamic, puteți apela SQL dinamic din alte limbi:
- Dacă utilizați C/C++, puteți apela SQL dinamic cu Oracle Call Interface (OCI), sau puteți folosi Pro*C/C++ precompiler pentru a adăuga SQL dinamic extensii la C cod.
- dacă utilizați COBOL, puteți utiliza Pro * COBOL precompiler pentru a adăuga extensii SQL dinamice la codul COBOL.,
- dacă utilizați Java, puteți dezvolta aplicații care utilizează SQL dinamic cu JDBC.dacă aveți o aplicație care utilizează OCI, Pro * C / C++ sau pro * COBOL pentru a executa SQL dinamic, ar trebui să luați în considerare trecerea la SQL dinamic nativ în interiorul procedurilor și funcțiilor stocate PL/SQL. Călătoriile dus-întors în rețea necesare pentru a efectua operații SQL dinamice din aplicațiile din partea clientului ar putea afecta performanța. Procedurile stocate pot locui pe server, eliminând aeriene de rețea., Puteți apela procedurile stocate PL/SQL și funcțiile stocate din aplicația OCI, Pro * C / C++ sau pro * COBOL.,br>Vezi de Asemenea și:
Pentru informații despre apelarea Oracle proceduri stocate și funcții stocate din diverse limbi, se referă la:
- Oracle Call Interface Programmer ‘s Guide
- Pro*C/C++ Precompiler Programmer’ s Guide
- Pro*COBOL Precompiler Programmer ‘ s Guide
- Oracle9i Java Proceduri Stocate Ghidul Dezvoltatorului
, Folosind PL/SQL Înregistrări în SQL INSERT și UPDATE Declarațiile
Deși puteți enumera fiecare domeniu de PL/SQL record de la introducerea sau actualizarea rânduri într-un tabel, codul rezultat nu este deosebit de ușor de citit sau de întreținut., În schimb, puteți utiliza înregistrări PL / SQL direct în aceste declarații. Cea mai convenabilă tehnică este de a declara înregistrarea folosind un atribut %ROWTYPE, astfel încât să aibă exact aceleași câmpuri ca tabelul SQL.deși această tehnică ajută la integrarea mai strânsă a variabilelor PL/SQL și a tipurilor cu declarațiile SQL DML, nu puteți utiliza înregistrările PL / SQL ca variabile bind în declarațiile SQL dinamice.
- Data definition language (DDL) statements, such as
Lasă un răspuns