Lagrede prosedyrer og triggere. MySQL-funksjoner

Merk følgende! denne jobben bygget på grunnlag av oversettelsen av avsnitt «17.1. Lagrede rutiner og bevilgningstabeller" beskrivelser av MySQL 5.0.19 programvare, " Referansehåndbok. Den dokumenterer MySQL 5.0 til 5.0.19. Dokument generert: 2006-01-23 (revisjon:995)"
``Les alt først, og prøv deretter eksemplene.''

Lagrede prosedyrer er et sett med SQL-kommandoer som kan kompileres og lagres på en server. På denne måten, i stedet for å lagre en ofte brukt spørring, kan klienter referere til den tilsvarende lagrede prosedyren. Dette gir bedre ytelse, fordi det denne forespørselen må kun analyseres én gang og reduserer trafikken mellom server og klient. Det konseptuelle nivået kan også økes ved å lage et bibliotek med funksjoner på serveren.

En trigger er en lagret prosedyre som utføres når en hendelse inntreffer. bestemt hendelse. Du kan for eksempel definere en lagret prosedyre som kjører hver gang en post slettes fra en transaksjonstabell, og dermed sikre automatisk fjerning den tilsvarende kunden fra kundetabellen når alle transaksjonene er slettet.

Lagrede programmer (prosedyrer og funksjoner) støttes i MySQL 5.0. Lagrede prosedyrer er et sett med SQL-uttrykk som kan lagres på serveren. Når dette er gjort, trenger ikke klienten lenger å sende forespørselen på nytt, men kaller bare det lagrede programmet.

Dette kan være nyttig når:

  • mange klientapplikasjoner er skrevet inn forskjellige språk eller jobber på andre plattformer, men må bruke samme operasjonsdatabasen
  • sikkerhet kommer først

Lagrede prosedyrer og funksjoner (rutiner) kan gi bedre ytelse pga mindre informasjon nødvendig for videresending mellom klient og server. Valget øker belastningen på databaseserveren, men reduserer kostnadene på klientsiden. Bruk denne hvis det er mye klientmaskiner(som webservere) betjenes av en eller flere databaser.

Lagrede rutiner lar deg også bruke funksjonsbiblioteker lagret i serverdatabasen. Denne muligheten presenteres for mange moderne språk programmering som lar deg ringe dem direkte (for eksempel ved å bruke klasser).

MySQL følger SQL:2003s syntaks for lagrede prosedyrer, som allerede brukes i IBMs DB2.

Fra ord til handling...

Når du oppretter, endrer, sletter lagrede rutiner, manipulerer serveren mysql.proc-tabellen

Fra og med MySQL 5.0.3 kreves følgende rettigheter:

LAG RUTINE for å lage lagrede prosedyrer

ENDRE RUTINE nødvendig for å endre eller slette prosedyrer. Dette privilegiet blir automatisk tildelt til skaperen av prosedyren (funksjonen)

HENRETTE privilegium vil være nødvendig for å utføre subrutinen. Imidlertid tildeles den automatisk til skaperen av prosedyren (funksjonen). Som standard er også SQL SECURITY-parameteren for DEFINER-rutinen, som lar brukere med tilgang til databasen kalle rutiner knyttet til denne databasen.

Syntaks for lagrede prosedyrer og funksjoner

En lagret rutine er en prosedyre eller funksjon. Lagrede rutiner opprettes ved hjelp av CREATE PROCEDURE eller CREATE FUNCTION-setninger. En lagret rutine kalles ved å bruke en CALL-setning, med bare verdireturnerende variabler som brukes som utdatavariabler. Funksjonen kan kalles som enhver annen funksjon og kan returnere en skalarverdi. Lagrede rutiner kan kalle andre lagrede rutiner.

