Tải bản đầy đủ

Tìm hiểu về PostgreSQL

TÌM HIỂU POSTGRESQL
I POStGRESQL LÀ GÌ?
Postgresql: là một hệ quản trị cơ sở dữ liệu quan hệ làm việc trên mơ hình client/server.

Ngồi ra, Postgresql còn là ngơn ngữ kết hợp khả năng có ý nghĩa của SQL với nhiều đặc
điểm đặc trưng của ngơn ngữ lập trình.
PL/PGSQL có thể gắn vào trong nó những cấu trúc điều khiển như : Điều kiện
(Conditional),vòng lập (Loops),ngoại lệ(Exception handling) của ngơn ngữ lập trình

Ưu điểm:


Quan hệ đối tượng : trong postgreSQL thì mỗi bảng là 1 class



Mã nguồn mở nên miễn phí



Xử lý transaction




Posgresql có thể truy xuất chạy trên nhiều hệ điều hành (như Window , Linux).



Được cải tiến liên tục

II CÀI ĐẶT
1 Trên Window
Download phần mềm từ http://www.postgresql.com về máy .
- Chọn file setup.exe để cài đặt phần mềm .
- lựa chọn các u cầu theo hướng dẫn cài đặt (bạn nhớ là phải cài ở ổ đĩa chia theo NTFS)

- Start server : Chọn …:\posgesql\pgAdmin III để start server.
2 Trên Linux
- bạn vơ trang web: www.posgresql. org rồi download 3 packages sau: postgresql, posgresql_libs,
postgresql_server
- sau đó bạn bỏ vào 1 thư mục rỗng
- để cài đặt postgresql ở trong linux thì bạn phải ở quyền cao nhất (như root chẳng hạn)
- sau đó bạn đánh lệnh cd để chuyển tới thư mục chứa những packages mà bạn mới tải về
- đánh lệnh rpm để tiến hành cài đặt
Vd: # rpm –ihv *.rpm


III TÌM HIỂU VÀ SỬ DỤNG
1Các kiểu dữ liệu trong postgreSQL
Định nghĩa kiểu dữ liệu : Kiếu dữ liệu dùng để quy định kiểu cho một cột khi tạo bảng.
Thuận lợi (của việc dùng kiểu dữ liệu) là đảm bảo data trong CSDL có các đặc tính sau:

 Consistent Result: dữ liệu có tính nhất quán.
 Data Validation: kiểm tra tính hợp lệ của dữ liệu.
 Compact Storage: lưu dữ liệu chặt chẽ hơn.
 Performance: thực hiện các thao tác trên CSDL dễ dàng hơn.
Các kiểu dữ liệu trong postgreSQL:


Character String: là kiểu chuỗi của nhiều chữ cái, số, dấu câu hay một số ký tự
khác. Có 3 kiểu trong Character String:




Text : này không giới hạn số ký tự khi lưu vào CSDL.



VarChar(length): số ký tự được lưu có thể thay đổi và nhiều nhất
là bằng length.



Char (length): số ký tự được lưu sẽ chính xác bằng length ( nếu
khi nhập vào số ký tự nhỏ hơn length thì nó sẽ tạo ra các ký tự mặc
định để lấp vào khoảng trống còn lại).



Number: kiểu dữ liệu number cho phép ta lưu số


Interger: có thể lưu số có giới hạn trong vùng ± 2 tỉ.



Int2: có thể lưu số có giới hạn trong vùng ± 32 nghìn.



Int8: có thể lưu số có giới hạn trong vùng ± 4 x 1018



OID: dùng để lưu đối tượng định danh trong postgres.




Numeric (precision, decimal): precision là số lượng chữ số ở phần
nguyên, decimal là số chữ số ở phần thập phân(do user quy
định).Các thao tác trong kiểu này thường chậm hơn so với các kiểu
number khác.



Float: cho phép lưu số có dấu phẩy động, có thể lưu 15 ký số phần
nguyên



