Hệ quản trị cơ sở dữ liệu - Giao diện lập trình
Bạn đang xem 20 trang mẫu của tài liệu "Hệ quản trị cơ sở dữ liệu - Giao diện lập trình", để tải tài liệu gốc về máy bạn click vào nút DOWNLOAD ở trên
Tài liệu đính kèm:
- he_quan_tri_co_so_du_lieu_giao_dien_lap_trinh.pdf
Nội dung text: Hệ quản trị cơ sở dữ liệu - Giao diện lập trình
- Khoa Công Nghệ Thông Tin Trường Đại Học Cần Thơ Giao diện lập trình Đỗ Thanh Nghị dtnghi@cit.ctu.edu.vn Cần Thơ 24-04-2005
- Nội dung Ngôn ngữ PL/pgSQL Giao diện lập trình C Giao diện lập trình C++ Giao diện lập trình JAVA Giao diện lập trình PHP 2
- PostgreSQL, lập trình cả Frontend và Backend Frontend: Những ngôn ngữ truy cập dữ liệu từ bên ngoài Các scripts và những ứng dụng Libpq, Ecpg (C), Libpq++, Libpqxx (C++), Jdbc (Java), Odbc, Perl, Python, Pgtclsh (Tcl/Tk), Php .NET ? Qt (C++) Backend: Những ngôn ngữ giúp mở rộng tính năng của server Pl/pgSQL, Pl/Perl, Pl/Tcl, Pl/Python, C 3
- Ngôn ngữ PL/pgSQL Giao diện lập trình C Giao diện lập trình C++ Giao diện lập trình JAVA Giao diện lập trình PHP 4
- Ngôn ngữ PL/pgSQL Giao diện lập trình C Giao diện lập trình C++ Giao diện lập trình JAVA Giới thiệu về PL/pgSQL Giao diện lập trình PHP PL/pgSQL So sánh được với PL/SQL của Oracle Hỗ trợ định nghĩa: hàm, triggers Đưa cấu trúc điều khiển đến với ngôn ngữ SQL Hỗ trợ cho các tính toán phức tạp Sử dụng được tất cả kiểu, phép toán, hàm sẵn có của PostgreSQL Nhóm dãy lệnh SQL trong một lời gọi thủ tục sẽ giảm được chi phí nối kết client-server Dễ sử dụng, portable trên PostgreSQL 5
- Ngôn ngữ PL/pgSQL Giao diện lập trình C Giao diện lập trình C++ Cài đặt ngôn ngữ PL/pgSQL cho cơ sở Giao diện lập trình JAVA dữ liệu Giao diện lập trình PHP Sử dụng createlang Cài đặt ngôn ngữ PL/pgSQL cho cơ sở dữ liệu test /usr/bin/createlang plpgsql test Sử dụng psql /usr/bin/psql test test=# CREATE FUNCTION plpgsql_call_handler() test-# RETURNS OPAQUE AS '/usr/lib/pgsql/plpgsql.so' test-# LANGUAGE 'C'; test=# CREATE LANGUAGE 'plpgsql' HANDLER plpgsql_call_handler test-# LANCOMPILER 'PL/pgSQL'; 6
- Ngôn ngữ PL/pgSQL Giao diện lập trình C Giao diện lập trình C++ Giao diện lập trình JAVA Cấu trúc khối của PL/pgSQL Giao diện lập trình PHP [ > ] [ DECLARE CREATE FUNCTION somefunc() declarations ] RETURNS integer AS BEGIN ’ DECLARE statements quantity integer; END; BEGIN foo example quantity := 50*50; RETURN quantity; Chú thích chương trình END; chú thích 1 dòng ‘ LANGUAGE ‘plpgsql’; /* chú thích 1 đoạn */ 7
- Ngôn ngữ PL/pgSQL Giao diện lập trình C Giao diện lập trình C++ Giao diện lập trình JAVA Khai báo trong PL/pgSQL Giao diện lập trình PHP Khai báo biến Sử dụng tất cả các kiểu dữ liệu của SQL name [ CONSTANT ] type [ NOT NULL ] [ { DEFAULT | := } expression ]; Ví dụ: quantity integer DEFAULT 32; url varchar := ' user_id CONSTANT integer := 10; myrow table2name%ROWTYPE; tablename%ROWTYPE myfield users.user_id%TYPE; tablename.columnname%TYPE arow RECORD; 8
- Ngôn ngữ PL/pgSQL Giao diện lập trình C Giao diện lập trình C++ Giao diện lập trình JAVA Khai báo trong PL/pgSQL Giao diện lập trình PHP Alias của những tham số hàm Hàm sẽ có những tham số với những định danh : $1, $2, $n Khai báo Alias cho những định danh: name ALIAS FOR $n; Hoặc CREATE FUNCTION fun_name( var_i type_i, ) Ví dụ: CREATE FUNCTION instr(varchar, integer) RETURNS integer AS ‘ DECLARE v_string ALIAS FOR $1; index ALIAS FOR $2; BEGIN END; ‘ LANGUAGE ‘plpgsql’; 9
- Ngôn ngữ PL/pgSQL Giao diện lập trình C Giao diện lập trình C++ Giao diện lập trình JAVA Lệnh cơ bản trong PL/pgSQL Giao diện lập trình PHP Gán, identifier := expression; Ví dụ: user_id := 1072; tax := subtotal*0.01; SELECT INTO target select_expressions FROM ; target có thể là biến record, row hoặc biến đơn Ví dụ: SELECT INTO users_rec * FROM users WHERE user_id=3; Thực hiện phép truy vấn nhưng bỏ đi kết quả trả về Chỉ cần thay thế SELECT bằng PERFORM trong câu truy vấn Lệnh NULL Không làm gì 10
- Ngôn ngữ PL/pgSQL Giao diện lập trình C Giao diện lập trình C++ Giao diện lập trình JAVA Lệnh cơ bản trong PL/pgSQL Giao diện lập trình PHP Thực thi lệnh động: EXECUTE command_string; Lệnh thao tác trên bảng và kiểu dữ liệu khác nhau ở từng thời điểm thực thi Ví dụ: strings concatenation, str1 || str2 EXECUTE 'UPDATE tbl SET ' || quote_ident(colname) || ' = ' || quote_literal(newvalue) || ' WHERE key = ' || quote_literal(keyvalue); GET DIAGNOSTICS variable = item [ , ] ; Lấy trạng thái kết quả: ROWCOUNT, RESULT_OID, OID 11
- Ngôn ngữ PL/pgSQL Giao diện lập trình C Giao diện lập trình C++ Giao diện lập trình JAVA Lệnh cơ bản trong PL/pgSQL Giao diện lập trình PHP Những câu lệnh như: SELECT INTO, PERFORM, UPDATE, INSERT, DELETE, FOR, FETCH Lấy trạng thái kết quả: FOUND Ví dụ: SELECT INTO myrec * FROM emp WHERE empname = myname; IF NOT FOUND THEN RAISE EXCEPTION ‘’employee % not found’’, myname; END IF; 12
- Ngôn ngữ PL/pgSQL Giao diện lập trình C Giao diện lập trình C++ Giao diện lập trình JAVA Kết quả trả về Giao diện lập trình PHP Return expression; Trả kết quả về cho lời gọi hàm Return Next expression; Khi hàm số được khai báo kết quả trả về có dạng: SETOF Lời gọi hàm của hàm func() trả về kết quả với Return Next SELECT * from func(); 13
- Ngôn ngữ PL/pgSQL Giao diện lập trình C Giao diện lập trình C++ Giao diện lập trình JAVA Ví dụ 1 Giao diện lập trình PHP test=# CREATE FUNCTION sales_tax(real) RETURNS real AS test-# ' test'# DECLARE test'# subtotal ALIAS FOR $1; test'# BEGIN test'# RETURN subtotal * 0.06; test'# END; test'# ' LANGUAGE 'plpgsql'; test=# select sales_tax(25.8); sales_tax 1.548 (1 row) 14
- Ngôn ngữ PL/pgSQL Giao diện lập trình C Giao diện lập trình C++ Giao diện lập trình JAVA Ví dụ 2 Giao diện lập trình PHP test=# CREATE FUNCTION get_tourist_name (integer) RETURNS text AS test-# ' test'# DECLARE test'# tid ALIAS FOR $1; test'# fname text; test'# lname text; test'# BEGIN test'# SELECT INTO fname, lname name, last_name FROM tourists WHERE nt = tid; test'# RETURN fname || lname; test'# END; test'# ' LANGUAGE 'plpgsql'; test=# select get_tourist_name(3); get_tourist_name DoHiep Thuan (1 row) 15
- Ngôn ngữ PL/pgSQL Giao diện lập trình C Giao diện lập trình C++ Giao diện lập trình JAVA Ví dụ 3 Giao diện lập trình PHP test=# CREATE FUNCTION merge_fields(id integer) RETURNS text AS test-# ' test'# DECLARE test'# t1_row tourists%ROWTYPE; test'# BEGIN test'# SELECT * INTO t1_row FROM tourists WHERE nt=id; test'# RETURN t1_row.name || '' '' || t1_row.last_name; test'# END; test'# ' LANGUAGE 'plpgsql'; test=# select merge_fields(4); merge_fields Do Thi Bich Hanh (1 row) 16
- Ngôn ngữ PL/pgSQL Giao diện lập trình C Giao diện lập trình C++ Giao diện lập trình JAVA Ví dụ 4 Giao diện lập trình PHP test=# CREATE FUNCTION merge_fields_t(id integer) RETURNS text AS test-# ' test'# DECLARE test'# t1_row tourists%ROWTYPE; test'# t1_type tourists.type%TYPE; test'# BEGIN test'# SELECT * INTO t1_row FROM tourists WHERE nt=id; test'# t1_type := t1_row.type; test'# RETURN t1_row.name || '' '' || t1_row.last_name || '' '' || t1_type; test'# END; test'# ' LANGUAGE 'plpgsql'; CREATE FUNCTION test=# select merge_fields_t(1); merge_fields_t Do Thanh Nghi sportif (1 row) 17
- Ngôn ngữ PL/pgSQL Giao diện lập trình C Giao diện lập trình C++ Giao diện lập trình JAVA Ví dụ 5 Giao diện lập trình PHP test=# CREATE FUNCTION concat_selected_fields(in_t cities) RETURNS text AS test-# ' test'# BEGIN test'# RETURN in_t.nc || '' '' || in_t.name; test'# END; test'# ' LANGUAGE 'plpgsql'; test=# select concat_selected_fields(cities) from cities; concat_selected_fields 4 McGill 2 Hull 3 Laval 1 Montreal (4 rows) 18
- Ngôn ngữ PL/pgSQL Giao diện lập trình C Giao diện lập trình C++ Giao diện lập trình JAVA Cấu trúc « IF » trong PL/pgSQL Giao diện lập trình PHP IF-THEN IF-THEN-ELSIF-ELSE IF boolean-expression THEN IF boolean-expression THEN statements statements END IF; [ ELSIF boolean-expression THEN IF-THEN-ELSE statements IF boolean-expression THEN [ ELSIF boolean-expression THEN statements statements ELSE ]] statements [ ELSE END IF; statements ] END IF; 19
- Ngôn ngữ PL/pgSQL Giao diện lập trình C Giao diện lập trình C++ Giao diện lập trình JAVA Ví dụ 6 Giao diện lập trình PHP test=# CREATE FUNCTION get_hotel_name(id integer) RETURNS text AS test-# ' test'# DECLARE test'# t1_row hotels%ROWTYPE; test'# BEGIN test'# SELECT * INTO t1_row FROM hotels WHERE nh=id; test'# IF NOT FOUND THEN test'# RAISE EXCEPTION ''hotel % not found'', id; test'# END IF; test'# RETURN t1_row.name; test'# END; test'# ' LANGUAGE 'plpgsql'; CREATE FUNCTION test=# select get_hotel_name(3); get_hotel_name Onmi (1 row) 20
- Ngôn ngữ PL/pgSQL Giao diện lập trình C Giao diện lập trình C++ Giao diện lập trình JAVA Cấu trúc lặp trong PL/pgSQL Giao diện lập trình PHP LOOP [ >] LOOP statements END LOOP; EXIT EXIT [ label ] [ WHEN expression ]; 21
- Ngôn ngữ PL/pgSQL Giao diện lập trình C Giao diện lập trình C++ Giao diện lập trình JAVA Cấu trúc lặp trong PL/pgSQL Giao diện lập trình PHP WHILE-LOOP [ >] WHILE expression LOOP statements END LOOP; FOR (biến lặp là nguyên) [ >] FOR name IN [ REVERSE ] expression expression LOOP statements END LOOP; 22
- Ngôn ngữ PL/pgSQL Giao diện lập trình C Giao diện lập trình C++ Giao diện lập trình JAVA Cấu trúc lặp trong PL/pgSQL Giao diện lập trình PHP FOR (với kết quả truy vấn) [ >] FOR record_or_row IN query LOOP statements END LOOP; [ >] FOR record_or_row IN EXECUTE text_expression LOOP statements END LOOP; 23
- Ngôn ngữ PL/pgSQL Giao diện lập trình C Giao diện lập trình C++ Giao diện lập trình JAVA Ví dụ 7 Giao diện lập trình PHP test=# CREATE FUNCTION get_hotels_name () RETURNS text AS ' test'# DECLARE test'# output text := ''\n''; test'# row_data hotels%ROWTYPE; test'# BEGIN test'# Iterate through the results of a query. test'# FOR row_data IN SELECT * FROM hotels ORDER BY name LOOP test'# output := output || row_data.name || ''\n''; test'# END LOOP; test'# RETURN output; test'# END; test'# ' LANGUAGE 'plpgsql'; test=# select get_hotels_name(); get_hotels_name New World Onmi Plaza Royal Sami 24 (1 row)
- Ngôn ngữ PL/pgSQL Giao diện lập trình C Giao diện lập trình C++ Giao diện lập trình JAVA Ví dụ 8 Giao diện lập trình PHP test=# CREATE FUNCTION demo(in_text text) RETURNS text AS test-# ' test'# DECLARE test'# i integer; test'# len integer; test'# out_text text; test'# str text; test'# BEGIN test'# str := upper(in_text); test'# out_text := ''''; test'# i := 1; test'# len := length(str); test'# WHILE i <= len LOOP test'# out_text := out_text || substr(str, i, 1) || '' ''; test'# i := i + 1; test'# END LOOP; test'# RETURN out_text; test'# END; test'# ' LANGUAGE 'plpgsql'; 25
- Ngôn ngữ PL/pgSQL Giao diện lập trình C Giao diện lập trình C++ Giao diện lập trình JAVA Ví dụ 9 Giao diện lập trình PHP test=# CREATE FUNCTION get_hotels_demo () RETURNS text AS test-# ' test'# DECLARE test'# output text := ''\n''; test'# row_data hotels%ROWTYPE; test'# demo_text text; test'# BEGIN test'# Iterate through the results of a query. test'# FOR row_data IN SELECT * FROM hotels ORDER BY name LOOP test'# select into demo_text demo(row_data.name); test'# output := output || demo_text || ''\n''; test'# END LOOP; test'# RETURN output; test'# END; test'# ' LANGUAGE 'plpgsql'; test=# select get_hotels_demo(); get_hotels_demo N E W W O R L D O N M I P L A Z A R O Y A L S A M I (1 row) 26
- Ngôn ngữ PL/pgSQL Giao diện lập trình C Giao diện lập trình C++ Giao diện lập trình JAVA Bẫy lỗi Giao diện lập trình PHP [ > ] [ DECLARE declarations ] BEGIN statements EXCEPTION WHEN condition [ OR condition ] THEN handler_statements [ WHEN condition [ OR condition ] THEN handler_statements ] END; 27
- Ngôn ngữ PL/pgSQL Giao diện lập trình C Giao diện lập trình C++ Giao diện lập trình JAVA Ví dụ 10 Giao diện lập trình PHP test=# CREATE FUNCTION check_div(a real, b real) RETURNS real AS test-# ' test'# DECLARE test'# ret real; test'# BEGIN test'# ret := a / b; test'# RETURN ret; test'# EXCEPTION test'# WHEN division_by_zero THEN test'# RAISE NOTICE ''caught division_by_zero''; test'# RETURN a; test'# END; test'# ' LANGUAGE 'plpgsql'; test=# select check_div(7, 2); check_div 3.5 (1 row) test=# select check_div(7, 0); NOTICE: caught division_by_zero check_div 7 28 (1 row)
- Ngôn ngữ PL/pgSQL Giao diện lập trình C Giao diện lập trình C++ Giao diện lập trình JAVA Cursor trong PL/pgSQL Giao diện lập trình PHP Đọc một vài dòng của kết quả phép truy vấn ở một thời điểm: tránh tiêu tốn bộ nhớ Khai báo: name CURSOR [ ( arguments ) ] FOR query ; Mở cursor: OPEN unbound_cursor FOR SELECT ; OPEN unbound_cursor FOR EXECUTE query_string; OPEN bound_cursor [ ( argument_values ) ]; Đọc dòng kế tiếp: FETCH cursor INTO target; Đóng cursor: CLOSE cursor; Kết quả trả về là cursor: sử dụng refcursor 29
- Ngôn ngữ PL/pgSQL Giao diện lập trình C Giao diện lập trình C++ Giao diện lập trình JAVA Ví dụ 11 Giao diện lập trình PHP test=# CREATE FUNCTION reffunc(refcursor) RETURNS refcursor AS test-# ' test'# BEGIN test'# OPEN $1 FOR SELECT * FROM museums; test'# RETURN $1; test'# END; test'# ' LANGUAGE 'plpgsql'; test=# BEGIN; test=# SELECT reffunc('funccursor'); reffunc test=# FETCH ALL IN funccursor; nm | nc | name + + 1 | 1 | CULTURE 2 | 1 | ROI 1 | 2 | LOUVRE 1 | 4 | HISTOIRE 2 | 4 | SIECLE 3 | 1 | CHARLIE (6 rows) 30 test=# COMMIT;
- Ngôn ngữ PL/pgSQL Giao diện lập trình C Giao diện lập trình C++ Giao diện lập trình JAVA Ví dụ 12 Giao diện lập trình PHP test=# CREATE FUNCTION myfunc(refcursor, refcursor) RETURNS SETOF refcursor AS test-# ' test'# BEGIN test'# OPEN $1 FOR SELECT * FROM cities; test'# RETURN NEXT $1; test'# OPEN $2 FOR SELECT * FROM museums; test'# RETURN NEXT $2; test'# RETURN; test'# END; test'# ' LANGUAGE 'plpgsql'; 31
- Ngôn ngữ PL/pgSQL Giao diện lập trình C Giao diện lập trình C++ Giao diện lập trình JAVA Ví dụ 13 Giao diện lập trình PHP test=# BEGIN; test=# SELECT * FROM myfunc('cursor_cities', 'cursor_museums'); test=# FETCH ALL FROM cursor_cities; nc | name | pop | nb_museums + + + 4 | McGill | 5000 | 2 2 | Hull | 900 | 1 3 | Laval | 9800 | 0 1 | Montreal | 150000 | 3 (4 rows) test=# FETCH ALL FROM cursor_museums; nm | nc | name + + 1 | 1 | CULTURE 2 | 1 | ROI 1 | 2 | LOUVRE 1 | 4 | HISTOIRE 2 | 4 | SIECLE 3 | 1 | CHARLIE (6 rows) 32 test=# COMMIT;
- Ngôn ngữ PL/pgSQL Giao diện lập trình C Giao diện lập trình C++ Giao diện lập trình JAVA Thông báo & lỗi trong PL/pgSQL Giao diện lập trình PHP RAISE level ‘’format’’ [, variable [, ]]; Level: DEBUG, LOG, INFO, NOTICE, WARNING, EXCEPTION. EXCEPTION 33
- Ngôn ngữ PL/pgSQL Giao diện lập trình C Giao diện lập trình C++ Giao diện lập trình JAVA Ví dụ 14 Giao diện lập trình PHP test=# CREATE FUNCTION func() RETURNS integer AS test-# ' test'# DECLARE test'# quantity integer := 30; test'# BEGIN test'# RAISE NOTICE ''Quantity here is %'', quantity; test'# quantity := 50; test'# Create a subblock test'# DECLARE test'# quantity integer := 80; test'# BEGIN test'# RAISE NOTICE ''Quantity here is %'', quantity; test'# END; test'# RAISE NOTICE ''Quantity here is %'', quantity; test=# select func(); test'# RETURN quantity; NOTICE: Quantity here is 30 test'# END; NOTICE: Quantity here is 80 test'# ' LANGUAGE 'plpgsql'; NOTICE: Quantity here is 50 func 50 (1 row) 34
- Ngôn ngữ PL/pgSQL Giao diện lập trình C Giao diện lập trình C++ Giao diện lập trình JAVA Thủ tục trigger trong PL/pgSQL Giao diện lập trình PHP Những biến đặc biệt NEW: giá trị mới của mẩu tin OLD: giá trị củ của mẩu tin TG_NAME: tên trigger TG_WHEN: BEFORE|AFTER khi định nghĩa trigger TG_LEVEL: ROW|STATEMENT khi định nghĩa trigger TG_OP: INSERT|UPDATE|DELETE. TG_RELID: OID của bảng sinh ra lời gọi trigger TG_RELNAME: tên của bảng sinh ra lời gọi trigger TG_NARGS: số lượng tham số của thủ tục trigger TG_ARGV[]: tham số của thủ tục trigger 35
- Ngôn ngữ PL/pgSQL Giao diện lập trình C Giao diện lập trình C++ Giao diện lập trình JAVA Giao diện lập trình PHP 36
- Ngôn ngữ PL/pgSQL Giao diện lập trình C Giao diện lập trình C++ Giao diện lập trình JAVA Giao diện lập trình C Giao diện lập trình PHP Chương trình C giao tiếp với server: Sử dụng thư viện: libpq Phải include tập tin header: libpq-fe.h Trình tự của chương trình Tạo kết nối tới cơ sở dữ liệu trên server Gửi câu lệnh truy vấn SQL tới server Server thực hiện câu lệnh truy vấn Lấy kết quả trả về của lệnh truy vấn Hiển thị hoặc xử lý kết quả trả về Đóng kết nối tới cơ sở dữ liệu 37
- Ngôn ngữ PL/pgSQL Giao diện lập trình C Giao diện lập trình C++ Giao diện lập trình JAVA Tạo nối kết đến cơ sở dữ liệu Giao diện lập trình PHP Sử dụng hàm PQsetdbLogin PGconn *PQsetdbLogin ( const char *pghost, const char *pgport, const char *pgoptions, const char *pgtty, const char *dbName, const char *login, const char *pwd ); Các hàm khác: PQsetdb, PQconnectdb, etc. Trạng thái kết nối: PQstatus 38
- Ngôn ngữ PL/pgSQL Giao diện lập trình C Giao diện lập trình C++ Giao diện lập trình JAVA Gởi câu truy vấn tới server Giao diện lập trình PHP Sử dụng hàm PQexec PGresult *PQexec(PGconn *conn, const char *command); Các hàm khác: PQexecParams, PQprepare, PQexecPrepared, etc. Trạng thái kết quả: PQresultStatus Lấy kết quả trả về: PQntuples, PQnfields, PQgetvalue, etc. int PQntuples(const PGresult *res); int PQnfields(const PGresult *res); char *PQgetvalue(const PGresult *res, int row_no, int column_no); 39
- Ngôn ngữ PL/pgSQL Giao diện lập trình C Giao diện lập trình C++ Giao diện lập trình JAVA Kết thúc kết nối tới server Giao diện lập trình PHP Trước hết nên giải phóng kết quả và sau đó sẽ đóng nối kết đến server, sử dụng hàm PQclear và PQfinish void PQclear(PGresult *res); void PQfinish(PGconn *conn); 40
- Ngôn ngữ PL/pgSQL Giao diện lập trình C Giao diện lập trình C++ Giao diện lập trình JAVA Chương trình ví dụ, testlibpq.c Giao diện lập trình PHP /* * libpq sample program */ #include #include #include /* libpq header file */ int main() { char query_string[256]; PGconn *conn; PGresult *res; int i; 41
- Ngôn ngữ PL/pgSQL Giao diện lập trình C Giao diện lập trình C++ Giao diện lập trình JAVA Chương trình ví dụ, testlibpq.c Giao diện lập trình PHP /* connect to the database */ conn = PQconnectdb("dbname=test host=m-nghi2 port=5432 user=nghi password=xxxxxx"); /* did the database connection fail? */ if (PQstatus(conn) == CONNECTION_BAD) { fprintf(stderr, "Connection to database failed.\n"); fprintf(stderr, "%s", PQerrorMessage(conn)); exit(1); } /* create an SQL query string */ sprintf(query_string, "SELECT name FROM cities"); /* send the query */ res = PQexec(conn, query_string); 42
- Ngôn ngữ PL/pgSQL Giao diện lập trình C Giao diện lập trình C++ Giao diện lập trình JAVA Chương trình ví dụ, testlibpq.c Giao diện lập trình PHP if (PQresultStatus(res) != PGRES_TUPLES_OK) { /* did the query fail? */ fprintf(stderr, "SELECT query failed.\n"); PQclear(res); PQfinish(conn); exit(1); } /* loop through all rows returned */ for (i = 0; i < PQntuples(res); i++) printf("%s\n", PQgetvalue(res, i, 0)); /* print the value returned */ PQclear(res); /* free result */ PQfinish(conn); /* disconnect from the database */ return 0; } 43
- Ngôn ngữ PL/pgSQL Giao diện lập trình C Giao diện lập trình C++ Giao diện lập trình JAVA Dịch chương trình Giao diện lập trình PHP Chú ý đến vị trí thư viện libpq Dịch: gcc –o testlibpq testlibpq.cc -lpq => sẽ có chương trình thực thi testlibpq 44
- Ngôn ngữ PL/pgSQL Giao diện lập trình C Giao diện lập trình C++ Giao diện lập trình JAVA Giao diện lập trình PHP 45
- Ngôn ngữ PL/pgSQL Giao diện lập trình C Giao diện lập trình C++ Giao diện lập trình JAVA Giao diện lập trình C++ Giao diện lập trình PHP Chương trình C++ giao tiếp với server: Sử dụng thư viện: libpq++ Phải include tập tin header: libpq++.h Trình tự của chương trình cũng gồm các bước Tạo kết nối tới cơ sở dữ liệu trên server Gửi câu lệnh truy vấn SQL tới server Server thực hiện câu lệnh truy vấn Lấy kết quả trả về của lệnh truy vấn Hiển thị hoặc xử lý kết quả trả về Đóng kết nối tới cơ sở dữ liệu 46
- Ngôn ngữ PL/pgSQL Giao diện lập trình C Giao diện lập trình C++ Giao diện lập trình JAVA Tạo nối kết đến cơ sở dữ liệu Giao diện lập trình PHP Sử dụng lớp PgConnection hay PgDatabase kế thừa từ lớp PgConnection PgConnection::PgConnection(const char *conninfo) PgDatabase::PgDatabase(const char *conninfo) Trạng thái kết nối bool PgConnection::ConnectionBad() const ConnStatusType PgConnection::Status() 47
- Ngôn ngữ PL/pgSQL Giao diện lập trình C Giao diện lập trình C++ Giao diện lập trình JAVA Gởi câu truy vấn tới server Giao diện lập trình PHP Sử dụng các phương thức ExecStatusType PgConnection::Exec(const char* query) int PgConnection::ExecCommandOk(const char *query) int PgConnection::ExecTuplesOk(const char *query) Lấy thông tin lỗi: const char *PgConnection::ErrorMessage() Lấy kết quả trả về: PgDatabase::Tuples(), PgDatabase::Fields(), PgDatabase::GetValue( ), etc. int PgDatabase::Tuples() const int PgDatabase::Fields() const char *PgDatabase::GetValue(int tup_no, int field_no) 48
- Ngôn ngữ PL/pgSQL Giao diện lập trình C Giao diện lập trình C++ Giao diện lập trình JAVA Chương trình ví dụ, testlibpq++.cc Giao diện lập trình PHP // // libpq++ sample program // #include #include // libpq++ header file using namespace std; int main() { char query_string[256]; int i; 49
- Ngôn ngữ PL/pgSQL Giao diện lập trình C Giao diện lập trình C++ Giao diện lập trình JAVA Chương trình ví dụ, testlibpq++.cc Giao diện lập trình PHP // connect to the database PgDatabase conn("dbname=test host=m-nghi2 port=5432 \ user=nghi password=xxxxxxx"); // did the database connection fail? if (conn.ConnectionBad()) { cerr << "Connection to database failed." << endl << "Error returned: " << conn.ErrorMessage() << endl; exit(1); } 50
- Ngôn ngữ PL/pgSQL Giao diện lập trình C Giao diện lập trình C++ Giao diện lập trình JAVA Chương trình ví dụ, testlibpq++.cc Giao diện lập trình PHP // create an SQL query string sprintf(query_string, "SELECT name FROM cities"); // send the query if (!conn.ExecTuplesOk(query_string)) { cerr << "SELECT query failed." << endl; exit(1); } // loop through all rows returned for (int i=0; i < conn.Tuples(); i++) // print the value returned cout << conn.GetValue(i,0) << endl; return 0; } 51
- Ngôn ngữ PL/pgSQL Giao diện lập trình C Giao diện lập trình C++ Giao diện lập trình JAVA Dịch chương trình Giao diện lập trình PHP Chú ý đến vị trí thư viện libpq++ Dịch: g++ -DHAVE_NAMESPACE_STD -DHAVE_CXX_STRING_HEADER -DDLLIMPORT=“” -I/usr/include/pgsql -o testlibpq++ testlibpq++.cc -L/usr/lib -lpq++ => sẽ có chương trình thực thi testlibpq++ 52
- Ngôn ngữ PL/pgSQL Giao diện lập trình C Giao diện lập trình C++ Giao diện lập trình JAVA Giao diện lập trình C++ Giao diện lập trình PHP Chương trình C++ giao tiếp với server: Sử dụng thư viện: libpqxx Phải include tập tin header: #include using namespace pqxx; Trình tự của chương trình cũng gồm các bước Tạo kết nối tới cơ sở dữ liệu trên server Gửi câu lệnh truy vấn SQL tới server Server thực hiện câu lệnh truy vấn Lấy kết quả trả về của lệnh truy vấn Hiển thị hoặc xử lý kết quả trả về Đóng kết nối tới cơ sở dữ liệu 53
- Ngôn ngữ PL/pgSQL Giao diện lập trình C Giao diện lập trình C++ Giao diện lập trình JAVA Tạo nối kết đến cơ sở dữ liệu Giao diện lập trình PHP Sử dụng lớp connection pqxx::connection C(const std::string & dbstring) dbstring có dạng: "dbname= user= password= hostaddr= port= “ C.is_open() cho phép mở kết nối, phương thức trả về true nếu mở kết nối thành công, trả về false nếu thất bại C.disconnect() cho phép đóng kết nối 54
- Ngôn ngữ PL/pgSQL Giao diện lập trình C Giao diện lập trình C++ Giao diện lập trình JAVA Gởi câu truy vấn tới server Giao diện lập trình PHP Sử dụng transaction pqxx::work W(C) W.exec(const std::string & sql) W.commit() W.abort() Sử dụng nontransaction pqxx::nontransaction N(C) N.exec(const std::string & sql) 55
- Ngôn ngữ PL/pgSQL Giao diện lập trình C Giao diện lập trình C++ Giao diện lập trình JAVA Hiển thị kết quả Giao diện lập trình PHP Ví dụ hiển thị kết quả result R(N.exec(sql)); // List down all the records for (result::const_iterator c = R.begin(); c != R.end(); ++c) { cout () () () () () << endl; } 56
- Ngôn ngữ PL/pgSQL Giao diện lập trình C Giao diện lập trình C++ Giao diện lập trình JAVA Chương trình ví dụ, testlibpqxx.cc Giao diện lập trình PHP // // libpqxx sample program // #include #include using namespace std; using namespace pqxx; int main() { char query_string[256]; 57
- Ngôn ngữ PL/pgSQL Giao diện lập trình C Giao diện lập trình C++ Giao diện lập trình JAVA Chương trình ví dụ, testlibpqxx.cc Giao diện lập trình PHP try{ // connect to the database connection C("dbname=test hostaddr=m-nghi2 port=5432 \ user=nghi password=xxxxxxx"); if (C.is_open()) { cout << "Opened database successfully: " << C.dbname() << endl; } else { cout << "Can't open database" << endl; return 1; } // Create SQL statement sprintf(query_string, "SELECT name FROM cities"); // Create a non-transactional object. nontransaction N(C); // Execute SQL query result R(N.exec(query_string)); 58
- Ngôn ngữ PL/pgSQL Giao diện lập trình C Giao diện lập trình C++ Giao diện lập trình JAVA Chương trình ví dụ, testlibpqxx.cc Giao diện lập trình PHP // List down all the records for(result::const_iterator c = R.begin(); c != R.end(); c++) cout () << endl; cout << "Operation done successfully" << endl; // Close connection C.disconnect(); } // try catch (const std::exception &e) { cerr << e.what() << std::endl; return 1; } return 0; } // main 59
- Ngôn ngữ PL/pgSQL Giao diện lập trình C Giao diện lập trình C++ Giao diện lập trình JAVA Dịch chương trình Giao diện lập trình PHP Chú ý đến vị trí thư viện libpqxx Dịch: g++ -o testlibpqxx testlibpqxx.cc -lpqxx => sẽ có chương trình thực thi testlibpqxx 60
- Ngôn ngữ PL/pgSQL Giao diện lập trình C Giao diện lập trình C++ Giao diện lập trình JAVA Giao diện lập trình PHP 61
- Ngôn ngữ PL/pgSQL Giao diện lập trình C Giao diện lập trình C++ Giao diện lập trình JAVA Giao diện lập trình Java Giao diện lập trình PHP Chương trình Java giao tiếp với server: Sử dụng thư viện: jdbc (download pg__jdbc.jar) Chỉ đường dẫn đến thư viện, CLASS_PATH Phải import java.sql.* Trình tự của chương trình Tạo kết nối tới cơ sở dữ liệu trên server Gửi câu lệnh truy vấn SQL tới server Server thực hiện câu lệnh truy vấn Lấy kết quả trả về của lệnh truy vấn Hiển thị hoặc xử lý kết quả trả về Đóng kết nối tới cơ sở dữ liệu 62
- Ngôn ngữ PL/pgSQL Giao diện lập trình C Giao diện lập trình C++ Giao diện lập trình JAVA Tạo nối kết đến cơ sở dữ liệu Giao diện lập trình PHP Loading jdbc driver: Class.forName("org.postgresql.Driver"); Tạo kết nối đến server Connection DriverManager::getConnection ( "jdbc:postgresql://host:port/database_name", "username", "password") Lấy thông tin lỗi kết nối: try catch (SQLException) 63
- Ngôn ngữ PL/pgSQL Giao diện lập trình C Giao diện lập trình C++ Giao diện lập trình JAVA Gởi câu truy vấn tới server Giao diện lập trình PHP Khởi tạo câu truy vấn và gửi câu truy vấn đến server Statement Connection::createStatement(); ResultSet Statement::executeQuery(String query); int Statement::executeUpdate(String query); Lấy thông tin lỗi trả về: try catch(SQLException) Lấy kết quả trả về: ResultSet::next(), ResultSet::getString(), ResultSet::getInt(), etc. boolean ResultSet::next(); String ResultSet::getString(int column_no); ResultSetMetaData ResultSet::getMetaData(); int ResultSetMetaData.getColumnCount(); etc 64
- Ngôn ngữ PL/pgSQL Giao diện lập trình C Giao diện lập trình C++ Giao diện lập trình JAVA Kết thúc kết nối tới server Giao diện lập trình PHP Trước hết nên giải phóng kết quả và sau đó sẽ đóng nối kết đến server void ResultSet::close(); void Statement::close(); void Connection::close(); 65
- Ngôn ngữ PL/pgSQL Giao diện lập trình C Giao diện lập trình C++ Giao diện lập trình JAVA Chương trình ví dụ, TestJdbc.java Giao diện lập trình PHP /* * Java sample program */ import java.io.*; import java.sql.*; public class TestJdbc { Connection conn; // holds database connection Statement stmt; // holds SQL statement public TestJdbc() throws ClassNotFoundException, FileNotFoundException, IOException, SQLException { // load database interface Class.forName("org.postgresql.Driver"); 66
- Ngôn ngữ PL/pgSQL Giao diện lập trình C Giao diện lập trình C++ Giao diện lập trình JAVA Chương trình ví dụ, TestJdbc.java Giao diện lập trình PHP // connect to the database conn = DriverManager.getConnection("jdbc:postgresql://m-nghi2:5432/test", "nghi", “xxxxxxxx"); // send the query stmt = conn.createStatement(); ResultSet res = stmt.executeQuery("SELECT name FROM cities"); if (res != null) while(res.next()) System.out.println(res.getString(1)); // free the result res.close(); stmt.close(); // disconnect from the database conn.close(); } 67
- Ngôn ngữ PL/pgSQL Giao diện lập trình C Giao diện lập trình C++ Giao diện lập trình JAVA Chương trình ví dụ, TestJdbc.java Giao diện lập trình PHP public static void main(String args[]) { try { TestJdbc test = new TestJdbc(); } catch(Exception exc) { System.err.println("Exception caught.\n" + exc); exc.printStackTrace(); } } // main } // class TestJdbc 68
- Ngôn ngữ PL/pgSQL Giao diện lập trình C Giao diện lập trình C++ Giao diện lập trình JAVA Dịch chương trình Giao diện lập trình PHP Chú ý đến vị trí thư viện pg__jdbc.jar Dịch: javac TestJdbc.java => chương trình thực thi trên máy ảo java TestJdbc 69
- Ngôn ngữ PL/pgSQL Giao diện lập trình C Giao diện lập trình C++ Giao diện lập trình JAVA Giao diện lập trình PHP 70
- Ngôn ngữ PL/pgSQL Giao diện lập trình C Giao diện lập trình C++ Giao diện lập trình JAVA Giao diện lập trình PHP Giao diện lập trình PHP Chương trình PHP giao tiếp với server: Trình tự của chương trình Tạo kết nối tới cơ sở dữ liệu trên server Gửi câu lệnh truy vấn SQL tới server Server thực hiện câu lệnh truy vấn Lấy kết quả trả về của lệnh truy vấn Hiển thị hoặc xử lý kết quả trả về trình duyệt dạng HTML Đóng kết nối tới cơ sở dữ liệu 71
- Ngôn ngữ PL/pgSQL Giao diện lập trình C Giao diện lập trình C++ Giao diện lập trình JAVA Tạo nối kết đến cơ sở dữ liệu Giao diện lập trình PHP Tạo kết nối đến server $dbconn = pg_connect("host= dbname= username= password= ") Lấy thông tin lỗi: pg_last_error() 72
- Ngôn ngữ PL/pgSQL Giao diện lập trình C Giao diện lập trình C++ Giao diện lập trình JAVA Gởi câu truy vấn tới server Giao diện lập trình PHP Thực thi câu truy vấn đến server $result = pg_query(“SQL ”) Lấy thông tin lỗi: pg_last_error() Lấy kết quả trả về: pg_num_rows(), pg_num_fields(), pg_fetch_array(), pg_fetch_row(), etc. int pg_num_rows(resource result ); int pg_num_fields(resource result ); array pg_fetch_array(resource result) ; array pg_fetch_row(resource result); etc 73
- Ngôn ngữ PL/pgSQL Giao diện lập trình C Giao diện lập trình C++ Giao diện lập trình JAVA Kết thúc kết nối tới server Giao diện lập trình PHP Trước hết nên giải phóng kết quả và sau đó sẽ đóng nối kết đến server bool pg_free_result (resource result); bool pg_close (resource connection); 74
- Ngôn ngữ PL/pgSQL Giao diện lập trình C Giao diện lập trình C++ Giao diện lập trình JAVA Chương trình ví dụ, Test.php Giao diện lập trình PHP "; echo " NC NAME POP NB_MUSEUMS "; 75
- Ngôn ngữ PL/pgSQL Giao diện lập trình C Giao diện lập trình C++ Giao diện lập trình JAVA Chương trình ví dụ, Test.php Giao diện lập trình PHP while ($row = pg_fetch_array($result)) { echo " "; echo " " . $row["nc"]. " "; echo " " . $row["name"]. " "; echo " " . $row["pop"]. " "; echo " " . $row["nb_museums"]. " "; echo " "; } echo " "; pg_free_result ($result); pg_close ($conn); ?> 76