Siden MySQL 5.0.1 er den innlastede prosedyren eller funksjonen knyttet til en spesifikk database. Dette har flere betydninger:

  • Når en subrutine kalles, er hensikten å kalle USE db_name (og forkaste databasen når subrutinen er fullført og databasen ikke lenger er nødvendig)
  • Du kan kvalifisere vanlige navn med et databasenavn. Dette kan brukes til å referere til en rutine som ikke er i gjeldende database. For å utføre for eksempel en lagret prosedyre p eller en funksjon f som er knyttet til testdatabasen, kan du fortelle kommandotolken slik: CALL test.p() eller test.f() .
  • Når en database slettes, slettes også alle innlastede rutiner knyttet til den. I MySQL 5.0.0 er innlastede rutiner globale og ikke knyttet til databasen. De arver standarddatabasen fra den kallende uttalelsen. Hvis USE db_name utføres innenfor en subrutine, vil den opprinnelige gjeldende databasen gjenopprettes etter at du har avsluttet subrutinen (For eksempel, den gjeldende databasen er db_11, vi kaller en subrutine som bruker db_22, etter å ha avsluttet subrutinen forblir den gjeldende db_11)

MySQL støtter fullt ut utvidelser som lar deg bruke vanlige SELECT-uttrykk (uten å bruke markører eller lokale variabler) i lagrede prosedyrer. Resultatsettet som returneres fra spørringen sendes ganske enkelt direkte til klienten. Flere VELG spørring genererer flere resultatsett, så klienten må bruke et bibliotek som støtter flere resultatsett.

OPPRETT PROSEDYRE- opprette en lagret prosedyre.

LAG FUNKSJON- opprette en lagret funksjon.

Syntaks:

OPPRETT PROSEDYRE prosedyrenavn ([prosedyreparameter[,...]])
[karakteristikker...] subroutine_body

LAG FUNKSJON funksjonsnavn ([funksjonsparameter[,...]])
RETURER type
[karakteristisk...] subroutine_body

prosedyreparameter:
[ I | UTE | INOUT] parameternavn type
funksjonsparameter:
parameternavn type

type:
Enhver MySQL-datatype

karakteristisk:
SPRÅK SQL
| DETERMINISTISK
| ( INNEHOLDER SQL | INGEN SQL | LES SQL DATA | MODIFISER SQL DATA )
| SQL SIKKERHET (DEFINER | INVOKER)
| KOMMENTAR "streng"

subroutine_body:
Korrekt SQL-uttrykk.

La oss se på alt i praksis.

La oss først lage en lagret prosedyre med følgende spørring:

OPPRETT PROSEDYRE `my_proc`(OUT t INTEGER(11))
IKKE DETERMINISTISK
SQL SECURITY INVOKER
KOMMENTAR ""
BEGYNNE
velg val1+val2 til "t" fra `min` LIMIT 0,1;
SLUTT;

Bruken av LIMIT-uttrykket i denne spørringen er gjort i erkjennelse av det faktum at ikke alle klienter er i stand til å akseptere et resultatsett med flere rader.

Etter det, la oss kalle det:

RING min_proc(@a);
Velg en;

For avdeling intern forespørsel fra den eksterne bruker de alltid en separator som er forskjellig fra den vanlige (for å spesifisere bruker de kommandoen AVGRENSNING <строка/символ>)

Her er et annet eksempel som tar hensyn til alle kravene.

Mysql> skilletegn //
mysql> LAG PROSEDYRE simpleproc (OUT param1 INT)
-> BEGYNNE
-> SELECT COUNT(*) INTO param1 FROM t;
->END;
-> //

mysql>skilletegn;
mysql> RING simpleproc(@a);
Spørringen OK, 0 rader påvirket (0,00 sek)
mysql> VELG @a;
+------+
| @a |
+------+
| 3 |
+------+
1 rad i sett (0,00 sek)

Hele prosessen kan observeres i figuren nedenfor:

Utløsere

Triggerstøtte har vært tilgjengelig i MySQL siden versjon 5.0.2.

Avtrekker- et navngitt databaseobjekt som er knyttet til en tabell og aktiveres når en bestemt hendelse inntreffer, en hendelse knyttet til denne tabellen.

For eksempel oppretter koden nedenfor en tabell og en INSERT-utløser. Utløseren summerer verdiene som er satt inn i en av tabellkolonnene.

Mysql> CREATE TABLE-konto (acct_num INT, beløp DESIMAL(10,2));
Søk OK, 0 rader påvirket (0,03 sek)
mysql> LAG TRIGGER ins_sum FØR INSERT PÅ kontoen
-> FOR HVER RADESETT @sum = @sum + NYTT.beløp;
Søk OK, 0 rader påvirket (0,06 sek)

La oss deklarere variabelsummen og tilordne den verdien 1. Etter det, hver gang vi setter inn i tabellen regnskap verdien av denne variabelen vil øke i henhold til den innsatte delen.