Float4: cho phép lưu số có dấu phẩy động, có thể lưu 6 ký số phần
nguyên Còn phần thập phân của Float và Float4 thì được lưu ở vị
trí khác, phần thập phân có thể biểu diễn số lớn 4.78145e+32. Thao
tác trên dữ liệu của hai kiểu này sẽ có tốc độ nhanh.



Temporal: Cho phép lưu trữ kiểu ngày, giờ và thông tin về thời gian


Date: Cho phép lưu ngày kiểu year, month và day(nếu muốn thay
đổi ta phải dùng DATESTYPE setting để đổi).

vd : cách thể hiện 1 đối tượng kiểu date: 2005-12-25


Time: cho phép lưu dữ liệu kiểu hour, minute and second ( mỗi
phần sẽ cách nhau bằng dấu hai chấm).

VD: Cách thể hiện một đối tượng kiểu time: 24:00:10


TimeStamp: Cho phép lưu dữ liệu cả ngày và giờ
VD: Cách thể hiện một đối tượng kiểu timestamp:2005-11-20
11:30:00





Logical :Thể hiện dữ liệu kiểu logic




Interval: Thể hiện một khoản thời gian.

Logical: chỉ chứa 2 giá trị là True hay False(Ngòai ra còn có Null.)

Geometric :Thể hiện dữ liệu kiểu hình học giúp ta có thể lưu các đối tượng kiểu
hình học như: point, Lseg, Path, Box, Circle,Polygon.



NetWord : là kiểu mạng


INET: Cho phép lưu địa chỉ IP với netmask hoặc không có
netmask

Vd: Một Inet có netmask: 172.20.50.150 255.255.255.0


CIDR: cho phép lưu địa chỉ IP và có thêm số để chỉ kích cỡ của
mạng con

Vd : 172.20.50.150/24 (24 là số máy trong mạng có chứa máy có địa
chỉ IP là 172.20.50.150)




MACADDR: cho phép lưu địa chỉ MAC của 1 máy trên mạng ( là
phần mà nhà sản xuất ghi 1 số thông tin lên sản phẩm của mình).
VD:Một địa chỉ MAC được thể hiện: 0:50:4:1d:f6:db

2.Một số dạng hổ trợ cho kiểu trong postgres
2.1.Types conversing using cast(Thay đổi kiểu bằng cách dùng cast)
Trong hầu hết các trường hợp thì giá trị của một kiểu dữ liệu sẽ tự thay đổi. Nhưng có trường
hợp ta phải thay đổi chính xác qua một kiểu khác. Để thực hiện việc thay đổi này ta thực hiện
lệnh CAST
VD:Khi thay đổi từ val sang INTEGER ta thực hiện lệnh: cast(val AS INTEGER)
Hay viết cách khác là: val::integer
2.2. Các hàm hỗ trợ
Support funtions làm bạn có thể truy suất theo 1 thủ tục đặc biệt từ SQL.(Vì có những thao tác
funtion hổ trợ nhưng lệnh không thực hiện được).Funtions sẽ nhận vào 1 hay nhiều đối số và trả
về kết quả
VD: Khi bạn muốn chuyển một chuỗi hay một cột sang chữ hoa thì POSTGRESQL có 1 chức
năng upper để thực hiện.
- Cách chuyển chuỗi: upper(chuỗi )->chuỗi ở dạng chữ hoa.(upper(abc)->ABC).
- Cách chuyển cột:upper(cột)->cột ở dạng chữ hoa.



Ứng với từng kiểu dữ liệu sẽ có những funtion phù hợp.

Type
Character St

Funtion
length()
character_length()
octet_length()

Example
length(col)
character_length(col)
octet_length(col)

Returns
length of col
length of col, same as length()
length of col, including multibyte
overhead

trim()

trim(col)

col with leading and trailing spaces
removed


trim(BOTH…)

trim(BOTH, col )

same as trim()

trim(LEADING…)
trim(TRAILING…)
trim(…FROM…)

trim(LEADING col)
trim(TRAILING col)
trim(strFROM col)

col with leading spaces removed
col with trailing spaces removed
col with leading and trailing str spaces

rpad()
rpad()
lpad()
lpad()
uper()
lower()
initcap()
strpos()
position()
substr()
substring(…FROM..)

