Sql - Lecția 15

Pagina principală → → Lecțiile învățate din procedurile SQL memorate Lecția 15.. Crearea, utilizarea și eliminare.

De regulă, lucrăm cu baza de date folosind aceleași cereri sau un set de interogări succesive. Procedurile memorate vă permit să combinați o secvență de interogări și salvați-le pe server. Acesta este un instrument foarte convenabil, iar acum vei vedea pentru tine. Să începem cu sintaxa:

CREATE PROCEDURA procedure_name (parametri) începe să se încheie declarații

Parametrii este datele pe care le transfera procedura cand este chemat, iar operatorii - are nevoie de fapt. Să scrie o primă procedură și să verifice posibilitățile de utilizare. În lecția 10, când vom adăuga înregistrări noi la magazin de baze de date, am folosit cererea standard pentru adăugarea de specii:

INSERT INTO clienți (nume, e-mail) VALUE ( 'Ivanov, Serghei', '[email protected]');

pentru că o astfel de cerere, vom folosi de fiecare dată când vom avea nevoie pentru a adăuga un nou client, este necesar să-l formalizeze într-o procedură:

CREATE PROCEDURA ins_cust (n CHAR (50), e CHAR (50)) începe să inserați în clienți (nume, e-mail) valoarea (n, e); capăt

Observați modul în care definim: este necesar să se dea numele parametrului și specificați tipul său, precum și tratamente corporale folosim deja numele parametrilor. Un avertisment. După cum vă amintiți, o virgulă marchează sfârșitul interogării și trimite-l pentru a efectua, care în acest caz este inacceptabil. De aceea, înainte de a scrie o procedură este necesară pentru a redefini separatorul cu; pe „//“ pentru a solicita să nu trimită înainte de timp. Acest lucru se face cu ajutorul DELIMITER // operatorul.

Astfel, vom specifica baza de date pe care ar trebui să fie acum pentru a executa comenzi după //. Trebuie amintit faptul că redefinirea separatorului este doar o sesiune de lucru, și anume, data viitoare când lucrați cu MySql separator va fi din nou cu punct și virgulă, și, dacă este necesar, acesta va trebui să redefinească din nou. Acum puteți plasa procedura dumneavoastră:

CREATE PROCEDURA ins_cust (n CHAR (50), e CHAR (50)) începe să inserați în clienți (nume, e-mail) valoarea (n, e); end //

Astfel, se stabilește procedura. Acum, când avem nevoie să introducem un nou client, pur și simplu, o numim prin specificarea parametrilor necesari. Pentru a apela o procedură utilizată instrucțiuni CALL stocate. urmat de numele procedurii și parametrii săi. Să adăugăm un nou cumpărător pentru cumpărătorii noștri de masă (clienți):

numesc ins_cust ( 'Sychov Valery', '[email protected]') //

Sunt de acord că este atât de mult mai ușor decât scris, de fiecare dată când o anchetă completă. Verificați pentru a vedea dacă o procedură, a se vedea dacă un nou cumpărător a venit de funcționare în tabelul Cumpărători (clienți):

Ea a apărut, procedura funcționează și va funcționa întotdeauna, atâta timp cât nu eliminăm folosind nazvanie_protsedury DROP PROCEDURE.

După cum sa menționat la începutul lecției, procedura permite să combine o secvență de interogări. Să vedem cum se face. Amintiți-vă în lecția 11, ne-am dorit să aflăm cât de mult ne-am adus produsele furnizor „Print House“? Pentru a face acest lucru, a trebuit să folosim interogări imbricate, asociere, coloane calculate și puncte de vedere. Și dacă vrem să aflăm cât de mult ne-am adus mărfurile la un alt furnizor? Va trebui să facă noi cereri, asociații, etc. Pur și simplu o dată pentru a scrie o procedură stocată pentru această acțiune.

S-ar părea că cel mai simplu mod de a lua o pre-scris în prezentarea lecția 11 și o cerere să-i să combine procedura stocată și de a face parametrul de intrare furnizor de identitate (id_vendor), astfel:

CREATE PROCEDURA sum_vendor (i INT) începe CREATE VIEW report_vendor AS SELECT magazine_incoming.id_product, magazine_incoming.quantity, prices.price, magazine_incoming.quantity * prices.price AS summa DIN magazine_incoming, prețurile UNDE magazine_incoming.id_product = prices.id_product AND id_incoming = ( SELECT id_incoming FROM intrare WHERE id_vendor = i); SELECT SUM (summa) DIN report_vendor; end //

