MySQL saglabātā procedūra pret funkciju, kuru es izmantošu, kad? MySQL saglabātās procedūras

Uzmanību! Šis darbs ir balstīts uz sadaļas “17.1. Saglabātās kārtības un dotāciju tabulas" MySQL 5.0.19 programmatūras apraksts, "Atsauces rokasgrāmata. Tas dokumentē MySQL 5.0–5.0.19. Dokuments izveidots: 2006-01-23 (pārskatīts: 995)"
``Vispirms izlasi visu, tad izmēģini piemērus.''

Saglabātās procedūras ir SQL komandu kopa, ko var apkopot un saglabāt serverī. Tādā veidā klienti var atsaukties uz atbilstošo saglabāto procedūru, nevis saglabāt bieži lietotu vaicājumu. Tas nodrošina labāku veiktspēju, jo dotais pieprasījums ir jāparsē tikai vienu reizi, un tas samazina trafiku starp serveri un klientu. Konceptuālo līmeni var paaugstināt arī, izveidojot serverī funkciju bibliotēku.

Trigeris ir saglabāta procedūra, kas tiek izpildīta, kad notiek konkrēts notikums. Piemēram, varat definēt saglabāto procedūru, kas tiek izpildīta katru reizi, kad ieraksts tiek dzēsts no darījumu tabulas, tādējādi nodrošinot, ka atbilstošais klients tiek automātiski dzēsts no klientu tabulas, kad tiek dzēstas visas tā transakcijas.

Saglabātās programmas (procedūras un funkcijas) tiek atbalstītas MySQL 5.0. Saglabātās procedūras ir SQL izteiksmju kopa, ko var saglabāt serverī. Kad tas ir izdarīts, klientam vairs nav atkārtoti jāpārsūta pieprasījums, bet vienkārši izsauc saglabāto programmu.

Tas var būt noderīgi, ja:

  • Daudzas klientu lietojumprogrammas ir rakstītas dažādās valodās vai darbojas dažādās platformās, taču tām ir jāizmanto viena un tā pati darījumu datu bāze
  • drošība ir pirmajā vietā

Saglabātās procedūras un funkcijas (rutīnas) var nodrošināt labāku veiktspēju, jo starp klientu un serveri ir nepieciešams mazāk informācijas. Izvēle palielina datu bāzes servera slodzi, bet samazina izmaksas klienta pusē. Izmantojiet šo, ja daudzas klientu mašīnas (piemēram, tīmekļa serverus) apkalpo viena vai vairākas datu bāzes.

Saglabātās rutīnas ļauj izmantot arī servera datu bāzē saglabātās funkciju bibliotēkas. Šī funkcija ir paredzēta daudzām mūsdienu programmēšanas valodām, kas ļauj tās izsaukt tieši (piemēram, izmantojot klases).

MySQL ievēro SQL:2003 sintakse saglabātajām procedūrām, kas jau tiek izmantota IBM DB2.

No vārdiem pie darbiem...

Veidojot, modificējot, dzēšot saglabātās rutīnas, serveris manipulē ar mysql.proc tabulu

Sākot ar MySQL 5.0.3, ir nepieciešamas šādas privilēģijas:

IZVEIDOT RUTĪNU lai izveidotu saglabātās procedūras

MAINĪT RUTĪNU nepieciešams mainīt vai dzēst procedūras. Šī privilēģija tiek automātiski piešķirta procedūras (funkcijas) izstrādātājam.

IZPILDĪT apakšprogrammas izpildei būs nepieciešamas privilēģijas. Taču tas automātiski tiek piešķirts procedūras (funkcijas) izveidotājam. Pēc noklusējuma arī SQL SECURITY parametrs DEFINER rutīnai, kas lietotājiem ar piekļuvi datubāzei ļauj izsaukt ar šo datu bāzi saistītās rutīnas.

Saglabāto procedūru un funkciju sintakse

Saglabātā rutīna ir procedūra vai funkcija. Saglabātās rutīnas tiek izveidotas, izmantojot CREATE PROCEDURE vai CREATE FUNCTION priekšrakstus. Saglabātā rutīna tiek izsaukta, izmantojot CALL priekšrakstu, un kā izvades mainīgie tiek izmantoti tikai vērtību atgriežošie mainīgie. Funkciju var izsaukt tāpat kā jebkuru citu funkciju, un tā var atgriezt skalāru vērtību. Saglabātās rutīnas var izsaukt citas saglabātās rutīnas.

Kopš MySQL 5.0.1 ielādētā procedūra vai funkcija ir saistīta ar noteiktu datu bāzi. Tam ir vairākas nozīmes:

  • Kad tiek izsaukta apakšprogramma, nolūks ir izsaukt USE db_name (un izmest datu bāzi, kad apakšprogramma ir pabeigta un datu bāze vairs nav nepieciešama)
  • Parastos vārdus var kvalificēt ar datu bāzes nosaukumu. To var izmantot, lai atsauktos uz rutīnu, kas nav pašreizējā datu bāzē. Piemēram, lai izpildītu saglabāto procedūru p vai funkciju f, kas ir saistīta ar pārbaudes datu bāzi, komandu tulkam varat norādīt šādi: CALL test.p() vai test.f() .
  • Kad datu bāze tiek dzēsta, tiek dzēstas arī visas ar to saistītās ielādētās rutīnas. Programmā MySQL 5.0.0 ielādētās rutīnas ir globālas un nav saistītas ar datu bāzi. Viņi manto noklusējuma datu bāzi no izsaucošā paziņojuma. Ja apakšprogrammas ietvaros tiek veikta USE db_name, sākotnējā pašreizējā datu bāze tiks atjaunota pēc iziešanas no apakšprogrammas (piemēram, pašreizējā datu bāze ir db_11, mēs izsaucam apakšprogrammu, kas izmanto db_22, pēc iziešanas no apakšprogrammas paliek pašreizējā db_11)

MySQL pilnībā atbalsta paplašinājumus, kas ļauj izmantot regulāras SELECT izteiksmes (neizmantojot kursorus vai vietējos mainīgos) saglabātajās procedūrās. No vaicājuma atgrieztā rezultātu kopa tiek vienkārši nosūtīta tieši klientam. Vairāki SELECT vaicājumi ģenerē vairākas rezultātu kopas, tāpēc klientam ir jāizmanto bibliotēka, kas atbalsta vairākas rezultātu kopas.

IZVEIDOT PROCEDŪRU- izveidot saglabātu procedūru.

IZVEIDOT FUNKCIJU- izveidot saglabātu funkciju.

Sintakse:

IZVEIDOT PROCEDŪRU procedūras_nosaukums ([procedūras_parametrs[,...]])
[īpašības...] apakšprogramma_body

IZVEIDOT FUNKCIJU funkcijas_nosaukums ([funkcijas_parametrs[,...]])
ATGRIEZ veids
[raksturīgs...] apakšprogrammas_ķermenis

