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.. Các kiểu dữ liệu trong postgreSQL: Cha
Trang 1TÌ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 yê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
Trang 2
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.
Trang 3 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ểunumber 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 Thaotá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
Interval: Thể hiện một khoản thời gian.
Logical :Thể hiện dữ liệu kiểu logic
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ó
netmaskVd: 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)
Trang 4 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
Character St length() length(col) length of col
character_length() character_length(col) length of col, same as length()octet_length() octet_length(col) length of col, including multibyte
overhead
trim() trim(col) col with leading and trailing spaces
removed
Trang 5trim(BOTH…) trim(BOTH, col ) same as trim()trim(LEADING…) trim(LEADING col) col with leading spaces removedtrim(TRAILING…) trim(TRAILING col) col with trailing spaces removedtrim(…FROM…) trim(strFROM col) col with leading and trailing str spaces
removedrpad() rpad(col,len) col padded on the right to len charactersrpad() rpad(col,len, str) col padded on the right using str
lpad() lpad(col,len) col padded on the left to len characters
lpad() lpad(col.len, str) col padded on the left using str
initcap() initcap(col) col with the first letter capitalizedstrpos() strpos(col,str) Position of str in col
position() position(str in col) Same as strpos()substr() substr(col, pos) col starting position possubstring(…FROM ) substring (col FROM
translate() translate(col, from, to) Col with from changed to to
to_number() to_number(col, mask) Convert col to NUMERIC() based on
maskto_date() to_date(col, mask) Convert col to DATE based on maskto_timestamp() to_timestamp(colm
mask)
Convert col to TIMESTAMP based on mask
round() round(col, len) NUMERIC() col rounded to len
decimal placestrunc() trunc(col) Truncate to an integertrunc() trunc(col, len) NUMERIC() col truncated to len
decimal places
factorial() factorial(col) Factorial
to_char() to_char(col, mask) Convert col to a string based on maskTemporal Date_part() Date_part(units, col) Units part of col
Extract(…FROM…) Extract(units FROM
col)
Same as date_part()
Trang 6Isfinite() Isfinite(col) BOOLEAN indicating whether col is a
valid date
and timeTimeofday() Timeofday() String showing date/time in Unix
formatOverlaps() Overlaps(c1,c2,c3,c4) BOOLEAN indicating whether col’s
overlap in timeTo_char() To_char(col, mask) Conver col to string based on mask
funtionnetwork Broadcast() Broadcast(col) Broadcast address of col
Masklen() Masklen(col) Mask length of col
Network() Network( col) Network address of col
NULL Nullif() Nullif(col1, col2) Return null if col1equals col2, else
Trang 7(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 +
Trang 82.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
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().
Trang 9Khi gọi dữ liệu thao tác thì dùng lo_export().
VD: quá 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]
Trang 10 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
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 nó Và đây là mặc định
Vd: DROP TRIGGER if_dist_exists ON films;
4.3 ALTER TRIGGER
Trang 11ALTER 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;
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
FETCH rental_cursor INTO tape_id, customer_id, rental_date;
IF ( overdue( rental_date )) THEN
FETCH rental_cursor INTO rental;
I can now access rental.tape_id,
rental.customer_id, and rental.rental_date
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
Trang 12my_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
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
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 [, ] ] )
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 )
Trang 13CREATE FUNCTION my_factorial( NUMERIC )
rental_date ALIAS FOR $1;
rental_period 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
Trang 14 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
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 ALIAS FOR $1;
BEGIN original_tape_id := original_rental_row.tape_id;
original_customer_id := original_rental_row.customer_id;
.
Trang 15Như 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
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
.
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 '