Funksiya yaratish
Ushbu qo'llanmada PostgreSQLda foydalanuvchi tomonidan yaratiladigan maxsus funksiyalarni (user-defined functions) tuzish uchun CREATE FUNCTION buyrug'idan qanday foydalanishni o'rganasiz.
Funksiya — bu ma'lum bir vazifani bajaradigan qayta ishlatiluvchi kod blokidir. Masalan, CONCAT() funksiyasi ikki yoki undan ortiq matnni bitta qatorga birlashtirish imkonini beradi. CONCAT() — bu PostgreSQLning o'rnatilgan (ichki) funksiyasidir.
PostgreSQL CREATE FUNCTION buyrug'i orqali o'z shaxsiy funksiyalaringizni yaratish imkonini beradi. Bunday funksiyalar foydalanuvchi funksiyalari (user-defined functions) deb ataladi.
Foydalanuvchi funksiyasi kirish parametrlarini qabul qiladi, bir yoki bir nechta SQL buyruqlarini bajaradi va bitta yoki bir nechta natijaviy qiymatlarni qaytaradi. Ular murakkab biznes-mantiqni ma'lumotlar bazasida inkapsulyatsiya qilish va qayta-qayta ishlatish uchun xizmat qiladi.
CREATE FUNCTION buyrug'ining asosiy sintaksisi:
CREATE [OR REPLACE] FUNCTION function_name (parameters)
RETURNS return_type
AS
$$
-- funksiya tanasi
$$
LANGUAGE SQL;
Sintaksis tushuntirishi:
CREATE [OR REPLACE] FUNCTION — yangi funksiya yaratadi. Agar bunday nomdagi funksiya allaqachon mavjud bo'lsa, OR REPLACE opsiyasi uni yangilaydi.function_name (parameters) — funksiya nomi va uning qabul qiladigan parametrlari ro'yxati.RETURNS return_type — funksiya qaytaradigan qiymatning ma'lumot turi. Agar funksiya hech qanday qiymat qaytarmasa, return_type sifatida VOID ko'rsatiladi.AS $$ ... $$ — dollar bilan o'ralgan belgilar ($$) orasida funksiya tanasi joylashadi.LANGUAGE SQL — funksiya qaysi tilda yozilganini belgilaydi. SQLdan tashqari boshqa protsedurali dasturlash tillari (masalan, PL/pgSQL) ham ishlatilishi mumkin.PostgreSQL funksiya tanasini satr ko'rinishida saqlaydi. Agar oddiy satrlardan ('...') foydalanilsa, funksiya ichidagi barcha qo'shtirnoq va maxsus belgilarga escape qilish (\') talab etiladi. Buni o'qishni osonlashtirish uchun PostgreSQL dollar bilan o'ralgan satr sintaksisini taqdim etadi ($$ ... $$).
Funksiyani chaqirish uchun SELECT buyrug'idan foydalaniladi:
SELECT function_name(arguments);
Misollarni amalda sinash uchun quyidagi jadvallarni yaratib olamiz:
DROP TABLE IF EXISTS inventories CASCADE;
DROP TABLE IF EXISTS warehouses CASCADE;
DROP TABLE IF EXISTS products CASCADE;
CREATE TABLE products (
product_id INT GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
product_name VARCHAR(100) NOT NULL,
price DECIMAL(10, 2) NOT NULL
);
CREATE TABLE warehouses (
warehouse_id INT GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
warehouse_name VARCHAR(100) NOT NULL,
address VARCHAR(255) NOT NULL
);
CREATE TABLE inventories (
product_id INT REFERENCES products(product_id),
warehouse_id INT REFERENCES warehouses(warehouse_id),
quantity INT NOT NULL,
PRIMARY KEY (product_id, warehouse_id)
);
INSERT INTO products (product_name, price) VALUES
('Samsung Galaxy S24', 999.99),
('Apple iPhone 15', 899.99),
('Dell XPS 15', 1499.99);
INSERT INTO warehouses (warehouse_name, address) VALUES
('San Jose Warehouse', '205 E Alma Ave, San Jose, CA 95112'),
('San Francisco Warehouse', '233 E Harris Ave, South San Francisco, CA 94080'),
('Los Angeles Warehouse', '1919 Vineburn Avenue, Los Angeles, CA 90032');
INSERT INTO inventories (product_id, warehouse_id, quantity) VALUES
(1, 1, 120),
(2, 1, 80),
(3, 1, 50),
(1, 2, 150),
(2, 2, 90),
(3, 2, 60),
(1, 3, 110),
(2, 3, 70),
(3, 3, 40);
Quyidagi misol yangi ombor ma'lumotlarini qabul qilib, warehouses jadvaliga qo'shadigan funksiya yaratadi:
CREATE OR REPLACE FUNCTION add_warehouse (
name VARCHAR,
location VARCHAR
)
RETURNS VOID
AS
$$
INSERT INTO warehouses(warehouse_name, address)
VALUES(name, location);
$$
LANGUAGE SQL;
Bu yerda:
add_warehouse ikkita VARCHAR parametr qabul qiladi: name va location.RETURNS VOID funksiya hech narsa qaytarmasligini bildiradi.INSERT INTO warehouses bajariladi.Funksiyani chaqiramiz:
SELECT add_warehouse('San Mateo', '2222 S Delaware St, San Mateo, CA 94403');
Natijani tekshirish:
SELECT warehouse_name, address FROM warehouses;
Natija:
warehouse_name | address
-------------------------+-------------------------------------------------
San Jose Warehouse | 205 E Alma Ave, San Jose, CA 95112
San Francisco Warehouse | 233 E Harris Ave, South San Francisco, CA 94080
Los Angeles Warehouse | 1919 Vineburn Avenue, Los Angeles, CA 90032
San Mateo | 2222 S Delaware St, San Mateo, CA 94403
Quyidagi funksiya barcha mahsulotlarning umumiy zaxira qiymatini hisoblab beradi:
CREATE OR REPLACE FUNCTION get_inventory_amount ()
RETURNS DEC
AS
$$
SELECT SUM(quantity * price)
FROM inventories
JOIN products USING (product_id);
$$
LANGUAGE SQL;
Funksiyani chaqirish:
SELECT get_inventory_amount() AS inventory_amount;
Natija:
inventory_amount
------------------
827992.30
Funksiya butun boshli jadval (bir nechta qator va ustunlar) qaytarishi mumkin. Buning uchun RETURNS TABLE (...) sintaksisi ishlatiladi:
CREATE OR REPLACE FUNCTION get_inventory_amount_by_warehouses ()
RETURNS TABLE (
warehouse_name VARCHAR,
amount DEC
)
AS
$$
SELECT
warehouse_name,
SUM(quantity * price) AS amount
FROM
inventories
JOIN products USING (product_id)
JOIN warehouses USING (warehouse_id)
GROUP BY warehouse_name
ORDER BY warehouse_name;
$$
LANGUAGE SQL;
Jadval qaytaradigan funksiyani xuddi oddiy jadval kabi FROM bandida chaqirish mumkin:
SELECT * FROM get_inventory_amount_by_warehouses();
Natija:
warehouse_name | amount
-------------------------+-----------
Los Angeles Warehouse | 242997.80
San Francisco Warehouse | 320997.00
San Jose Warehouse | 263997.50
Avval product_info nomli tarkibiy turni yaratib olamiz:
CREATE TYPE product_info AS (
product_name VARCHAR,
price DECIMAL
);
Endi berilgan ID bo'yicha mahsulot ma'lumotlarini ushbu tur ko'rinishida qaytaruvchi funksiya tuzamiz:
CREATE OR REPLACE FUNCTION get_product_info (id INT)
RETURNS product_info
AS
$$
SELECT product_name, price
FROM products
WHERE product_id = id;
$$
LANGUAGE SQL;
Funksiyani chaqirish:
SELECT * FROM get_product_info(1);
Natija:
product_name | price
--------------------+--------
Samsung Galaxy S24 | 999.99
CREATE FUNCTION buyrug'i ma'lumotlar bazasida maxsus foydalanuvchi funksiyalarini yaratadi.OR REPLACE mavjud funksiyani xatosiz yangilash imkonini beradi.RETURNS VOID), yagona qiymat qaytarishi (RETURNS type), jadval qaytarishi (RETURNS TABLE (...)) yoki kompozit tur qaytarishi mumkin.