procedura_parameter:
[ IN | ĀRĀ | IEKŠĀ ĀRĀ] parametra_nosaukuma veids
function_parameter:
parametra_nosaukuma veids

veids:
Jebkurš MySQL datu tips

raksturīgs:
VALODA SQL
| DETERMINISTISKS
| ( SATUR SQL | NAV SQL | NOLAS SQL DATU | MODIFICĒ SQL DATU )
| SQL DROŠĪBA (DEFINER | INVOKER)
| KOMENTĒT "virkne"

subroutine_body:
Pareiza SQL izteiksme.

Apskatīsim visu praksē.

Vispirms izveidosim saglabātu procedūru ar šādu vaicājumu:

IZVEIDOT PROCEDŪRU "my_proc"(OUT t INTEGER(11))
NAV DETERMINISTISKS
SQL DROŠĪBAS INVOKER
KOMENTĒT ""
SĀKT
atlasiet val1+val2 uz "t" no `mans` LIMIT 0,1;
BEIGAS;

Izteiksme LIMIT šajā vaicājumā tiek izmantota, atzīstot faktu, ka ne katrs klients spēj pieņemt vairāku rindu rezultātu kopu.

Pēc tam sauksim to:

CALL my_proc(@a);
SELECT @a;

Lai atdalītu iekšējo pieprasījumu no ārējā, vienmēr tiek izmantots atdalītājs, kas atšķiras no parastā (uzdevumam izmantojiet komandu DELIMITER <строка/символ>)

Šeit ir vēl viens piemērs, kurā ņemtas vērā visas prasības.

Mysql> norobežotājs //
mysql> IZVEIDOT PROCEDŪRU simpleproc (OUT param1 INT)
-> SĀKT
-> SELECT COUNT(*) INTO param1 FROM t;
->BEIGAS;
-> //

mysql>atdalītājs;
mysql> CALL simpleproc(@a);
Vaicājums OK, ietekmētas 0 rindas (0,00 sek)
mysql> SELECT @a;
+------+
| @a |
+------+
| 3 |
+------+
1 rinda komplektā (0,00 s)

Visu procesu var novērot zemāk esošajā attēlā:

Trigeri

Trigeru atbalsts ir pieejams MySQL kopš versijas 5.0.2.

Sprūda- datu bāzes objekts ar nosaukumu, kas ir saistīts ar tabulu un tiek aktivizēts, kad notiek noteikts notikums, notikums, kas saistīts ar šo tabulu.

Piemēram, tālāk norādītais kods izveido tabulu un INSERT aktivizētāju. Trigeris summē vērtības, kas ievietotas vienā no tabulas kolonnām.

Mysql> CREATE TABLE konts (act_num INT, summa DECIMAL(10,2));
Vaicājums ir OK, ietekmētas 0 rindas (0,03 sek)
mysql> CREATE TRIGGER ins_sum PIRMS IEVADĪŠANAS kontā
-> KATRAM RINDAS IESTATĪJUMS @sum = @sum + NEW.amount;
Vaicājums ir OK, ietekmētas 0 rindas (0,06 sek)

Deklarēsim mainīgo summu un piešķirsim tai vērtību 1. Pēc tam katru reizi ievietojam tabulā kontsšī mainīgā vērtība palielināsies atbilstoši ievietotajai daļai.

komentēt. Ja mainīgā vērtība nav inicializēta, trigeris nedarbosies!

Sintakse trigera izveidei

IZVEIDOT

TRIGERIS trigera_nosaukums trigera_laiks trigera_notikums
ON tabulas_nosaukums KATRAI RINDAI izteiksme_izpildīta_kad_trigger_fires

Ja ar trigera nosaukumu un lietotājvārdu viss ir skaidrs uzreiz, tad par “aktivizēšanas laiku” un “notikumu” runāsim atsevišķi.

trigger_time

Definē laiku, kurā notiek sprūda darbība. BEFORE nozīmē, ka aktivizētājs tiks izpildīts pirms aktivizētāja notikuma pabeigšanas, un AFTER nozīmē pēc. Piemēram, ievietojot ierakstus (skatiet piemēru iepriekš), mūsu trigeris tika aktivizēts pirms faktiskās ieraksta ievietošanas un aprēķināja summu. Šī opcija ir piemērota, iepriekš aprēķinot dažus papildu laukus tabulā vai paralēli ievietojot citā tabulā.

trigger_event

Šeit viss ir vienkāršāk. Tas skaidri norāda, kurā notikumā tiek izpildīts sprūda.

  • IEVIETOT: t.i. ievietošanas darbību vai līdzīgu izteiksmju laikā (INSERT, LOAD DATA un REPLACE)
  • UPDATE: kad entītija (rinda) tiek modificēta
  • DZĒST: kad ieraksts tiek dzēsts (vaicājumi, kas satur DELETE un/vai REPLACE priekšrakstus)

1. definīcija

Saglabātā procedūra ir neatkarīga programmatūras koda daļa, kas tiek izveidota un saglabāta MySQL datu bāzē.

Saglabāta procedūra var ietvert SQL paziņojumus un īpašas vadības struktūras. Noder, ja viena un tā pati funkcija ir jāveic no dažādām lietojumprogrammām vai platformām, vai kā līdzeklis funkcionalitātes slēpšanai. Datubāzē saglabātās procedūras tiek uzskatītas par analogām objektorientētai pieejai programmēšanā. Saglabātās procedūras var izmantot, lai kontrolētu, kā tiek piekļūts datiem.

Saglabātās procedūras izveide

Izveidosim procedūru ar nosaukumu GetAllProducts(), lai no tabulas iegūtu visu produktu sarakstu.

Lai to izdarītu, jums ir nepieciešams lejupielādēt mysql klientu un palaist šādas komandas:

Komanda DELIMITER // nav iekļauts uzglabātajās procedūrās. DELIMITER ir īpaša komanda, kas maina standarta vaicājuma atdalītāju (noklusējuma ";") uz to, kas norādīts pēc tās. Ar šo komandu mēs to mainīsim uz 2 slīpsvītrām (//).

Ja nemainīsit norobežotāju, mysql nepareizi interpretēs procedūru un radīs kļūdu. Pēc END tiek izmantots // norobežotājs, un komanda DELIMITER atgriež atdalītāja ";" vērtību.

Rezervētie vārdi CREATE PROCEDURE liek mysql IZVEIDOT PROCEDŪRU. Pēc šiem vārdiem jānorāda saglabātās procedūras nosaukums (piemērā GetAllProducts). Tukšas iekavas "()" aiz procedūras nosaukuma nozīmē, ka procedūra nepieņem nevienu mainīgo.

Komandas BEGIN un END attiecīgi atver un aizver SQL koda bloku.

Nav īpaši ērti rakstīt saglabātās procedūras mysql konsolē. Šajā gadījumā varat izmantot GUI rīkus, ar kuriem varat izveidot saglabātās procedūras intuitīvā saskarnē.