rpad(col,len)
rpad(col,len, str)
lpad(col,len)
lpad(col.len, str)
uper(col.len)
lower(col)
initcap(col)
strpos(col,str)
position(str in col)
substr(col, pos)
substring (col FROM

removed
col padded on the right to len characters
col padded on the right using str
col padded on the left to len characters
col padded on the left using str
col uppercased
col lowercased
col with the first letter capitalized
Position of str in col
Same as strpos()
col starting position pos
same as substr()

substr()
substring(…FROM…

pos)
substr(col, pos, len)
substring(col FROM

col starting position pos for length len
same as substr()

FOR..)

Number

Temporal

posFOR.len.)

translate()

translate(col, from, to)

Col with from changed to to

to_number()

to_number(col, mask)

Convert col to NUMERIC() based on

to_date()
to_timestamp()

to_date(col, mask)
to_timestamp(colm

mask
Convert col to DATE based on mask
Convert col to TIMESTAMP based on

round()
round()

mask)
round(col)
round(col, len)

mask
Round to an integer
NUMERIC() col rounded to len

trunc()
trunc()

trunc(col)
trunc(col, len)

abs()
factorial()
sqrt()
cbrt()
exp()
ln()
log()
to_char()
Date_part()
Extract(…FROM…)

abs(col)
factorial(col)
sqrt(col)
cbrt(col)
exp(col)
ln(col)
log(col)
to_char(col, mask)
Date_part(units, col)
Extract(units FROM
col)

decimal places
Truncate to an integer
NUMERIC() col truncated to len
decimal places
Absolute value
Factorial
square root
Cube root
Exponential
Natural logarithm
Base-10 logarithm
Convert col to a string based on mask
Units part of col
Same as date_part()


Isfinite()

Isfinite(col)

BOOLEAN indicating whether col is a

Now()

Now()

valid date
TIMESTAMP representing current date

Timeofday()

and time
String showing date/time in Unix

Overlaps()

Overlaps(c1,c2,c3,c4)

format
BOOLEAN indicating whether col’s

To_char()

To_char(col, mask)

Timeofday()

Geometric
network

NULL



overlap in time
Conver col to string based on mask
See psql’s \df for a list of germetric

Broadcast()
Host()
Netmask()
Masklen()
Network()
Nullif()

Broadcast(col)
Host(col)
Netmask(col)
Masklen(col)
Network( col)
Nullif(col1, col2)

funtion
Broadcast address of col
Host address of col
Netmask of col
Mask length of col
Network address of col
Return null if col1equals col2, else

Coalesce()

Coalesce(col1, col2,…)

return col1
Return first non_NULL argument

Ứng với từng funtion cũng sẽ có đối số(thông số truyền cho funtion) tương ứng.


VD:

Nếu bạn gọi một chức năng mà bạn truyền đối số không thích hợp thì postgesql sẽ báo lỗi.


(Trong câu truy vấn trên ‘5/8/1971’ là một chuỗi, nó không phải là ngày)
->Cách viết đúng:

2.3. Các Thao tác hỗ trợ
Tương tự như funtion, nó cũng có thao tác phù hợp với từng kiểu dữ liệu và có từng đối số phù hợp với
từng thao tác.

Sự khác biệt của operation với funtion là:
-Operation là một ký tự(symbol), không phải tên.
-Operation thường có 2 đối số(1 đối số ở bên trái, 1 đối số ở bên phải của operation)
VD: 2 + 3 -> 2 và 3 là đối số của operation +.


2.4. Các biến hỗ trợ
Một vài biến được định nghĩa trong postgresql như:

Các kiểu trên cung cấp cho thao tác so sánh chuẩn như:<, <=, =, >=, >, <>. Nếu các thao tác thực hiên trên
kiểu dữ liệu không thích hợp khác thì sẽ bị báo lỗi.
VD:

Cách sửa:

2.5 Arrays(mảng)
Mảng cho phép bạn lưu những giá trị của cột.
Mảng có nhiều loại: mảng 1 chiều, 2 chiều hay mảng có bất kỳ chiều do bạn quy định.
Một phần tử trong mảng có thể là một mảng khác.
Số lượng chiều và kích thước của mỗi chiều sẽ tùy vào mục đích của văn bản, nếu giá trị nhập vào
không phù hợp với số chiều và số cột quy định ban đầu thì giá trị đó sẽ bị loại ra.
VD: Mảng 1 chiều:{1,2,3,4,5}( mảng có kích thước 5 phần tử).
Mảng 2 chiều:{{1,2,3,4,5},{1,2,3,4,5}}(mảng có 2 dòng, 5 cột, mỗi cột có 5 phần tử)
2.6.Large Objects(BLOPs)
Dùng để lưu trữ số có giá trị lớn( hơn một vài nghìn) hay dữ liệu kiểu nhị phân. Nhìn chung Blops dùng
để lưu những đối tượng có dung lượng lớn.
Khi thêm dữ liệu vào CSDL thì dùng lo_import().


Khi gọi dữ liệu thao tác thì dùng lo_export().
VD: q trình tạo một đối tượng fruit và lưu giá trị vào CSDL:

Khi muốn truy xuất ban dùng hàm:

kết quả sẽ cho ra một dòng giá trị.

3 Transaction Processing
Transaction là 1 nhóm của 1 hoặc nhiều câu lệnh được coi như 1 đơn vò,
mà tất cả các câu lệnh bên trong hoặc là hoàn thành hoặc là
không hoàn thành, vì thế nếu có bất kỳ 1 sự cố nào đó xảy ra bên
trong 1 transaction thì nó sẽ rollback lại và vì thế không có bất cứ 1 sự
thay đổi nào
Để bắt đầu 1 transaction , thi hành lệnh BEGIN
Để kết thúc 1 transaction và có sự thay đổi trong database thì bạn thi
hành lệnh COMMIT
Để quay lại không làm gì cả , thi hành lệnh ROLLBACK
Cú pháp :
BEGIN TRANSACTION [ transaction_name]
SQL statements
COMMIT TRANSACTION [ transaction_name]
ROLLBACK TRANSACTION [ transaction_name]
Vd :
BEGIN TRANSACTION;
UPDATE customers
Set balance = 20
Where customer_id = 2
COMMIT TRANSACTION;
Các tính chất của transaction :


Độc lập : nghĩa là các transaction xử lý đồng thời, nhưng khơng phụ thuộc nhau.




Nhất quán : nghĩa là trước và sau khi thực hiện transaction thì dữ liệu phải nhất quán.



Nguyên tố : nghĩa là mỗi một transaction gồm 1 chuỗi các hành động, hoặc thành công tất cả
hoặc thất bại tất cả.

4 Triggers
Trigger là 1 hàm mà được gọi bất cứ khi nào khi có 1 sự kiện cụ thể xảy ra bên trong 1 bảng. Một lệnh
INSERT, UPDATE, DELETE có thể là nguyên nhân của 1 trigger được thi hành.
4.1 CREATE TRIGGER:

CREATE TRIGGER name { BEFORE | AFTER } { event [ OR ... ] }
ON table [ FOR [ EACH ] { ROW | STATEMENT } ]
EXECUTE PROCEDURE funcname ( arguments )
name : tên của một trigger mới được tạo ra.
BEFORE
AFTER : xác định hàm này sẽ được gọi trước hoặc sau sự
event : INSERT, UPDATE, or DELETE
table : tên của bảng mà trigger được đặt vào
FOR EACH ROW
FOR EACH STATEMENT This specifies whether the trigger procedure should

be fired once for every row
affected by the trigger event, or just once per SQL statement. If neither is specified, FOR EACH
STATEMENT is the default.
funcname A user-supplied function that is declared as taking no arguments and returning type trigger,
which is executed when the trigger fires.
arguments