Kommentar. Hvis variabelens verdi ikke initialiseres, vil ikke triggeren fungere!

Syntaks for å lage en trigger

SKAPE

AVTREKKER trigger_name trigger_time trigger_event
PÅ tabellnavn FOR HVER RAD expression_executed_when_trigger_fires

Hvis alt er klart med en gang med utløsernavnet og brukernavnet, snakker vi om "utløsertid" og "hendelse" separat.

trigger_time

Definerer tidspunktet da utløserhandlingen skjer. FØR betyr at utløseren vil utføres før utløserhendelsen fullføres, og ETTER betyr etter. For eksempel, ved innsetting av poster (se eksempel ovenfor), utløste triggeren vår før den faktiske innsettingen av posten og beregnet summen. Dette alternativet er egnet for foreløpig beregning av noen tilleggsfelt i tabellen eller parallell innsetting i en annen tabell.

trigger_event

Alt er enklere her. Den indikerer tydelig ved hvilken hendelse triggeren blir utført.

  • SETT INN: dvs. under innsettingsoperasjoner eller lignende uttrykk (INSERT, LOAD DATA og REPLACE)
  • OPPDATERING: når en enhet (rad) endres
  • DELETE: Når en post slettes (forespørsler som inneholder DELETE- og/eller REPLACE-setninger)

6.3.3.2. Matematiske funksjoner