IN MySQL darbgalds procedūra tiek izveidota, ar peles labo pogu noklikšķinot uz Rutines un atlasot vienumu nolaižamajā izvēlnē Izveidot procedūru…

Jūs varat apskatīt pilnu kodu, kas tiks nosūtīts uz MySQL, pirms tas tiks ierakstīts datu bāzē. Ja kļūdu nav, noklikšķiniet uz Pieteikties.

Pēc kompilācijas MySQL ieraksta procedūru direktorijā. Kad ierakstīšana ir pabeigta, nospiediet pogu Pabeigt.

Izveidoto saglabāto procedūru var redzēt sarakstā Rotīnas.

Saglabātās procedūras izsaukšana

Lai izsauktu saglabāto procedūru, izmantojiet iebūvēto SQL komandu ZVANIET(Zvanīt):

Tā vietā STORED_PROCEDURE_NAME Tiek norādīts saglabātās procedūras nosaukums, un iekavās ir norādīts mainīgo lielumu saraksts. Lai izsauktu izveidoto procedūru bez mainīgajiem, tiks izmantots kods:

Jo procedūrai jāizpilda komanda * ATLASĪT NO produktiem;**, t.i. ATLASĪT visu NO tabulas PRODUKTI, tad piemērs tam, kā tas darbotos, būtu šāds rezultāts:

Mainīgie lielumi saglabātajās procedūrās

2. definīcija

Mainīgs ir nosaukts datu objekts, kas satur kādu vērtību, kad tiek izpildīta saglabātā procedūra.

Tos izmanto, lai saglabātu jebkuru vaicājuma vai izteiksmes rezultātu. Mainīgie lielumi saglabātajās procedūrās ir lokāli, t.i. tos nevar sazvanīt no ārpuses.

Mainīgo deklarēšana

3. definīcija

Tiek izsaukts process, kurā mysql paziņo, ka ir jāizmanto mainīgais deklarācija.

Lai deklarētu mainīgos, izmantojiet operatoru DEKLARĒT:

DEKLARĒT– rezervēts operators.

mainīgā_nosaukums– mainīgā nosaukums, uz kuru attiecas tie paši noteikumi, kas attiecas uz datu kolonnas nosaukumu MySQL.

datu tips (izmērs)– izmantotā mainīgā veids un tā lielums. MySQL mainīgie var ņemt jebkura veida datu vērtības, piemēram, DATETIME, VARCHAR, INT utt.

DEFAULT noklusējuma_vērtība– ļauj iestatīt mainīgā sākotnējo vērtību. Ja tas nav norādīts, noklusējuma vērtība būs NULL.

Lai izveidotu mainīgo total_sale, kurā tiks saglabāts INT tipa pirkumu saraksts un kas pēc noklusējuma būs vienāds ar 0, ierakstiet kodu:

Lai deklarētu vairākus viena veida mainīgos, varat ierakstīt kodu:

Vērtību piešķiršana mainīgajam

Lai mainīgajam piešķirtu vērtību, izmantojiet operatoru IESTATĪT.

Piemēram, mēs deklarējam mainīgo total_count un pēc tam piešķiram tam vērtību 10:

Papildus operatoram SET var izmantot operatoru SELECT INTO, lai pārsūtītu vaicājuma rezultātu uz mainīgo. Lūdzu, ņemiet vērā, ka vaicājumam ir jāatgriež skalāra vērtība (t.i., viena).

Pirmā koda rindiņa deklarē mainīgo total_products un iestata tā vērtību uz 0.

Otrajā un trešajā rindā tiek izmantots priekšraksts SELECT INTO, lai SELECT COUNT(*) FROM produktu vaicājuma rezultātu ierakstītu izveidotajā mainīgajā.

Mainīgais tvērums

Katram mainīgajam ir savs apjoms, kas nosaka tā kalpošanas laiku.

Ja saglabātā procedūrā izveidojat mainīgo, tas pastāvēs, kamēr tas tiks izmantots.

Ja jūs deklarējat mainīgo BEGIN END blokā, tas pastāvēs tikai šajā blokā.

Mainīgie ar @ to nosaukumu sākumā ir globāli, t.i. tie ir pieejami visas sesijas laikā.

Laboratorijas darbs Nr.1 ​​“Uzglabātās procedūras M

ySQL"

3.1.Darba mērķis

Izpētiet izmantotos veidus MySQL uzglabātās procedūras.

Iegūt prasmes darbā ar saglabātajām procedūrām, izmantojot SQL komandas un utilītu dbForge for MySQL.

3.2. Ievads

Saglabātās procedūras ir viens no jaudīgākajiem rīkiem, kas tiek piedāvāti datu bāzes lietojumprogrammu izstrādātājiem MySQL īstenot biznesa loģiku. Saglabātās procedūras (angļu val., stoied proceduies) ļauj ieviest būtisku lietojumprogrammu loģikas daļu datu bāzes līmenī un tādējādi palielināt visas aplikācijas veiktspēju, centralizēt datu apstrādi un samazināt koda apjomu, kas nepieciešams uzticēto uzdevumu izpildei. Gandrīz jebkura diezgan sarežģīta datu bāzes lietojumprogramma nevar iztikt bez saglabāto procedūru izmantošanas.

Papildus šīm labi zināmajām saglabāto procedūru izmantošanas priekšrocībām, kas ir kopīgas lielākajai daļai relāciju DBVS, InterBase saglabātās procedūras var darboties kā gandrīz pilnīgas datu kopas, ļaujot to atgrieztos rezultātus izmantot parastos SQL vaicājumos.

3.3. Darba veikšanas metode

2. Izstrādāt trīs vaicājumu saglabāto procedūru tekstu atbilstoši laboratorijas darba Nr.4 uzdevuma variantam.

3. Modificēt pieteikumu atbilstoši datu bāzes izmaiņām. Nodrošiniet, lai lietojumprogramma darbotos pareizi. Organizējiet datu vaicājumu lietojumprogrammā, izmantojot SQL saglabātās procedūras.

3.4. Uzdevuma iespējas

Sākotnējie dati laboratorijas darbam ir uzdevumu varianti un iepriekšējo laboratorijas darbu rezultāti.

3.5. Ziņojuma saturs

Ziņojumā jāiekļauj darba apraksts un rezultāti, kas izklāstīti šādā secībā:

1. Darbības noteikumu apraksts, kas ieviests, izmantojot saglabātās procedūras.

2. Saglabāto procedūru izveides skripta izdruka ar komentāriem par izveidotajām saglabātajām procedūrām.

3. 6. Pārbaudes jautājumi

1. Definējiet saglabāto procedūru.

2. Kā tiek izveidota saglabāta procedūra?

3. Kā iestatīt saglabātās procedūras izvades parametrus?

4. Kā mainīgajiem tiek piešķirtas vērtības?

5. Kā organizēt cilpu saglabātajā procedūrā?

6. Kā īstenot nosacītu lēcienu saglabātajā procedūrā?

7. Kā rīkoties ar saglabātās procedūras izpildes kļūdām?