An optional comma-separated list of arguments to be provided to the function when the trigger is
executed. The arguments are literal string constants. Simple names and numeric constants may be
written here, too, but they will all be converted to strings. Please check the description of the
implementation language of the trigger function about how the trigger arguments are accessible within
the function; it may be different from normal function arguments.
Vd:
CREATE FUNCTION timetrigger() RETURNS opaque AS '
BEGIN
UPDATE shop SET sold=''now'' WHERE sold IS NULL;
RETURN NEW;
END;
' LANGUAGE 'plpgsql';
CREATE TRIGGER inserttime AFTER INSERT
ON shop FOR EACH ROW EXECUTE
PROCEDURE timetrigger();

4.2 DROP TRIGGER

DROP TRIGGER name ON table [ CASCADE | RESTRICT ]
name : tên của trigger muốn remove.
table tên của bảng mà trigger đã được định nghĩa.
CASCADE : tự động xoá những đối tượng mà phụ thuộc vào trigger.
RESTRICT : từ chối xoá trigger nếu có bất kỳ đối tượng nào phụ thuộc trên
Vd: DROP TRIGGER if_dist_exists ON films;

4.3 ALTER TRIGGER

nó. Và đây là mặc định


ALTER TRIGGER name ON table RENAME TO newname
name : tên của trigger muốn sửa đổi.
table : tên của bảng mà trigger hoạt động.
newname: tên mới cho trigger.
Vd : ALTER TRIGGER emp_stamp ON emp RENAME TO emp_track_chgs;

5. Cursor
Có thể nghĩ rằng cursor như là tên của 1 result set .có thể định nghĩa biến cursor như bất kì các biến khác
Cú pháp
DECLARE cursor_name CURSOR FOR sql _statement
OPEN cursor_name
FETCH ……..
CLOSE cursor_name
Cấu trúc fetch
FETCH cursor-name INTO destination [ , destination [...]];

Destination hay destinations phải khớp với dạng của 1 dòng trả về bởi cursor
Ví dụ 1
DECLARE
rental_cursor
CURSOR FOR SELECT * FROM rentals;
tape_id
rentals.tape_id%TYPE;
customer_id
rentals.customer_id%TYPE;
rental_date
rentals.rental_date%TYPE;
BEGIN
OPEN rental_cursor;
FETCH rental_cursor INTO tape_id, customer_id, rental_date;
IF ( overdue( rental_date )) THEN
...

Ví dụ 2

DECLARE rental_cursor
CURSOR FOR SELECT * FROM rentals;
rental
rentals%ROWTYPE;
BEGIN
OPEN rental_cursor;
FETCH rental_cursor INTO rental;
-- I can now access rental.tape_id,
-- rental.customer_id, and rental.rental_date
-IF ( overdue( rental.rental_date )) THEN
...

Ví dụ 3

DECLARE
rental_cursor
CURSOR FOR SELECT * FROM rentals;
customer_cursor CURSOR FOR SELECT * FROM customers;
my_data
RECORD;
BEGIN
OPEN rental_cursor;
OPEN customer_cursor;
FETCH rental_cursor INTO my_data;
-- I can now refer to:
-my_data.tape_id
-my_data.customer_id
-my_data.rental_date
FETCH customer_cursor INTO my_data;
-- Now I can refer to:
-my_data.customer_id
-my_data.customer_name
-my_data.phone
-my_data.birth_date


-...

my_data.balance

Biến kiểu RECORD giống như kẻ đứng hoạt đầu để lấp dữ liệu vào có kiểu tùy thuộc vào (giống %ROW
TYPE)
Cursor biểu hiện bằng tham số
Là cursor giúp câu query tìm ra giá trị chính xác thông qua tham số nhập vào
Cú pháp
The full syntax for a cursor declaration is
variable-name CURSOR
[ (param-name param-type [, param-name param-type ...] ) ]
FOR select-query;

The full syntax for an OPEN statement is
OPEN cursor-name [ ( actual-param-value [, actual-param-value...] ) ];

Ví dụ
DECLARE
next_customer
CURSOR (ID INTEGER) FOR
SELECT * FROM customers WHERE
customer_id = ID;
customer
customers%ROWTYPE;
target_customer ALIAS FOR $1;
BEGIN
OPEN next_customer( target_customer );
...