Dar, pentru că procedura nu funcționează. Problema este că nu parametri pot fi utilizați în vederi. Deci, avem de a schimba ordinea de câteva interogări. În primul rând, vom crea o vizualizare care va afișa ID-ul distribuitorului (id_vendor), ID-ul produsului (id_product), numărul (cantitatea), prețul (prețul) și suma (summa) din cele trei tabele de alimentare (intrare), revista de alimentare (magazine_incoming), Preț ( prețurile):

CREATE VIEW report_vendor AS SELECT incoming.id_vendor, magazine_incoming.id_product, magazine_incoming.quantity, prices.price, magazine_incoming.quantity * prices.price AS summa DIN intrare, magazine_incoming, prețurile UNDE magazine_incoming.id_product = prices.id_product ȘI magazine_incoming.id_incoming = intrare .id_incoming;

Și apoi a crea o interogare care va rezuma valoarea ofertei de interes pentru noi furnizorului, de exemplu, id_vendor = 2:

SUM SELECT (summa) DIN report_vendor UNDE id_vendor = 2;

Acum putem combina cele două interogare într-o procedură stocată, în cazul în care parametrul de intrare este furnizorul de identitate (id_vendor), care va fi înlocuit de a doua solicitare, dar nu și în punctul de vedere:

CREATE PROCEDURA sum_vendor (i INT) începe CREATE VIEW report_vendor AS SELECT incoming.id_vendor, magazine_incoming.id_product, magazine_incoming.quantity, prices.price, magazine_incoming.quantity * prices.price AS summa DIN intrare, magazine_incoming, prețuri, în cazul magazine_incoming.id_product = prețurile .id_product ȘI magazine_incoming.id_incoming = incoming.id_incoming; SELECT SUM (summa) DIN report_vendor UNDE id_vendor = i; end //

Verificați funcționarea procedurii, cu intrări diferite:

numesc sum_vendor (1) // numesc sum_vendor (2) // numesc sum_vendor (3) //

După cum puteți vedea, procedura este activată o singură dată și apoi afișează un mesaj de eroare spunându-ne că există deja report_vendor reprezentare în baza de date. Acest lucru se întâmplă pentru că atunci când se referă la procedura pentru prima dată, se creează o imagine. Atunci când apelați pentru a doua oară, ea încearcă din nou, pentru a crea o imagine, dar este deja acolo, și așa există o eroare. Pentru a evita această problemă în două moduri.

În primul rând - a face o prezentare a procedurii. Adică, odată ce vom crea o vizualizare, iar procedura se va aplica numai la ea, dar nu-l creează. Pre uitați să eliminați procedurile și performanțele deja create:

DROP PROCEDURA DE sum_vendor // DROP VIEW report_vendor // CREATE VIEW report_vendor AS incoming.id_vendor SELECT, magazine_incoming.id_product, magazine_incoming.quantity, prices.price, magazine_incoming.quantity * prices.price AS summa DIN intrare, magazine_incoming, prețurile UNDE magazine_incoming.id_product = prices.id_product AND magazine_incoming.id_incoming = incoming.id_incoming // CREATE PROCEDURA sum_vendor (i INT) începe SELECT SUM (summa) DIN report_vendor UNDE id_vendor = i; end //

numesc sum_vendor (1) // numesc sum_vendor (2) // numesc sum_vendor (3) //

A doua opțiune - direct în procedura pentru a adăuga o comandă care va șterge ecranul dacă există:

CREATE PROCEDURA sum_vendor (i INT) începe DROP VIEW dacă există report_vendor; CREATE VIEW report_vendor AS SELECT incoming.id_vendor, magazine_incoming.id_product, magazine_incoming.quantity, prices.price, magazine_incoming.quantity * prices.price AS summa DIN intrare, magazine_incoming, prețurile UNDE magazine_incoming.id_product = prices.id_product ȘI magazine_incoming.id_incoming = intrare .id_incoming; SELECT SUM (summa) DIN report_vendor UNDE id_vendor = i; end //

Înainte de a utiliza această opțiune, asigurați-vă că pentru a elimina procedura sum_vendor, și apoi verificați operația:

După cum puteți vedea, interogări complexe sau o secvență de foarte ușor odată ce a făcut într-o procedură stocată, și apoi pur și simplu se referă la ea, indicând parametrii necesari. Acest lucru reduce semnificativ codul și face cereri mai logic.

În cazul în care acest site a fost util pentru tine, vă poate ajuta în dezvoltarea sa prin punerea una dintre aceste link-uri către site-ul tau.

articole similare