3.7.1. Saglabātās procedūras jēdziens

Saglabāta procedūra ir veids, kā iekapsulēt atkārtotas darbības. Saglabātās procedūras var deklarēt mainīgos, manipulēt ar datu plūsmu un izmantot citas programmēšanas metodes.

To izveides iemesls ir skaidrs, un to apstiprina bieža lietošana.

Aiz muguras

  • Loģikas koplietošana ar citām lietojumprogrammām. Saglabātās procedūras iekapsulē funkcionalitāti; tas nodrošina savienojamību datu piekļuvei un pārvaldībai dažādās lietojumprogrammās.
  • Lietotāju izolēšana no datu bāzes tabulām. Tas ļauj jums piešķirt piekļuvi saglabātajām procedūrām, bet ne pašiem tabulas datiem.
  • Nodrošina aizsardzības mehānismu. Saskaņā ar iepriekšējo punktu, ja varat piekļūt datiem, tikai izmantojot saglabātās procedūras, neviens cits nevar izdzēst jūsu datus, izmantojot komandu SQL DELETE.
  • Uzlabota izpilde samazinātas tīkla trafika dēļ. Izmantojot saglabātās procedūras, var apvienot vairākus vaicājumus.

Pret

  • Palielināta datu bāzes servera slodze, jo lielākā daļa darba tiek veikta servera pusē, bet mazāk klienta pusē.
  • Jums būs daudz jāmācās. Lai rakstītu saglabātās procedūras, jums būs jāapgūst MySQL izteiksmes sintakse.
  • Jūs dublējat savu lietojumprogrammu loģiku divās vietās: servera kodā un saglabāto procedūru kodā, tādējādi sarežģījot datu apstrādes procesu.
  • Migrācija no vienas DBVS uz citu (DB2, SQL Server utt.) var radīt problēmas.

Kā strādāt ar saglabātajām procedūrām

Saglabātās procedūras izveide

IZVEIDOT PROCEDŪRU p2()

SQL DROŠĪBAS INVOKER

KOMENTĀRS "Šī ir mana pirmā procedūra"

SĀKT

IZVĒLIES "Sveiki";

Pirmā koda daļa izveido saglabātu procedūru. Nākamais satur neobligātos parametrus. Tad nāk nosaukums un, visbeidzot, pašas procedūras pamatteksts.

Saglabāto procedūru nosaukumi ir reģistrjutīgi. Tāpat nevar izveidot vairākas procedūras ar vienu nosaukumu. Saglabātā procedūrā nevar būt izteiksmes, kas modificē pašu datu bāzi.

4 saglabātās procedūras īpašības:

  • Valoda: pārnesamības nolūkos noklusējuma vērtība ir SQL.
  • Deterministisks: ja procedūra vienmēr atgriež vienu un to pašu rezultātu un izmanto tos pašus ievades parametrus. Tas ir paredzēts replikācijas un reģistrācijas procesam. Noklusējuma vērtība NAV DETERMINISTIKA.
  • SQL drošība: zvana laikā tiek pārbaudītas lietotāja tiesības. INVOKER ir lietotājs, kas izsauc saglabāto procedūru. DEFINER ir procedūras “radītājs”. Noklusējuma vērtība ir DEFINER.
  • Komentārs: Dokumentācijas nolūkos noklusējuma vērtība ir

Saglabātās procedūras izsaukšana

Lai izsauktu saglabāto procedūru, jāievada atslēgvārds CALL, kam seko procedūras nosaukums, kam seko parametri (mainīgie vai vērtības) iekavās. Iekavas ir obligātas.

CALL p2();

CALL stored_procedure_name (param1, param2, ....)

CALL procedūra1(10 , "virknes parametrs" , @parameter_var);

Saglabātās procedūras modificēšana

MySQL ir ALTER PRO paziņojums CEDURE procedūru maiņai, bet ir piemērota tikai dažu īpašību maiņai. Ja jāmaina procedūras parametri vai pamatteksts, tas jāizdzēš un jāizveido no jauna.

Saglabātās procedūras noņemšana

NOTEIKŠANAS PROCEDŪRA, JA IR p2;

Šī ir vienkārša komanda. Paziņojums IF EXISTS uztver kļūdu, ja šādas procedūras nav.

Iespējas

Apskatīsim, kā mēs varam nodot parametrus saglabātajai procedūrai.

  • IZVEIDOT PROCEDŪRU proc1(): tukšs parametru saraksts
  • IZVEIDOT PROCEDŪRU proc1 (IN varname DATA-TYPE): viens ievades parametrs. Vārds IN nav obligāts, jo noklusējuma parametri ir IN (in).
  • IZVEIDOT PROCEDŪRU proc1 (OUT varname DATA-TYPE): viens atgriešanas parametrs.
  • IZVEIDOT PROCEDŪRU proc1 (INOUT varname DATA-TYPE): viens parametrs, gan iekļauts, gan atgriezts.

Protams, jūs varat norādīt vairākus dažādu veidu parametrus.

IN parametra piemērs

IZVEIDOT PROCEDŪRU proc_IN (IN var1 INT)

SĀKT

SELECT var1 + 2 AS rezultāts;

BEIGAS

Parametra OUT piemērs

IZVEIDOT PROCEDŪRU proc_OUT (OUT var1 VARCHAR(100))

SĀKT

SET var1 = "Šī ir pārbaude";

BEIGAS

INOUT parametra piemērs

IZVEIDOT PROCEDŪRU proc_INOUT (OUT var1 INT)

SĀKT

SET var1 = var1 * 2;

BEIGAS

Mainīgie

Apskatīsim mainīgo lielumu izveidi un glabāšanu procedūrās. Mainīgie ir skaidri jānorāda bloka BEGIN/END sākumā, kā arī to datu tipi. Kad esat deklarējis mainīgo, varat to izmantot tāpat kā sesijas mainīgos, literāļus vai kolonnu nosaukumus.

Mainīgā deklarācijas sintakse izskatās šādi:

DEKLARĒT varname DATA-TYPE NOKLUSĒJUMS noklusējuma vērtība ;

Deklarēsim dažus mainīgos:

DEKLARĒT a, b INT NOKLUSĒJUMS 5;

DECLARE str VARCHAR(50);

DEKLARĒT v1, v2, v3 TINYINT;

Darbs ar mainīgajiem

Kad esat deklarējis mainīgo, varat iestatīt tā vērtību, izmantojot komandas:

IZVEIDOT PROCEDŪRU var_proc (IN paramstr VARCHAR(20))

SĀKT

DEKLARĒT a, b INT NOKLUSĒJUMS 5;

DECLARE str VARCHAR(50);

DEKLARĀT šodien TIMESTAMP NOKLUSĒJUMS CURRENT_DATE;

DEKLARĒT v1, v2, v3 TINYINT;

INSERT INTO table1 VALUES (a);

SET str = "Es esmu virkne";

SELECT CONCAT(str,paramstr), šodien FROM table2 WHERE b >=5;

Vītņu vadības struktūras