6. Funtion
PL/PGSQL được cho là ngôn ngữ cấu trúc dạng khối (block)
Một block là một trình tự của các câu lệnh giửa một tập hợp thỏa mãn câu lệnh
DECLARE / BEGIN and AS
Các block có thể được lồng vào nhau
Tạo Mới
Dạng 1: dành cho người hiểu ,làm sáng tỏ ngôn ngữ
CREATE [OR REPLACE] FUNCTION name ( [ argtype [, ...] ] )
RETURNS return_type
AS 'definition'
LANGUAGE langname
[ WITH ( attribute [, ...] ) ]

Dạng 2
CREATE [OR REPLACE] FUNCTION name ( [ argtype [, ...] ] )
RETURNS return_type
AS 'obj_file', 'link_symbol'
LANGUAGE langname
[ WITH ( attribute [, ...] ) ]

Chú ý
Mỗi function cùng tên chúng phân biệt nhau bằng kiều du liệu nhập vào .
CREATE FUNCTION my_factorial( INTEGER )...
CREATE FUNCTION my_factorial( REAL )...


CREATE FUNCTION my_factorial( NUMERIC )...

PL/PGSQL không hỗ trợ các tham số mặc định .
Ví dụ bạn tạo ra một Fuction có 3 tham số ,thì bạn không thể nào gọi nó với ít hơn hoặc nhièu hơn 3 tham số
Ví dụ 1:
-- compute_due_date.sql
CREATE FUNCTION compute_due_date(DATE) RETURNS DATE AS '
DECLARE
due_date

DATE;

rental_period

INTERVAL := ''7 days'';

BEGIN

due_date := $1 + rental_period;

RETURN due_date;
END;
' LANGUAGE 'plpgsql';

Ví dụ 2 cùng tên hàm với vd trên nhưng khác tham số
-- compute_due_date.sql
CREATE FUNCTION compute_due_date(DATE, INTERVAL) RETURNS DATE AS '
BEGIN
RETURN( $1 + $2 );
END;
' LANGUAGE 'plpgsql';

Các tham số trong fuction có thể đặt cho nó bí danh thông qua lệnh ALIAS dể cho tham số có ý nghĩa hơn
Nếu bạn không khai bí danh cho nó thì nó tự động hiểu thành phần thứ 1 $1 là tham số đầu tiên và cứ thế tham
số thứ 2 là $2……như ví dụ trên
Ví dụ khai báo bí danh cho các tham số
-- compute_due_date.sql
CREATE FUNCTION compute_due_date(DATE, INTERVAL) RETURNS DATE AS '
DECLARE
rental_date
rental_period

ALIAS FOR $1;
ALIAS FOR $2;

BEGIN
RETURN( rental_date + rental_period );
END;
' LANGUAGE 'plpgsql';

Mỗi PL/PGSQL khi chúng ta viết phải có giá trị trả về thậm chí giá trị trả về là null
PL/PGSQL sẽ chuyển giá trị là biểu thức về kiểu trả về mà bạn định nghĩa hiểu dữ liệu trả về khi định nghĩa nó
3 Xóa Function
Dùng lệnh
DROP FUNCTION name( [ argtype [, ...] ] );

Nhớ chỉ rõ các kiểu dữ liệu nhập vào


4 Function body
4.1. Comments (Chú thích)
Có 2 loại :
 Chú thích chì có 1 dòng : -- (a double dash)
 Chú thích nhiều dòng hay 1 đoạn :/*

*/ (C-Tyle)

4.2 . Biến
Có 5 cách tạo biến:
 mỗi tham số là 1 biến (tên thí được gán tự động ,kiểu thì phải định nghĩa)
 Định nghĩa biến mới trong phần DECLARE
 Tạo một cái tên mới của tham số bằng từ ALIAS
 Đổi tên biến mới bằng từ RENAME
 Tự động tạo ra biến integer trong vòng lặp FOR
4.3. Kiểu dữ liệu giả tạo (pseudo data type)
- %TYPE cho phép tạo ra 1 biến có kiểu giống biến khác
Ví dụ:
CREATE FUNCTION process_rental( rentals ) RETURNS BOOLEAN AS '
DECLARE
original_tape_id
original_customer_id