Alle matematiske funksjoner i tilfelle feil, returner NULL.

    Unært minus. Endrer tegnet på argumentet:

    Mysql> VELG - 2; -> -2

    Merk at dersom denne operatoren brukes med data av typen BIGINT, vil returverdien også være av typen BIGINT! Dette betyr at du bør unngå å bruke operatoren på heltall som kan ha en størrelse på -2^63 !

    Returnerer den absolutte verdien av X:

    Mysql> VELG ABS(2);-> 2 mysql> VELG ABS(-32); -> 32

    Returnerer tegnet til argumentet, spesifisert som -1, 0 eller 1, avhengig av om X er negativ, null eller positiv:

    Mysql> VELG SIGN(-32);-> -1 mysql> VELG SIGN(0);-> 0 mysql> VELG SIGN(234); -> 1

    Modulo-verdi (ligner %-operatoren i C). Returnerer resten når N er delt på M:

    Mysql> VELG MOD(234, 10);-> 4 mysql> VELG 253% 7;-> 1 mysql> VELG MOD(29,9); -> 2

    Denne funksjonen kan trygt brukes for BIGINT-verdier.

    Returnerer det største heltall som ikke overstiger X:

    Mysql> VELG GULV(1,23);-> 1 mysql> VELG GULV(-1,23); -> -2

    Returnerer det minste heltall ikke mindre enn X:

    Mysql> VELG TAK(1,23);-> 2 mysql> VELG TAK(-1,23); -> -1

    Vær oppmerksom på at returverdien konverteres til BIGINT !

    Returnerer argumentet X avrundet til nærmeste heltall:

    Mysql> VELG RUNDE(-1,23);-> -1 mysql> VELG RUNDE(-1,58);-> -2 mysql> VELG RUNDE(1,58); -> 2

    Merk at oppførselen til ROUND()-funksjonen når argumentverdien er lik midtpunktet mellom to heltall avhenger av den spesifikke C-bibliotekimplementeringen. Avrunding kan utføres: til nærmeste partall, alltid til nærmeste høyere, alltid til nærmeste lavere, alltid til null. For å sikre at avrunding alltid skjer i bare én retning, må du bruke godt i stedet for dette visse funksjoner, for eksempel TRUNCATE() eller FLOOR() .

    Returnerer argumentet X avrundet til et tall med D desimaler. Hvis D er 0, vil resultatet bli presentert uten desimal eller brøkdel:

    Mysql> VELG RUNDE(1,298, 1);-> 1.3 mysql> VELG RUNDE(1,298; 0); -> 1

    Returnerer verdien av e (grunnlaget for naturlige logaritmer) hevet til potensen av X:

    Mysql> VELG EXP(2);-> 7.389056 mysql> VELG EXP(-2); -> 0.135335

    Returnerer den naturlige logaritmen til X:

    Mysql> VELG LN(2);-> 0,693147 mysql> VELG LN(-2);-> NULL

    Denne funksjonen ble introdusert i MySQL 4.0.3. Dette er et synonym for LOG(X) .

    Hvis kalt med én parameter, returnerer den naturlige logaritmen til X:

    Mysql> VELG LOGG(2);-> 0,693147 mysql> VELG LOGG(-2);-> NULL

    Hvis den kalles med to parametere, returnerer funksjonen logaritmen til X over grunntallet B:

    Mysql> VELG LOGG(2.65536);-> 16.000.000 mysql> VELG LOGG(1,100);-> NULL

    Alternativet for å spesifisere en logaritmebase ble introdusert i MySQL 4.0.3. LOG(B,X) er ekvivalent med LOG(X)/LOG(B) .

    Returnerer grunntallet 2-logaritmen til X:

    Mysql> VELG LOG2(65536);-> 16.000.000 mysql> VELG LOGG2(-100);-> NULL

    LOG2()-funksjonen er nyttig for å finne ut hvor mange biter et tall trenger å lagre. Denne funksjonen ble lagt til i MySQL 4.0.3. I eldre versjoner, kall LOG(X)/LOG(2) i stedet

    Returnerer desimallogaritmen til et tall X:

    Mysql> VELG LOGG10(2);-> 0,301030 mysql> VELG LOGG10(100);-> 2.000.000 mysql> VELG LOGG10(-100);-> NULL

    POW(X,Y) , POWER(X,Y)

    Returnerer verdien av argumentet X hevet til potensen av Y:

    Mysql> VELG POW(2,2);-> 4.000.000 mysql> VELG POW(2,-2); -> 0.250000

    Returnerer ikke-negativ Kvadratrot tall X:

    Mysql> VELG SQRT(4);-> 2.000.000 mysql> VELG SQRT(20); -> 4.472136

    Returnerer verdien av pi. Som standard er 5 desimaler representert, men MySQL bruker full dobbel presisjon for å representere pi for interne beregninger.

    Mysql> VELG PI();-> 3.141593 mysql> VELG PI()+0,00000000000000000000; -> 3.141592653589793116

    Returnerer cosinus til et tall X, der X er gitt i radianer:

    Mysql> VELG COS(PI()); -> -1.000000

    Returnerer sinusen til X, der X er gitt i radianer:

    Mysql> VELG SIN(PI()); -> 0.000000

    Returnerer tangensen til et tall X, der X er gitt i radianer:

    Mysql> VELG TAN(PI()+1); -> 1.557408

    Returnerer buekosinus til tallet X, dvs. en mengde hvis cosinus er lik X. Hvis X ikke er i området -1 til 1 , returnerer NULL:

    Mysql> VELG ACOS(1);-> 0,000000 mysql> VELG ACOS(1,0001);-> NULL mysql> VELG ACOS(0); -> 1.570796

    Returnerer arcsinus til tallet X, dvs. en størrelse hvis sinus er lik X. Hvis X ikke er i området -1 til 1 , returnerer NULL:

    Mysql> VELG ASIN(0.2);-> 0,201358 mysql> VELG ASIN("foo"); -> 0.000000

    Returnerer arctangensen til nummer X, dvs. en størrelse hvis tangent er lik X:

    Mysql> VELG ATAN(2);-> 1.107149 mysql> VELG ATAN(-2); -> -1.107149

    ATAN(Y,X) , ATAN2(Y,X)

    Returnerer arctangensen til to variabler X og Y. Beregningen gjøres på samme måte som arctangensen til Y/X, bortsett fra at fortegnene til begge argumentene brukes til å bestemme kvadranten til resultatet:

    Mysql> VELG ATAN(-2,2);-> -0,785398 mysql> VELG ATAN2(PI(),0); -> 1.570796

    Returnerer cotangensen til tallet X:

    Mysql> VELG COT(12);-> -1.57267341 mysql> VELG COT(0);-> NULL

    RAND() , RAND(N)

    Returnerer tilfeldig variabel flytende komma i området fra 0 til 1,0. Hvis et heltallsargument N er spesifisert, brukes det som startverdien til denne verdien:

    Mysql> VELG RAND();-> 0,9233482386203 mysql> VELG RAND(20);-> 0,15888261251047 mysql> VELG RAND(20);-> 0,15888261251047 mysql> VELG RAND();-> 0,63553050033332 mysql> VELG RAND(); -> 0.70100469486881

    I ORDER BY-uttrykk bør du ikke bruke en kolonne med RAND()-verdier fordi bruk av ORDER BY-operatoren vil resultere i flere beregninger på den kolonnen. I MySQL 3.23 kan du imidlertid gjøre følgende setning: SELECT * FROM tabellnavn ORDER BY RAND() : Dette er nyttig for å få en tilfeldig instans fra et sett SELECT * FROM tabell1,tabell2 WHERE a=b OG c

    Hvis to eller flere argumenter er gitt, returnerer det minste argumentet (minimumverdi). Argumenter sammenlignes i henhold til følgende regler:

    • Hvis returverdien brukes i en heltallskontekst (INTEGER), eller alle argumenter er heltall, sammenlignes de som heltall.

      Hvis returverdien brukes i sammenheng med reelle tall (REAL) eller alle argumenter er reelle tall, sammenlignes de som tall av typen REAL.

      Hvis ett av argumentene er en streng som skiller mellom store og små bokstaver, sammenlignes argumentene på en måte som skiller mellom store og små bokstaver.

      Ellers sammenlignes argumentene som strenger som ikke skiller mellom store og små bokstaver.

    mysql> VELG MINST(2,0);-> 0 mysql> VELG MINST(34.0;3.0;5.0.767.0);-> 3.0 mysql> VELG MINST("B","A","C");-> "A"

    I MySQL-versjoner før 3.22.5 kan du bruke MIN() i stedet for MINST.

    STØRST(X,Y,...)

    Returnerer den største (med maksimal verdi) argument. Argumentsammenligning følger de samme reglene som for MINST:

    Mysql> VELG STØRSTE(2,0);-> 2 mysql> VELG STØRSTE(34.0;3.0;5.0.767.0);-> 767.0 mysql> SELECT GREATEST("B","A","C");-> "C"

    I MySQL-versjoner før 3.22.5 kan du bruke MAX() i stedet for GREATEST .

    Returnerer argumentet X konvertert fra radianer til grader:

    Mysql> VELG GRADER(PI()); -> 180.000000

    Returnerer argumentet X konvertert fra grader til radianer:

    Mysql> VELG RADIANER(90); -> 1.570796

    Returnerer tallet X avkortet til D desimaler. Hvis D er 0, vil resultatet bli presentert uten desimal eller brøkdel:

    Mysql> VELG TRUNCATE(1.223,1);-> 1.2 mysql> SELECT TRUNCATE(1.999,1);-> 1.9 mysql> SELECT TRUNCATE(1.999,0);-> 1 mysql> SELECT TRUNCATE(-1.999,1); -> -1.9

    Fra og med MySQL 3.23.51 er alle tall avrundet mot null.

    Hvis D er negativ, tilbakestilles hele delen av tallet til null:

    Mysql> VELG TRUNCATE(122,-2); -> 100

    Det bør tas i betraktning at vanligvis i datamaskiner desimaltall lagres ikke som heltall, men som flytende desimaltall med dobbel presisjon (DOUBLE). Derfor kan resultatet noen ganger være misvisende, som i følgende eksempel:

    Mysql> VELG TRUNCATE(10.28*100.0); -> 1027

    Dette er fordi 10.28 faktisk er lagret som noe sånt som 10.2799999999999999.

