it-place.net > Уроци > PostgreSQL
Не сте регистриран! Регистрирайте се БЕЗПЛАТНО, за да използвате услугите на сайта!

   Рубрики
 
 
 
 

 Форуми
» SEO и оптимизация
» Всичко за PHP и Perl
» Всичко за C, C++ и .NET
» Всичко за Java и JSP
» Всичко за SQL и MySQL
» Всичко за XHTML и CSS
» Презентация на сайтове
 Разширяване функционалността на PostgreSQL: Програмиране на функции с PERL
  1. Разширяване функционалността на PostgreSQL: Програмиране на функции с PERL
  2. Разширяване функционалността на PostgreSQL: Програмиране на функции с PERL - II
SOMNIVM
     
Автор  SOMNIVM (30.08.2006 09:40)  съобщение до автора
Погледнат  7216 пъти  добави към любими
Оценка  добави коментар
Гласове  --  изпрати на приятел
Коментари  (0)  абонирай се за PostgreSQL
    Страница 1 / 2

 



Разширяване функционалността на PostgreSQL: Програмиране на функции с PERL

Въведение. Функции. Процедурни езици (PLs) в PostgreSQL:

Възможността за разширяване на PostgreSQL се дължи на факта, че тази система за управление на бази данни (от тук нататък ще се използва DBMS – DataBase Management System) се управлява от каталог.  Каталозите се показват на потребителя във вид на таблица, но всъщност те са местата, където DBMS съхранява вътрешната си информация. Разликата между PostgreSQLи стандартнте релационни DBMS е, че PostgreSQL съхранява в каталозите си не само информация за базите данни, таблиците и колоните, а също така и за типовете данни, функциите, методите за достъп и т.н. Каталозите могат да бъдат променяни от потребителя и в този смисъл PostgreSQL може да бъде разширявана динамично от потребителя, докато при конвенционалните DBMS единствените начини за разширяване на функционалността са чрез добавяне на функции в сорс кода или, чрез зареждане на модули, написани специално от производителя на системата. В PostgreSQL потребителят може да задава нови функции и типове в процеса на работа без да се налага да спира, рестартира или прекомпилира DBMS.
Функциите в PostgreSQL се характеризират със свойство волатилност (volatility), което може да приема стойности VOLATILE, STABLE или IMMUTABLE. По подразбиране, когато не е указано друго, функциите са VOLATILE. Когато една функция е VOLATILE, тя може да променя базите данни, да връща различен резултат при всяко извикване със същите аргументи. STABLE функциите не могат да променят базата данни и са „задължени“ да връщат един и същ резултат при едни и същи аргументи в рамките на заявката в която са използвани. И накрая IMMUTABLE функциите – те не могат да променят базата данни и връщат еднакъв резултат при всяко извикване със същите аргументи. Например функцията, която стои зад оператора за събиране на цели числа + е IMMUTABLE, защото когато и да извикаме 3+4 ще получим 7.
В PostgreSQL могат да бъдат дефинирани повече от 1 функции, използващи същото име, стига аргументите, които взимат да са от различен тип. Това се начира „презареждане“ на функциите. При изпълнение на заявка с презаредени функции, сървърът определя коя точно функция е извикана според типа на аргументите. От това следва, че особено трябва да се внимава за „препокриващи се“ типове. Например при дефинирани функции:

CODE
1
2
CREATE FUNCTION fnc(int) RETURNS ...
CREATE FUNCTION fnc(smallint) RETURNS ...

не е очевидно коя от двете функции ще бъде извикана при fnc(5).
Както току що видяхте функциите се създават с конструкцията CREATE FUNCTION. Последната разполага с не малко на брой опции и затова тук ще се спрем на една най-обща форма, която ще използваме в урока:

CODE
1
CREATE [OR REPLACE] FUNCTION function_name([[arg_name] arg_type [, ...]]) RETURNS return_type AS $$ #тука е функцията ни $$ LANGUAGE plperl [VOLATILE | STABLE | IMMUTABLE] ;

Пример:
CODE
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
CREATE FUNCTION my_formula(real, real) RETURNS real AS $$
       
return ($_[0]^$_[1])-($_[0]+$_[1]);
$$
LANGUAGE plperl IMMUTABLE;
[code]
PostgreSQL позволява на потребителите да пишат функции и на SQL, C, pgSQL, Tcl, Perl, Python и др. Последните четири се наричат процедурни езици (по-нататък ще използваме за по-кратко PLs). За да може един PL да бъде използван в дадена база данни, трябва първо той да се зареди в нея или да е зареден в базата данни, която е послужила за шаблон при създаването на тази в която искаме да го заредим. По подразбиране, ако не е указано друго, всички бази данни в PostgreSQL използват за шаблон template1. Зареждането на PL става с командата createlang <procedural_language> <database>. Пример:

[color=blue]somnivm@verseau:~$ createlang plperl mytestdb[/color]

Ако се опитаме да заредим вече зареден език, ще получим:

[color=blue]somnivm@verseau:~$ createlang plperl mytestdb
createlang: language "plperl" is already installed in database "mytestdb"[/color]

Програмиране на функции с
PERL:

Синтаксисът на
CREATE FUNCTION изисква инструкциите на функцията да са въведени като константен низ. Най-удобно е да се използват два последователни знака $, за да ограждаме функциите си. Например:

[code]CREATE FUNCTION return_input(integer) RETURNS integer AS $$
       
return $_[0];
$$
LANGUAGE plperl;

Аргументите към PERL функцията се намират в масива @_ и могат да бъдат извлечени, чрез $_[0], $_[1], $_[2], $_[3] ... $_[n] или чрез конструкция от сорта на my ($arg1, $arg2, $arg3) = @_; За пример ще използваме функция, която да ни връща произведението върху сбора на две числа:

CODE
1
2
3
4
5
CREATE FUNCTION mult_div_add(real, real) RETURNS real AS $$
       
if(!defined $_[0] || !defined $_[1]) { return undef; }
       
if($_[0] == 0 && $_[1] == 0) { return undef; }
       
return ($_[0]*$_[1])/($_[0]+$_[1]);
$$
LANGUAGE plperl;

На първите два реда от функцията проверяваме дали някоя от въведените стойности не е NULL или пък и двата аргумента не са 0 (нула) и ако е така връщаме undef, което се интерпретира от PostgreSQL като NULL. Добре е винаги да правим такава проверка, защото PERL възприема NULL като 0 (нула), а това може да доведе до големи главоболия – най-малкото заявката Ви може да пропадне, заради деление на 0.
PERL функциите могат да приемат и сложни типове данни. Последните се предават като хешове. Нека се върнем на примера с ж.п гарата от урока „Views, Foreign Keys, Транзакции и Унаследяване“.  Там имахме таблицата „служители“, която бяхме дефинирали така:

CODE
1
2
3
4
5
6
7
8
CREATE TABLE slujiteli (
       
id SERIAL PRIMARY KEY,
       
ime VARCHAR(50) NOT NULL,
       
adres VARCHAR(100) NOT NULL,
       
tel VARCHAR(14) NOT NULL,
       
dlyjnost VARCHAR(20) NOT NULL,
       
zaplata REAL NOT NULL
);



  Следваща страница >> 


Ключови думи: postgresql база данни функция процедура процедурни езици


Още уроци от тази рубрика


 
  • Подобни теми от myLinks
 

 За автора: SOMNIVM  
Информатик!
   
 1 посетител чете този урок (0 потребители и 1 гост)  
Активни потребители: ---
   
  

Еmail  
 

 

 
  • Интересно от Софтуер
 



IT-PLACE.NET © 2004 - 2008