MySQL atbalsta IF, CASE, ITERATE, LEAVE LOOP, WHILE un REPEAT konstrukcijas, lai kontrolētu pavedienus saglabātās procedūras ietvaros. Mēs apskatīsim, kā izmantot IF, CASE un WHILE, jo tie ir visizplatītākie.

IF dizains

Izmantojot IF konstrukciju, mēs varam veikt uzdevumus, kas satur nosacījumus:

IZVEIDOT PROCEDŪRU proc_IF (IN param1 INT)

SĀKT

DEKLARĒT mainīgo1 INT;

SET mainīgais1 = param1 + 1;

JA mainīgais1 = 0 TAD

SELECT mainīgais1;

ENDIF;

JA param1 = 0 TAD

ATLASĪT "Parametra vērtība = 0";

CITS

ATLASĪT "Parametra vērtību<> 0";

ENDIF;

BEIGAS

CASE dizains

CASE ir vēl viena metode apstākļu pārbaudei un piemērota risinājuma izvēlei. Tas ir lielisks veids, kā aizstāt daudzas IF konstrukcijas. Konstrukciju var aprakstīt divos veidos, nodrošinot elastību vairāku nosacījumu izteiksmju pārvaldībā.

SĀKT

DEKLARĒT mainīgo1 INT;

SET mainīgais1 = param1 + 1;

CASE mainīgais1

KAD 0 TAD

KAD 1 TAD

CITS

BEIGAS LIETAS;

vai:

IZVEIDOT PROCEDŪRU proc_CASE (IN param1 INT)

SĀKT

DEKLARĒT mainīgo1 INT;

SET mainīgais1 = param1 + 1;

LIETAS

KAD mainīgais1 = 0 TAD

INSERT INTO table1 VALUES (param1);

KAD mainīgais1 = 1 TAD

INSERT INTO table1 VALUES (mainīgais1);

CITS

INSERT INTO table1 VALUES (99);

BEIGAS LIETAS;

BEIGAS

WHILE dizains

Tehniski ir trīs veidu cilpas: WHILE cilpa, LOOP cilpa un REPEAT cilpa. Varat arī veikt cilpu, izmantojot Darta Veidera programmēšanas paņēmienu: GOTO paziņojumi. Šeit cilpas piemērs:

IZVEIDOT PROCEDŪRU proc_WHILE (IN param1 INT)

SĀKT

DEKLARĒT mainīgais1, mainīgais2 INT;

SET mainīgais1 = 0;

WHILE mainīgais1< param1 DO

INSERT INTO table1 VALUES (param1);

SELECT COUNT(*) INTO variable2 FROM table1;

SET mainīgais1 = mainīgais1 + 1;

BEIGAS, KAMĒR;

BEIGAS

Kursori

Kursori tiek izmantoti, lai šķērsotu vaicājuma atgriezto rindu kopu un apstrādātu katru rindu.

MySQL atbalsta kursorus saglabātajās procedūrās. Šeit ir īsa sintakse kursora izveidei un lietošanai.

/*Kursora deklarēšana un aizpildīšana */

DECLARE cursor - nosaukums CURSOR FOR SELECT ...;

/*Ko darīt, ja ierakstu vairs nav*/

PAZIŅO TURPINĀTĀJU PAR NAV Atrasts……

/*Atvērt kursoru*/

OPEN kursora nosaukums;

/*Piešķirt vērtību mainīgajam, kas vienāds ar pašreizējo kolonnas vērtību*/

FETCH kursors - nosaukums INTO mainīgais [, mainīgais ];

/* Aizvērt kursoru */

CLOSE kursora nosaukums;

Šajā piemērā mēs veiksim dažas vienkāršas darbības, izmantojot kursoru:

IZVEIDOT PROCEDŪRU proc_CURSOR (OUT param1 INT)

SĀKT

DEKLARĒT a, b, c INT;

DEKLARĒT cur1 CURSOR FOR SELECT col1 FROM table1;

DEKLARĒT TURPINĀTĀJU NAV ATRASTĪTAM IESTATĪJUMS b = 1;

OPEN cur1;

SET b = 0;

SET c = 0;

KAmēr b = 0 DO

IEŅEMT cur1 INTO a;

JA b = 0 TAD

SET c = c + a;

ENDIF;

BEIGAS, KAMĒR;

AIZVĒRT cur1;

SET param1 = c;

Kursoriem ir trīs īpašības, kas jums jāsaprot, lai izvairītos no negaidītu rezultātu iegūšanas:

  • Nav jutīgs: kursors, kas tiek atvērts vienreiz, neatspoguļos izmaiņas tabulā, kas notiks vēlāk. Patiesībā MySQL negarantē, ka kursors tiks atjaunināts, tāpēc nepaļaujieties uz to.
  • Tikai lasāms: kursorus nevar mainīt.
  • Nav attīšanas: kursors var pārvietoties tikai vienā virzienā - uz priekšu, jūs nevarēsit izlaist rindas, tās neatlasot.

Secinājums

Jums vajadzētu aprēķināt saglabāto procedūru izmantošanas priekšrocības savā konkrētajā lietojumprogrammā un pēc tam izveidot tikai nepieciešamās procedūras. Kopumā es izmantoju procedūras; Manuprāt, tos ir vērts ieviest projektos gan drošības, gan koda uzturēšanas, gan kopējā dizaina dēļ. Tāpat paturiet prātā, ka MySQL procedūras joprojām tiek izstrādātas. Gaidiet uzlabojumus attiecībā uz funkcionalitāti un uzlabojumiem. Lūdzu, dalieties savos viedokļos.

Piemēri:

IZVEIDOT PROCEDŪRU test.p2 (IN P_bdate DATE)

SQL DROŠĪBAS INVOKER

KOMENTĀRS "Šī ir mana pirmā procedūra"

SĀKT

SELECT * FROM persona WHERE bdate<=P_bdate;

IZVEIDOT PROCEDŪRU test.p1(IN kārtošanas lauks VARCHAR(255), kārtošanas secībā VARCHAR(255), pirmajā rindā indekss SMALLINT, rindāsPerLape SMALLINT)

SQL DROŠĪBAS INVOKER

KOMENTĀRS "Šī ir mana pirmā procedūra"

SĀKT

SET @var = concat("SELECT fio, Count(*) AS skaits FROM persona,pnumber WHERE persona.id_person=pnumber.id_person GROUP BY fio",

" ORDER BY ", sortingField, " ", sortingOrder, " LIMIT ", firstRowIndex, ",", rowsPerPage);

SAGATAVOT zxc NO @var;

IZPILDĪT zxc;

Vienkārši sakot, saglabātās procedūras (“SP”) ir procedūras, kas tiek glabātas datu bāzē (rakstītas, izmantojot SQL un citus kontroles paziņojumus), kuras var izpildīt datu bāzes dzinējs un izsaukt no programmas koda, kas darbojas ar šo programmu. "" Izlasiet pilnībā