For å kunne bruke disse funksjonene må du kompilere PHP med MySQL-støtte.

Installasjon

Med --with-mysql-konfigurasjonsalternativet aktiverer du PHP-tilgang til MySQL-databasen. Hvis du bruker dette alternativet uten å spesifisere en MySQL-bane, vil PHP bruke de innebygde MySQL-klientbibliotekene. I PHP4 MySQL-støtte alltid på; Hvis du ikke spesifiserer dette konfigurasjonsalternativet, brukes de koblede bibliotekene. Brukere som kjører andre applikasjoner som bruker MySQL (for eksempel når de kjører PHP 3 og PHP 4 som konkurrerende Apache-moduler, eller auth-mysql), bør alltid spesifisere banen til MySQL: --with-mysql=/path/to/mysql . Dette vil tvinge PHP til å bruke klientbibliotekene installert av MySQL, og eliminere eventuelle konflikter.

Installasjon

Oppførselen til MySQL-funksjoner bestemmes av innstillingene i den globale php.ini-konfigurasjonsfilen.

Tabell 1. MySQL-konfigurasjonsalternativer
NavnMisligholde Foranderlig
mysql.allow_persistent"På"PHP_INI_SYSTEM
mysql.max_persistent"-1" PHP_INI_SYSTEM
mysql.max_links "-1" PHP_INI_SYSTEM
mysql.default_portNULLPHP_INI_ALL
mysql.default_socketNULLPHP_INI_ALL
mysql.default_host NULLPHP_INI_ALL
mysql.default_userNULLPHP_INI_ALL
mysql.default_passwordNULLPHP_INI_ALL