CHAR(8);

original_rental_row

INTEGER;
ALIAS FOR $1;

BEGIN
original_tape_id

:= original_rental_row.tape_id;

original_customer_id := original_rental_row.customer_id;
..

Thật mất thời gian để ta nhớ hoặc tìm chính xác kiểu dữ liệu của 2 cột rental.tap_id ,và cột
rental.customer_id .Mà chúng ta cần chính xác 2 kiểu dữ liệu cùa 2 cột này để tạo function
process_rental . chúng ta có thể làm như sau:
CREATE FUNCTION process_rental( rentals ) RETURNS BOOLEAN AS '
DECLARE
original_tape_id
original_customer_id
original_rental_row

rentals.tape_id%TYPE;
rentals.customer_id%TYPE;
ALIAS FOR $1;

BEGIN
original_tape_id

:= original_rental_row.tape_id;

original_customer_id := original_rental_row.customer_id;
...


Như vậy %TYPE đã tạo cho biến original_tape_id ,original_customer _id kiểu dữ liệu giống như
kiểu dữ liệu của 2 cột rental.tap_id ,và cột rental.customer_id . %ROWTYPE tương tự như %TYPE
nhưng là cấu trúc của 1 dòng nào đó trong bảng
Ví dụ :
CREATE FUNCTION process_rental( rentals ) RETURNS BOOLEAN AS '
DECLARE
original_tape_id

rentals.tape_id%TYPE;

original_customer_id

rentals.customer_id%TYPE;

original_rental_row

rentals%ROWTYPE;

...

original _rental _row được định nghĩa kiểu giống như cấu trúc của 1 dòng trong bảng rental .Bây giờ ta
có thể truy xuất original _rental _row.tape_id, original _rental _row.rental_date như bình thường….
-

OPAQUE có thể dùng để định nghĩa kiểu trả về cho 1 function hoặc trigger function.

4.4. ALIAS và RENAME
Lệnh ALIAS dùng để tạo thay cho tên của các tham số
CREATE FUNCTION foo( INTEGER ) RETURNS INTEGER AS '
DECLARE
param_1

ALIAS FOR $1;

my_param ALIAS FOR $1;
arg_1

ALIAS FOR $1;

BEGIN
$1 := 42;
-- At this point, $1, param_1, my_param and arg_1
-- are all set to 42.
...

Lệnh RENAME thay thế cho 1 tên củ đang tồn tại
RENAME old-name TO new-name
Here is an example of the RENAME statement:
CREATE FUNCTION foo( INTEGER ) RETURNS INTEGER AS '
DECLARE
RENAME $1 TO param1;
BEGIN
...

4.5. Vòng lặp FOR
Cú pháp
FOR i IN n ..m LOOP
……
END LOOP
n…m giá trị vòng lặp chạy từ n đến m


4.6 . Lệnh gán
target := expression;

target nên là 1 biến ,1 tham số của function ,colum…..
expression phải cùng kiểu với target
4.7 .SELECT INTO
Là 1 cách gán giá trị cho các biến
SELECT INTO destination [, ...] select-list FROM ...;
Ví dụ
DECLARE
phone

customers.phone%TYPE;

name

customers.customer_name%TYPE:

BEGIN
SELECT INTO name,phone
customer_name, customers.phone FROM customers
WHERE customer_id = 10;
...

4.8 . Condition execution
IF –THEN
IF expression THEN
statements
END IF;

Expression có giá trị phải là Boolean (có thể qua tính toán).Nếu là true thí thực hiện statements
IF-THEN-ELSE
IF expression THEN
statements_1
ELSE
statements_2
END IF;
In this form, statements_1 will execute if expression evaluates to TRUE;
otherwise, statements_2 will execute. Note that statements_2 will not execute if the
expression is TRUE
Loop Constructs
[<

Tài liệu bạn tìm kiếm đã sẵn sàng tải về

Tải bản đầy đủ ngay

×