Saglabātas procedūras MySQL un PHP. 2. daļa

Teilors Vrens (Teilore Rena), 03.01.2014

Saglabātās procedūras izveide MySQL

Tā kā HP tiek glabāti serverī, ieteicams tos izveidot tieši serverī, t.i. Jums nevajadzētu izmantot PHP vai citas programmēšanas valodas, lai izpildītu SQL komandas, lai izveidotu saglabātās procedūras.

Apskatīsim, kā izveidot HP MySQL serverī, kā izveidot tam lietotāju un kā piešķirt viņam privilēģijas, lai palaistu mūsu HP. Pēc tam mēs pārbaudīsim rezultāta pareizību. Šim nolūkam es izmantošu MySQL Workbench. Varat izmantot arī citas programmas (piemēram, PHPMyAdmin). Jūs varat izvēlēties sev piemērotāko rīku komplektu.

Pieņemsim, ka mūsu tabula izskatās šādi:

IZVEIDOT TABULU `alga` (`empid` int(11) NOT NULL, `sal` int(11) DEFAULT NULL, PRIMARY KEY (`empid`)) ENGINE=InnoDB DEFAULT CHARSET=utf8;

Mūsu darbiniekam, kuram nepieciešama statistiskā informācija par algām (vidējā, maksimālā, minimālā u.c.) no šīs tabulas, izveidosim lietotāju "tr" šādi:

IZVEIDOT LIETOTĀJU "tr"@"localhost", KO Identificē "mypass";

Tagad piešķirsim šim lietotājam vienīgo EXECUTE privilēģiju shēmā, kurā atrodas algu tabula:

Piešķirt izpildi hris.* uz tr@`%`

Mēs varam pārbaudīt, vai esam piešķīruši pareizo privilēģiju, MySQL Bench atverot sadaļu "Lietotāji un privilēģijas".

Tagad izveidosim pašu HP šādi:

DELIMITER $$ IZVEIDOT PROCEDŪRU `avg_sal`(ārpus avg_sal decimāldaļas) BEGIN atlasiet avg(sal) uz avg_sal no algas; BEIGAS

Pēc šīs komandas izpildīšanas programmā MySQL Workbench tiks izveidots lietošanai gatavs avg_sal HP. Tas atgriež vidējo algu no algu tabulas.

Lai pārbaudītu, vai lietotājs tr tiešām var palaist HP un vai viņam nav piekļuves algu tabulai, mums ir atkārtoti jāizveido savienojums ar MySQL serveri, piesakoties kā tr. Programmā MySQL Workbench to var izdarīt, izveidojot citu savienojumu un norādot vēlamo lietotāju un viņa paroli.

Pēc pieslēgšanas no zem tr , pirmais, ko pamanām, ir tas, ka lietotājs vispār neredz nevienu tabulu, viņš redz tikai HP:

Acīmredzot lietotājs tr nevar piekļūt nevienai no tabulām (un līdz ar to nevar redzēt detalizētu informāciju par algām no algu tabulas), taču viņš var palaist mūsu izveidoto HP, kas viņam atgriezīs uzņēmuma vidējo algu:

Izsaukt avg_sal(@out); atlasiet @out;

Tiks parādīta vidējā alga.

Tātad, esam paveikuši visus sagatavošanās darbus: izveidojuši lietotāju, piešķīruši viņam privilēģijas, izveidojuši HP un pārbaudījuši. Tagad redzēsim, kā izsaukt šo HP no PHP.

Saglabātas procedūras izsaukšana no PHP

Izmantojot ACVN, zvanīt HP ir pavisam vienkārši. Šeit ir atbilstošais PHP kods:

$dbms = "mysql"; // Aizstāt šādus savienojuma parametrus ar tiem, kas atbilst jūsu videi: $host = "192.168.1.8"; $db = "hris"; $lietotājs = "tr"; $pass = "mypass"; $dsn = "$dbms:host=$host;dbname=$db"; $cn=jauns ACVN($dsn, $lietotājs, $pass); $q=$cn->exec("call avg_sal(@out)"); $res=$cn->query("select @out")->fetchAll(); print_r($res);

Mainīgais $res satur vidējo algu no algu tabulas. Tagad lietotājs var veikt turpmāku izvades apstrādi, izmantojot PHP.

secinājumus

Šajā rakstā mēs apskatījām sen aizmirstu MySQL datu bāzu komponentu: saglabātās procedūras. HP izmantošanas priekšrocības ir acīmredzamas, taču atgādināšu: saglabātās procedūras ļauj mums piemērot stingrāku piekļuves kontroli noteiktiem datiem, ja to prasa biznesa loģika.

Turklāt mēs demonstrējām pamata soļus, kā izveidot saglabātās procedūras, lietotājus un piešķirt atbilstošas ​​privilēģijas, kā arī parādījām, kā HP tiek izsaukts no PHP.

Šis raksts neaptver visu saglabāto procedūru tēmu. Daži svarīgi aspekti, piemēram, I/O parametri, vadības priekšraksti, kursori, pilnīga sintakse utt., šajā īsajā rakstā netika apskatīti.

Ja jūs interesē, lūdzu, atstājiet komentāru šeit. Ja nepieciešams, mēs ar prieku piedāvāsim padziļinātus rakstus par noderīgo un jaudīgo MySQL saglabāto procedūru aspektu.

Teilors Vrens

Teilors ir ārštata tīmekļa un darbvirsmas lietojumprogrammu izstrādātājs, kas atrodas Sudžou, Ķīnas austrumos. Sācis ar Borland izstrādes rīkiem (C++Builder, Delphi), izdevis grāmatu InterBase. Kopš 2003. gada viņš ir sertificēts Borland eksperts. Pēc tam es pārgāju uz tīmekļa izstrādi tipiskā LAMP konfigurācijā. Vēlāk sāku strādāt ar jQuery, Symfony, Bootstrap, Dart utt.

Iepriekšējās publikācijas:

MySQL 5 ir daudz jaunu iespēju, no kurām viena no nozīmīgākajām ir saglabāto procedūru izveide. Šajā apmācībā es runāšu par to, kas tie ir un kā tie var atvieglot jūsu dzīvi.

Ievads

Saglabāta procedūra ir veids, kā iekapsulēt atkārtotas darbības. Saglabātās procedūras var deklarēt mainīgos, manipulēt ar datu plūsmu un izmantot citas programmēšanas metodes.

To izveides iemesls ir skaidrs, un to apstiprina bieža lietošana. Savukārt, ja runāsi ar tiem, kas ar viņiem strādā neregulāri, viedokļi sadalīsies divos pilnīgi pretējos flangos. Neaizmirstiet šo.

