49
және anyrange типтер. Функцияның хабарлануында осы типтер қолданылса,
онда ол функция
полиморфты деп аталады. Полиморфты функция көптеген
әр түрлі мәліметтер типтерімен жұмыс жасай алады; нақты тип шақыруда
берілген мәнге байланысты анықталады. Полморфты аргументтер және
нәтижелер бір
бірімен байланыста болады және полиморфты функция
шақыратын сұранысты талдауда білгілі бір мәліметтер типіне келтіріледі.
anyelement деп хабарланған әрбір позицияда (аргменттерде немесе
қайтарылатын мәнде) кез келген нақты мәліметтер типі жіберіле алады, бірақ
әрбір нақты шақыруда барлық осы нақты типтер бірдей болуы шарт. Аналогты
түрде, anyarray деп хабарланған әрбір позицияда массивтің кез келген
мәліметтер типі жіберіле алады, алайда массвтің барлық нақты типтері сәйкес
келуі керек. anyrange деп хабарланған барлық позициялар секілді бірдей
тип
диапазон берлуі керек. Сонымен қатар, егер кейбір позициялар anyarray
деп аталған болса, ал басқалары anyelement деп, онда позициядағы нақты тип
anyarray массив болуы керек, өйткені оның элменттерінің типі anyelement
позициясындағы мәндерінің типімен сәйкес келеді. Осылайшы, егер бір
позициялар anyrange деп хабарланған, ал басқалалары anyelement болса, онда
нақты тип болып anyrange позициясындағы диапазон болуы керек, өйткені
оның подтипі anyelement позициясы жіберіп отырған типпен сәйкес келеді.
аnynonarray жалған типі дәл anyelement сияқты өңделеді, бірақ қосымша
шектеумен: нақты тип массив типі болмау керек. anyenum жалған типі де
anyelement секілді өңделеді, бірақ оның нақты типтері атап шығумен
шектеледі.
Осылайша, полиморфті типпен бірнеше аргумент хабарланған,
нәтижесінде тек белгілі бір нақты типтер комбинациялары рұқсат етіледі.
Мысалы, equal(anyelement, anyelement) ретінде хабарланған функция аргумент
ретінде кез келген екі мәнді қабылдайды, бірақ егер тек екеуінің типтері
сәйкес болған жағдайда. Функцияның қайтарылыған мәні мен полиморфті
типпен сәйкес келгенде, онымен бірге кем болмағанда бір аргумент
полиморфты болуы керек, және де дәл шақырылғанда нәтиженің нақты типі
жіберілген агрументтің нақты типі бойынша анықталады. Мысалы, массив
элементтерімен байланысатын механизмі жоқ болған жағдайда, оны
subscript(anyarray, integer) returns anyelement функция құру арқылы жүзеге
асыруға болады. Осындай хабарлануда бірінші нақты аргумент массив болуы
керек, және де одан сұранысты талдауда нәтиженің дұрыс типі шығарылады.
Басқа мысал ретінде f(anyarray) returns anyenum функциясын келтіруге болады,
ол тек массив тізімін қабылдап отырады. Назар аударатын жағдай: anynonarray
және anyenum айнымалылардың жеке типін көрсетпейді; anyelement секілді
дәл сол типтер, бірақ қосымша шектеулермен. Мысалы, f(anyelement,
anyenum) функциясын шақыру f(anyenum, anyenum) функциясын шақыруға
дәлме
дәл: екі нақты аргументтер бірдей тізім
типті болуы керек. Айнымалы
санды аргументтері бар функцияларда полиморфты болуы мүмкін: ол үшін
олардың соңғы параметрі VARIADIC anyarray ретінде сипатталады.
Аргументтерті сәйкестіндіруде және нәтиженің нақты типін анықтау
50
мақсаттары үшін осындай функция көрсетілімі anynonarray керекті
параметрлерінің саны хабараланған болғандағыдай.
6.3 Пайдаланушы функциялар
PostgreSQL
де фунцияның төрт түрі көрсетілген:
- сұраныс тіліндегі функциялар (SQL тілінде жазылған фунциялар);
- процедуралық тілдегі фунциялар (PL/pgSQL немесе PL/Tcl тілінде
жазылған функциялар);
- ішкі функциялар;
- С тіліндегі функциялар.
Кез келген түрдегі функциялар аргумент (параметр) ретінде негізгі
типті, құрамдас типті немесе екеуінің қосындысын қабылдай алады. Сонымен
қатар, кез келген функциялар негізгі немесе құрамдас типті мәндерді қайтара
алады. Тағы негізгі немесе құрамдас мәндер жинағын қайтаратын
функцияларды анықтауға болады. Көптеген түрдегі функциялар белгілі бір
жалған типтерді (мысалы, полиморфты) қабылдай алады немесе қайтара
алады, бірақ олармен жұмысқа керекті қол жетімді құралдар әр түрлі.
Функцияларды анықтауда ең оңайы SQL тілінде. SQL тіліндегі функцияларға
қатысты көптеген концепциялар басқа түрдегі функцияларға таралады.
6.4 Функцияларды қайта жүктеу
Пайдаланушы бірнеше бірдей SQL атымен функцияларды анықтай
алады, егер осы функциялар әр түрлі аргументтер қабылдаса ғана. Басқаша
айтқанда, функция аттарын қайта жүктеуге болады. Сұраныс орындалғанда,
сервер дәл қандай функцияны шақыру керектігін, оның мөлшерін және
берілген аргументтер типіна байланысты анықтайды. Қайта жүктеу белгілі бір
соңғы санға дейінгі айнымалы аргументтер санымен функцияны
имитациялауға пайдалы болуы мүмкін. Қайта жүктеу функция жанұясын
құрған жағдайда түсініксіздер болмауын қадағалау керек.
Мысалы, егер функция құрылса:
CREATE FUNCTION test(int, real) RETURNS ...
CREATE FUNCTION test(smallint, double precision) RETURNS ...
test(1, 1.5) қарапайым аргументті қандай функция шақыралатыны айқын емес.
Рұқсат етілген ережелері қазіргі уақытта іске асырылған, алайда осындай
ерекшелікке білінбей сүйінетін жүйені құру ақылдшы шешім емес. Құрамдас
типті бір аргументті қабылдайтын функциялар әдетте осы типтегі белгілі бір
атрибут (жол) атауымен сәйкес келетін атау берудің қажеттілгі жоқ. Еске
түсіру: атрибут(кесте) тең кесте.атрибут. Құрамдас типті қабылдайтын
функция мен құрамдас типті атрибут арасында түсініксіздік пайда болған
жағдайда әрдайым атрибут таңдалатын болады. Бұл таңдауды функция атын
сұлба (яғни, сұлба.функция(кесте)) қосу арқылы қайта анықтауға болады,
алайда басқа атаулар беріп бұл мәселеден қашық болған дұрыс. Басқа мәселе