For flere detaljer og definisjonen av PHP_INI_* konstantene, se ini_set() .

Her Kort beskrivelse konfigurasjonsdirektiver.

mysql.allow_persistent boolsk mysql.max_persistent heltall

Maksimalt antall vedvarende MySQL-tilkoblinger per prosess.

mysql.max_links heltall

Maksimalt antall vedvarende MySQL-tilkoblinger per prosess, inkludert vedvarende tilkoblinger.

mysql.default_port streng

Standard TCP-portnummer som skal brukes når du kobler til databaseserveren hvis ingen annen port er spesifisert. Hvis en standardport ikke er spesifisert, hentes verdien fra miljøvariabel MYSQL_TCP_PORT , mysql-tcp-forekomster i /etc/services, eller kompileringstidskonstanter MYSQL_PORT, i den rekkefølgen. Win32 bruker bare MYSQL_PORT-konstanten.

mysql.default_socket streng

Standard socketnavn som skal brukes når du kobler til den lokale databaseserveren med mindre et annet socketnavn er spesifisert.

mysql.default_host streng

Standard serververt som skal brukes når du kobler til den lokale databaseserveren hvis ingen annen vert er spesifisert. Ikke prøvd i sikker modus.

mysql.default_user streng

Standard brukernavn som skal brukes når du kobler til databaseserveren med mindre annet er spesifisert. Gjelder ikke i sikker modus.

mysql.default_password streng

Standardpassordet som skal brukes når du kobler til databaseserveren hvis ikke noe annet passord er angitt. Gjelder ikke i sikker modus.

Det er to typer ressurser som brukes i en MySQL-modul. Den første er koblingsidentifikatoren for å koble til databasen, den andre er ressursen som inneholder resultatet av spørringen.

Forhåndsdefinerte konstanter

Tabell 2. MySQL gjenfinningskonstanter

Eksempler

Dette eksemplet viser hvordan du kobler til en database, kjører en spørring, skriver ut resultatradene og kobler fra MySQL-databasen.

Innhold mysql_affected_rows - får antall rader involvert i en tidligere MySQL-operasjon mysql_change_user - endrer pålogget/pålogget bruker i en aktiv tilkobling mysql_character_set_name - returnerer tegnsettets navn mysql_close - lukker en MySQL-tilkobling mysql_connection mysql_connect the - åpner en oppretter en MySQL-database mys ql_data_seek - flytter intern resultatpeker mysql_db_name - mottar resultatdata mysql_db_query - sender MySQL-spørring mysql_drop_db - sletter en MySQL-database mysql_errno - returnerer numerisk verdi feilmeldinger fra en tidligere MySQL-operasjon mysql_error - returnerer feilmeldingsteksten fra en tidligere MySQL-operasjon mysql_escape_string - mnemoniserer/unnslipper en streng for bruk i mysql_query mysql_fetch_array - henter resultatserien som assosiativ matrise, numerisk matrise eller begge MySQL_FETCH_ASSOC - trekker ut den resulterende serien som et assosiativt massiv MySQL_FETCH_FILD - mottar kolonneinformasjon fra resultatet og returnerer som MySQL_FETCH_LENGTHS-objektet - får lengden på hver utgang som et resultat av mySQL_FETCH_row_OBJECT som et MySQL_FETCH_row_OBJECT-objekt - MySQL_FETCH_row_OBJECT en resulterende serie i oppføringsmatrisen MySQL_FILD_FLAGS - mottar flagg assosiert med det spesifiserte feltet i resultatet mysql_field_len - returnerer lengden på det spesifiserte feltet i resultatet