Aiz muguras

  • Loģikas koplietošana ar citām lietojumprogrammām. Saglabātās procedūras iekapsulē funkcionalitāti; tas nodrošina savienojamību datu piekļuvei un pārvaldībai dažādās lietojumprogrammās.
  • Lietotāju izolēšana no datu bāzes tabulām. Tas ļauj jums piešķirt piekļuvi saglabātajām procedūrām, bet ne pašiem tabulas datiem.
  • Nodrošina aizsardzības mehānismu. Saskaņā ar iepriekšējo punktu, ja varat piekļūt datiem, tikai izmantojot saglabātās procedūras, neviens cits nevar izdzēst jūsu datus, izmantojot komandu SQL DELETE.
  • Uzlabota izpilde samazinātas tīkla trafika dēļ. Izmantojot saglabātās procedūras, var apvienot vairākus vaicājumus.

Pret

  • Palielināta datu bāzes servera slodze, jo lielākā daļa darba tiek veikta servera pusē, bet mazāk klienta pusē.
  • Jums būs daudz jāmācās. Lai rakstītu saglabātās procedūras, jums būs jāapgūst MySQL izteiksmes sintakse.
  • Jūs dublējat savu lietojumprogrammu loģiku divās vietās: servera kodā un saglabāto procedūru kodā, tādējādi sarežģījot datu apstrādes procesu.
  • Migrācija no vienas DBVS uz citu (DB2, SQL Server utt.) var radīt problēmas.

Rīks, ar kuru es strādāju, tiek saukts par MySQL Query Browser, kas ir diezgan standarts mijiedarbībai ar datu bāzēm. MySQL komandrindas rīks ir vēl viena lieliska izvēle. Iemesls, kāpēc es jums to saku, ir tāpēc, ka visu iecienītais phpMyAdmin neatbalsta saglabāto procedūru izpildi.

Starp citu, es izmantoju pamata tabulas struktūru, lai jums būtu vieglāk saprast šo tēmu. Es runāju par saglabātajām procedūrām, un tās ir pietiekami sarežģītas, lai prasītu iedziļināties apgrūtinošajā tabulas struktūrā.

1. solis: novietojiet ierobežotāju

Atdalītājs ir rakstzīme vai rakstzīmju virkne, kas tiek izmantota, lai norādītu MySQL klientam, ka esat pabeidzis SQL izteiksmes rakstīšanu. Semikols ilgu laiku ir bijis norobežotājs. Tomēr var rasties problēmas, jo saglabātajā procedūrā var būt vairākas izteiksmes, katrai no kurām jābeidzas ar semikolu. Šajā apmācībā es izmantoju virkni “//” kā atdalītāju.

2. darbība. Kā strādāt ar saglabātajām procedūrām

Saglabātās procedūras izveide

DELIMITER // IZVEIDOT PROCEDŪRU `p2` () VALODA SQL DETERMINISTISKS SQL DROŠĪBAS DEFINĒTĀJS KOMENTĀRS "Procedūra" BEGIN ATLASĪT "Sveika pasaule!"; END//

Pirmā koda daļa izveido saglabātu procedūru. Nākamais satur neobligātos parametrus. Tad nāk nosaukums un, visbeidzot, pašas procedūras pamatteksts.

Saglabāto procedūru nosaukumi ir reģistrjutīgi. Tāpat nevar izveidot vairākas procedūras ar vienu nosaukumu. Saglabātā procedūrā nevar būt izteiksmes, kas modificē pašu datu bāzi.

4 saglabātās procedūras īpašības:

  • Valoda: pārnesamības nolūkos noklusējuma vērtība ir SQL.
  • Deterministisks: ja procedūra vienmēr atgriež vienu un to pašu rezultātu un izmanto tos pašus ievades parametrus. Tas ir paredzēts replikācijas un reģistrācijas procesam. Noklusējuma vērtība NAV DETERMINISTIKA.
  • SQL drošība: zvana laikā tiek pārbaudītas lietotāja tiesības. INVOKER ir lietotājs, kas izsauc saglabāto procedūru. DEFINER ir procedūras “radītājs”. Noklusējuma vērtība ir DEFINER.
  • Komentārs: dokumentācijas nolūkos noklusējuma vērtība ir ""

Saglabātās procedūras izsaukšana

Lai izsauktu saglabāto procedūru, jāievada atslēgvārds CALL, kam seko procedūras nosaukums, kam seko parametri (mainīgie vai vērtības) iekavās. Iekavas ir obligātas.

CALL saglabātās_procedūras_nosaukums (param1, param2, ....) CALL procedūra1(10 , "virknes parametrs" , @parameter_var);

Saglabātās procedūras modificēšana

MySQL ir ALTER PROCEDURE priekšraksts procedūru maiņai, taču tas ir piemērots tikai noteiktu raksturlielumu maiņai. Ja jāmaina procedūras parametri vai pamatteksts, tas jāizdzēš un jāizveido no jauna.

Saglabātās procedūras noņemšana

NOTEIKŠANAS PROCEDŪRA, JA IR p2;

Šī ir vienkārša komanda. Paziņojums IF EXISTS uztver kļūdu, ja šādas procedūras nav.

3. darbība: opcijas

Apskatīsim, kā mēs varam nodot parametrus saglabātajai procedūrai.

  • IZVEIDOT PROCEDŪRU proc1(): tukšs parametru saraksts
  • IZVEIDOT PROCEDŪRU proc1 (IN varname DATA-TYPE): viens ievades parametrs. Vārds IN nav obligāts, jo noklusējuma parametri ir IN (in).
  • IZVEIDOT PROCEDŪRU proc1 (OUT varname DATA-TYPE): atgriezts viens parametrs.
  • IZVEIDOT PROCEDŪRU proc1 (INOUT varname DATA-TYPE): viens parametrs, gan ievade, gan atgriešana.

Protams, jūs varat norādīt vairākus dažādu veidu parametrus.

IN parametra piemērs

DELIMITER // IZVEIDOT PROCEDŪRU `proc_IN` (IN var1 INT) BEGIN SELECT var1 + 2 AS rezultāts; END//

Parametra OUT piemērs

DELIMITER // IZVEIDOT PROCEDŪRU `proc_OUT` (OUT var1 VARCHAR(100)) BEGIN SET var1 = "Šī ir pārbaude"; BEIGAS //

INOUT parametra piemērs

DELIMITER // IZVEIDOT PROCEDŪRU "proc_INOUT" (OUT var1 INT) BEGIN SET var1 = var1 * 2; BEIGAS //

4. darbība: mainīgie

Tagad es jums iemācīšu, kā izveidot mainīgos lielumus un saglabāt tos procedūrās. Jums tie ir skaidri jānorāda bloka BEGIN/END sākumā kopā ar to datu veidiem. Kad esat deklarējis mainīgo, varat to izmantot tāpat kā sesijas mainīgos, literāļus vai kolonnu nosaukumus.

Mainīgā deklarācijas sintakse izskatās šādi:

DEKLARĒT varname DATA-TYPE DEFAULT noklusējuma vērtība;

Deklarēsim dažus mainīgos:

DEKLARĒT a, b INT NOKLUSĒJUMS 5; DECLARE str VARCHAR(50); DEKLARĀT šodien TIMESTAMP NOKLUSĒJUMS CURRENT_DATE; DEKLARĒT v1, v2, v3 TINYINT;

