|
Сега искаме да направим функция, която да ни връща имената и адресите, за да можем да разпечатаме пликове в които да им изпратим коледни премии – по 1 седмица почивка на планина:
CODE
За да извикаме функцията е достатъчно да изпълним CODE
Знаейки, че сложните тиипове данни се представят като хешове в PERL, можем да напишем и функция, която връща сложен тип. За целта обаче трябва първо да създадем необходимия ни тип: CODE
След това дефинираме една функция, която да връща стойност от този тип: CODE
Всяка колона, която сме изпуснали да върнем във функцията приема стойност NULL. Трябва обаче да внимаваме за съответствията между типовете, които връщаме и декларираните типове в сложния тип. Функциите ни могат не само да връщат скаларни и сложни типове, а и цели масиви от такива типове. За пример ще вземем последната ни функция и ще я преобразуваме така, че да връща 4 стойности от тип my_composite_type: CODE
PERL функциите в PostgreSQL могат да манипулират базата данни посредством специалната функция spi_exec_query(query) . Нека да се върнем на примера с гаровите служители. Решаваме, че ни трябва телефонен указател на персонала и съответно трябва да си напишем функцията, която ще го прави. Телефонният указател ще представлява таблица с две колони: името на служителя и телефонния му номер. За целта ще дефинираме нов тип phonebook: CODE
Сега вече можем спокойно да напишем функцията „телефонен указател“: CODE
Можем да извикаме функцията си със SELECT * FROM phnbk(); и ще получим таблица, подобна на тази: mytestdb=# SELECT * FROM phnbk(); ime | tel -------------+------------ Petyr Dimow | 052/612000 Iwan Iwanow | 052/612612 (2 rows) В PERL имплементацията в PostgreSQL има един голям недостатък – PERL функциите не се „виждат“ една друга и в този смисъл не могат да се извикват. Все пак можем да използваме глобални стойности като съхраняваме информацията си в сподоления хеш %_SHARED. %_SHARED ни дава възможнст също да извикваме функции една от друга с помощта на споделени референции, което премахва до голяма степен проблема с „видимостта“ между отделните функции. Ето един малък пример за функция, която премахва интервалите от даден низ: CODE
След като сме написали тази функция, трябва да я активираме. Това става като я изпълним със SELECT заявка: SELECT strip_spaces(); След това дефинираме функция, която да използва предната: CODE
Използваме &$stripper след return, защото $stripper е референция към подпрограмата(функцията). Употребата на PERL в PostgreSQL е ограчинена с оглед на сигурността, тъй като всеки потребител, който има база данни в една PostgreSQL DMBS може да дефинира PERL функции. Последните не могат да зареждат външни модули, да пишат и четат файлове от файловата система или по какъвто и да било начин да взаимодействат с платформата, придобивайки правата на сървъра. Когато все пак ни се налага да дефинираме такава функция и имаме администраторски достъп до сървъра просто трябва да променим plperl на plperlu. Когато използвате PERL, за да добавяте функции към PostgreSQL винаги мислете какво количество данни и в какви типове ще обработвате, защото PERL съхранява всички масиви и хешове в оперативната памет и това може да забави значително или даже да остави системата без свободна оперативна памет.
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||