Darbs ar mainīgajiem

Kad esat deklarējis mainīgo, varat iestatīt tā vērtību, izmantojot komandas SET vai SELECT:

DELIMITER // IZVEIDOT PROCEDŪRU `var_proc` (IN paramstr VARCHAR(20)) BEGIN DEKLARĒT a, b INT NOKLUSĒJUMS 5; DECLARE str VARCHAR(50); DEKLARĀT šodien TIMESTAMP NOKLUSĒJUMS CURRENT_DATE; DEKLARĒT v1, v2, v3 TINYINT; INSERT INTO table1 VALUES (a); SET str = "Es esmu virkne"; SELECT CONCAT(str,paramstr), šodien FROM table2 WHERE b >=5; BEIGAS //

5. darbība: pavedienu vadības struktūras

MySQL atbalsta IF, CASE, ITERATE, LEAVE LOOP, WHILE un REPEAT konstrukcijas, lai kontrolētu pavedienus saglabātās procedūras ietvaros. Mēs apskatīsim, kā izmantot IF, CASE un WHILE, jo tie ir visizplatītākie.

IF dizains

Izmantojot IF konstrukciju, mēs varam veikt uzdevumus, kas satur nosacījumus:

DELIMITER // IZVEIDOT PROCEDŪRU "proc_IF" (IN param1 INT) BEGIN DECLARE mainīgais1 INT; SET mainīgais1 = param1 + 1; JA mainīgais1 = 0 TAD ATLASĪT mainīgo1; ENDIF; JA param1 = 0 TAD IZVĒLIES "Parametra vērtība = 0"; ELSE SELECT "Parametra vērtība<>0"; END IF; END //

CASE dizains

CASE ir vēl viena metode apstākļu pārbaudei un piemērota risinājuma izvēlei. Tas ir lielisks veids, kā aizstāt daudzas IF konstrukcijas. Konstrukciju var aprakstīt divos veidos, nodrošinot elastību vairāku nosacījumu izteiksmju pārvaldībā.

DELIMITER // IZVEIDOT PROCEDŪRU `proc_CASE` (IN param1 INT) BEGIN DECLARE variable1 INT; SET mainīgais1 = param1 + 1; CASE mainīgais1 WHEN 0 THEN INSERT INTO table1 VALUES (param1); KAD 1, TAD IEVIETOT tabulā1 VĒRTĪBAS (mainīgais1); ELSE INSERT INTO table1 VALUES (99); BEIGAS LIETAS; BEIGAS //

DELIMITER // IZVEIDOT PROCEDŪRU "proc_CASE" (IN param1 INT) BEGIN DECLARE mainīgais1 INT; SET mainīgais1 = param1 + 1; GADĪJUMS, KAD mainīgais1 = 0, TAD IEVADĪT TABLA1 1 VĒRTĪBAS (param1); KAD mainīgais1 = 1, TAD IEVIETOT tabulā1 VĒRTĪBAS (mainīgais1); ELSE INSERT INTO table1 VALUES (99); BEIGAS LIETAS; BEIGAS //

WHILE dizains

Tehniski ir trīs veidu cilpas: WHILE cilpa, LOOP cilpa un REPEAT cilpa. Varat arī veikt cilpu, izmantojot Darta Veidera programmēšanas paņēmienu: GOTO paziņojumi. Šeit ir cilpas piemērs:

DELIMITER // IZVEIDOT PROCEDŪRU "proc_WHILE" (IN param1 INT) BEGIN DECLARE mainīgais1, mainīgais2 INT; SET mainīgais1 = 0; WHILE mainīgais1< param1 DO INSERT INTO table1 VALUES (param1); SELECT COUNT(*) INTO variable2 FROM table1; SET variable1 = variable1 + 1; END WHILE; END //

6. darbība. Kursori

Kursori tiek izmantoti, lai šķērsotu vaicājuma atgriezto rindu kopu un apstrādātu katru rindu.

MySQL atbalsta kursorus saglabātajās procedūrās. Šeit ir īsa sintakse kursora izveidei un lietošanai.

DECLARE kursora nosaukums CURSOR FOR SELECT ...; /*Kursora deklarēšana un aizpildīšana */ DECLARE CONTINUE HANDLER FOR NOT FOUND /*Ko darīt, ja ierakstu vairs nav*/ OPEN cursor-name; /*Open cursor*/ FETCH cursor-name INTO mainīgais [, mainīgais]; /*Piešķirt vērtību mainīgajam, kas vienāds ar kolonnas pašreizējo vērtību*/ CLOSE cursor-name; /*Aizvērt kursoru*/

Šajā piemērā mēs veiksim dažas vienkāršas darbības, izmantojot kursoru:

DELIMITER // IZVEIDOT PROCEDŪRU "proc_CURSOR" (OUT param1 INT) BEGIN DEKLARĒT a, b, c INT; DEKLARĒT cur1 CURSOR FOR SELECT col1 FROM table1; DEKLARĒT TURPINĀTĀJU NAV ATRASTĪTAM IESTATĪJUMS b = 1; OPEN cur1; SET b = 0; SET c = 0; WHILE b = 0 DO FETCH cur1 INTO a; JA b = 0 TAD IESTATĪT c = c + a; ENDIF; BEIGAS, KAMĒR; AIZVĒRT cur1; SET param1 = c; BEIGAS //

Kursoriem ir trīs īpašības, kas jums jāsaprot, lai izvairītos no negaidītu rezultātu iegūšanas:

  • Nav jutīgs: kursors, kas tiek atvērts vienreiz, neatspoguļos izmaiņas tabulā, kas notiks vēlāk. Patiesībā MySQL negarantē, ka kursors tiks atjaunināts, tāpēc nepaļaujieties uz to.
  • Tikai lasāms: kursorus nevar mainīt.
  • Nav attīšanas: kursors var pārvietoties tikai vienā virzienā - uz priekšu, jūs nevarēsit izlaist rindas, tās neatlasot.

Secinājums

Šajā apmācībā es jūs iepazīstināju ar darba ar saglabātajām procedūrām pamatiem un dažām ar to saistītajām specifiskajām īpašībām. Protams, pirms kļūt par īstu MySQL procedūru guru, jums būs jāpadziļina savas zināšanas tādās jomās kā drošība, SQL izteiksmes un optimizācija.

Jums vajadzētu aprēķināt saglabāto procedūru izmantošanas priekšrocības savā konkrētajā lietojumprogrammā un pēc tam izveidot tikai nepieciešamās procedūras. Kopumā es izmantoju procedūras; Manuprāt, tos ir vērts ieviest projektos gan drošības, gan koda uzturēšanas, gan kopējā dizaina dēļ. Tāpat paturiet prātā, ka MySQL procedūras joprojām tiek izstrādātas. Gaidiet uzlabojumus attiecībā uz funkcionalitāti un uzlabojumiem. Lūdzu, dalieties savos viedokļos.




Tops