I. KIẾN THỨC CHUNG

1. Các từ khóa

1. Toàn bộ quyền: ALL PRIVELEGES(grant)
2. Không giới hạn: UNLIMITED – (quota)
3. Xóa hết dữ liệu các bản: DROP ANY TABLE
4. Tất cả người dùng: PUBLIC
5. Gán bất cứ quyền gì cho người dùng khác: GRANT ANY ROLE
6. Quyền import/export dữ liệu: imp_full_database / exp_full_database 
7. Quyền xóa, Thực thi, Lấy dữ liệu: DELETE_CATALOG_ROLE / EXCUTE … / SELECT

2. Các tùy chọn

WITH GRANT OPTION: cho phép tiếp tục cấp quyền, ko dùng cho Role – (grant)
WITH ADMIN OPTION: người dùng có toàn quyền (create + grant role)
WITH CHECK OPTION: các dòng ko di cư ra khỏi VIEW
RESTRICT: (mặc định), ngưng thực thi nếu có phụ thuộc – (revoke + drop)
CASCADE: xóa hết – (revoke + drop + with … check option)
– CASCADE CONSTRAINTS: xóa toàn bộ ràng buộc, tham chiếu (drop table)
EXTERNALLY: xác nhận user bởi hệ điều hành – (identified… + role)

3. Một số cú pháp

Tăng hạn mức cho người dùng Kita thành 2M:

ALTER USER Kita QUOTA 2M on users

– Xem thông tin hạn mức người dùng Kita:

SELECT tablespace_name, blocks, bytes
FROM dba_ts_quotas
WHERE username=’Kita’

– Lấy thông tin tài khoản của người dùng

SELECT username, account_status, temporary_tablespace
FROM dba_users

– Liệt kê các “quyền đối tượng” được gán cho Kita:

SELECT * FROM dba_tab_privs
WHERE GRANTEE = ‘Kita’

– Liệt kê các “quyền hệ thống” được gán cho user và role:

  • Select * From dba_sys_privs

– Xem thông tin các quyền cấp phát cho người dùng:

  • Select role, password_required From dba_roles

– Muốn biết user hiện hành có quyền gì: Select * From session_privs
Thu hồi role từ tất cả người dùng: revoke tên_Role from PUBLIC
Gán quyền hệ thống cho tất cả người dùng: grant select, update to PUBLIC
Tạo bảng có cấu trúc giống bảng nhân viên: create table nv_backup AS select * from nhanvien
– Tạo ràng buộc khóa ngoại:

  • alter table nhavien ADD CONSTRAINT nv_fk foreign key (mach) references cuahang (mach)

Xóa ràng buộc khóa ngoại: alter table nhanvien drop constraint nv_fk

4. Cách Import/Export

Các tùy chọn: Constrains: các ràng buộc, File : tên tập tin DUMP, Log : Tập tin nhật kí, Full : Toàn bộ CSDL, Row : Exp dữ liệu ra file DUMP, Grants : các quyền, Indexes : chỉ mục, Owner : tên user cần thực hiện Exp, Table : các bảng, Fromuser…Touser: Imp

– Sử dụng Y hoặc N để thêm điều kiện:

Ví dụ chỉ Exp các bảng: tables = y
Cấu trúc Epx:

  • userid=…/…  file= tên.dmp  log=tên.log  owner=kita (toàn bộ schema của Kita) tables=nhanvien (chỉ exp bảng nhân viên)

Cấu trúc Imp:

  • imp userid=…/…  file=patch.dmp fromuser=…. touser=….

5. Biểu thức chính quy

Mẫu

Ý nghĩa

* Xuất hiện một hoặc nhiều lần
. Bất cứ ký tự gì ngoài NOT NULL
? Xuất hiện 0 hoặc 1 lần
+ Xuất hiện 1 hoặc nhiều lần
| OR
^ Bắt đầu dòng
$ Kết thúc dòng
[ … ] So khớp với danh sách các ký tự
{ i }, { i, }, { i, j } So khớp i lần, ít nhất i lần, ít nhất i lần nhưng <= j lần
\d, \D So khớp với ký tự là số, không là số
\s, \S So khớp với các ký tự khoảng trắng (space, tab, …)

regexp_LIKE : so khớp, i ko phân biệt, c phân biệt hoa thường
regexp_REPLACE : thay thế, nguồn-mẫu-thay bằng
regexp_INSTR : trả về vị trí, trả về 0 nếu ko có, nguồn-mẫu-vị trí-từ thứ
regexp_SUBSTR : cắt chuỗi, nguồn-mẫu-vị trí-từ thứ, ko có trả NULL

  • LIKE: sử dụng trong WHERE và các ràng buộc toàn vẹn.
  • Còn lại dùng cho SELECT
  • Sử dụng From DUAL

– Vd: Định nghĩa số điện thoại di động: 

    • alter table nhanvien add constraint ck_sdtdd check (REGEXP_LIKE(Sdt, ‘0\d{9,10}’))

6. Các hàm xử lý chuỗi

– Độ dài: LENGTH (a)
– Vị trí xuất hiện: INSTR (a,b,pos, i)
– Lấy kí tự: SUBSTR (a, pos, x)
– Ghép chuỗi: CONCAT(a,b)
– Dạng chữ: LOWER,UPPER (a)
– Cắt khỏi chuỗi (cả 2 bên, ở giữa ko cắt): TRIM(a,b), bên trái LTRIM(a,b), bên phải RTRIM(a,b)

7. Các hàm xử lý ngày tháng

Trả về ngày, tháng, năm của dữ liệu: EXTRACT(year|month|day FROM <ngày>)

    • select EXTRACT (month from ‘1992-09-04’) —> 09

Cộng tháng: ADD_MONTHS (ngày, tháng)

    • select add_months (sysdate,4)

Số tháng giữa 2 ngày: MONTHS_BETWEEN (ngày 1, ngày 2)

Ngày hiện tại: SYSDATE

8. Các hàm chuyển kiểu

– Số về kiểu: TO_CHAR(số)
– Ngày về chuỗi: TO_CHAR(ngày, định_dạng)

    • select TO_CHAR (sysdate, ‘dd-mm-yy hh24:mi:ss’) —> 09/04/1992 09:40:55

– Chuỗi thành ngày: TO_DATE(chuỗi_ngày, định_dạng)

9. Lập trình PL/SQL

– Thuộc tính:

  • Lấy kiểu của bảng: biến_bảng%ROWTYPE
  • Lấy kiểu của biến/trường: biến cột|biến%TYPE

– Định nghĩa kiểu dữ liệu: SUBTYPE tên IS ràng_buộc

subtype birthday is date not null;
myBir birthday := ‘09-Apr-1992‘;

– Kiểu TABLE: giống mảng:

  • TYPE tên_kiểu_bảng IS TABLE OF kiểu INDEX BY BYNARY_INTEGER tên_biến tên_kiểu_bảng

10. Con trỏ

– Nếu dùng FOR i in (Select…) thì khi dùng phải có i.___. Không cần khai báo biến, sử dụng luôn biến sẵn có.

for i in (select * from gd_0506 where magv = ma)
      loop
          if i.siso <= 80 then tong := tong + i.sotiet * 1;
          . . . .
          else tong := tong + i.sotiet * 1.5;
          end if;
      end loop;

Con trỏ sử dụng tham số truyền vào, ví dụ:

declare
    cursor ctro(ma emp.empno%type) is select * from emp where empno = ma;
begin
    for i in ctro(‘&Nhap_ma’)
    loop
        ………….
    end loop;

II. BUỔI 1 – LÀM QUEN VỚI ORACLE

1. Các bước thực hiện

– Copy tên máy vào Net manager (2 chỗ)

– Start các Services

– Mở Oracle à Unlock người dùng Scott

                        alter user scott identified by scott accout unlock;

– Kiểm tra (Net manager / Test)

2. Tạo người dùng mới

create user test1 identified by test1 default tablespace users
(temporary tablespace temp) quota 5M on users;

3. Cấp quyền: kết nối + Import + tạo bảng

grant create session, create table, imp_full_database to Kita;

4. Import dữ liệu

Imp userid=kita/kita file=ENROLLMENT.dmp fromuser=enrollment touser=kita

5. Thao tác với bảng

– Tạo bảng:

create table hocsinh
(
        mssv char(7) primary key,
        hoten varchar2(40),
        namsinh date default sysdate,
        malop varchar2(8) references Lop(MaLop)
)

III. BUỔI 2 – QUẢN LÝ BẢNG DỮ LIỆU

1. Giá trị mặc định

QGia varchar(20) default ‘VietNam’

2. Sửa cấu trúc bảng từ 8 số —-> (xxx) xxx-xxxx

alter table donvi modify tel char(14)
update donvi set tel= regexp_replace(trim(‘  ‘ from tel), ’(\d{1})(\d{3})(\d{4})’, ‘(00\1) \2-\3′);

3. Thêm ràng buộc, cập nhật dữ liệu bảng

alter table DONVI  add constraint ck_dvi_tel check (regexp_like(tel, ‘\(\d{3}\)\d{3}-\d{4}’))

– Tất cả khách hàng đã từng mua thẻ bảo hiểm y tế của Sở Điện Lực muốn mua tiếp 6 tháng bảo hiểm y tế này từ ngày hôm nay. hãy viết lệnh insert để thêm những bảo hiểm này một cách tự động

insert into thebh (maloai, makh, ngaybd, thoihan, ngaykt, conhl)
select distinct a.maloai, a.makh, sysdate, 6, add_months(sysdate,6), 1
from thebh a, kh b, donvi c, loaibh d
where a.makh = b.makh
and b.madv=c.madv
and d.maloai=a.maloai
and tendv=’SO DIEN LUC’
and tenloai=’BH Y TE’;

IV. THỰC HÀNH BUỔI 3

1. Dòng lệnh

– Hiện kết quả: set serveroutput on;
– Nhận dữ liệu do người dùng nhập: ten := &Nhap_ten_vao
– In dữ liệu ra: dbms_output.put_line(‘….’ || biến)
– Dòng mới: dbms_output.new_line

– Vòng lặp chạy ngược: FOR i IN REVERSE 1 . . 5

– Tính số năm/tuổi: EXTRACT (year from sysdate) – EXTRACT (year from birth)

– Giá trị trống: IS NULL

2. Thuộc tính

– Tạo biến có kiểu dữ liệu tương tự: vSalary employees.Salary%type

3. Truy vấn dữ liệu

Select last_name, salary Into vName, vSalary
From emloyees
Where employees_id = 120;

4. Các cấu trúc lệnh điều khiển

* IF

IF …. THEN
lệnh_1
ELSIF …. THEN
lệnh_2
ELSE
lệnh_3
END IF;

* CASE

CASE biến
WHEN ..1… THEN lệnh_1;
WHEN …2.. THEN lệnh_2;
ELSE lệnh_3
END CASE;

* Lặp LOOP

LOOP
Lệnh;
EXIT WHEN điều-kiện
END LOOP;

* WHILE

WHILE điều kiện
LOOP
Lệnh;
END LOOP;

* FOR

FOR chạy IN [REVERSE] nhỏ . . lớn
LOOP
lệnh;
END LOOP;

* GOTO

<<nhãn>>

lệnh;
GOTO nhãn;

5. Con trỏ

– Dùng trực tiếp, ko cần khai báo, ko dùng FETCH: FOR emp_rec IN Retire

– Chuyển những nhân viên qua bảng khác, và xóa khỏi bảng hiện tại:  DELETE FROM Emp

V. THỰC HÀNH BUỔI 4

1. Thủ tục

Trả về giá trị nào đó… thì trong phần khai báo phải có tên giá trị đó, chú ý sử dụng thêm OUT

Sử dụng OUT nếu trả về nội dung có sẵn trong bảng. P.128

Trả về lương thấp nhất và cao nhất ứng với mã công việc này

Create or replace procedure MucLuong (p_jobid jobs.job_id%TYPE, 

        min_lg OUT jobs.min_salary%type, max_lg OUT jobs.max_salary%type)

– Viết một thủ tục để thực hiện việc tăng lương cho các nhân viên với các tham số đầu vào là mã phòng ban và phần trăm lương tăng thêm.

CREATE OR REPLACE PROCEDURE raise_salary(dno NUMBER, percent NUMBER DEFAULT 0.5)
IS
BEGIN
    UPDATE scott.emp SET sal = sal * ((100 + percent)/100)
    WHERE deptno = dno;
    COMMIT;
END;

  • Sử dụng EXECUTE để thực thi

           set serveroutput on;

           EXECUTE raise_salary(20,10);

  • Gọi thủ tục có trả về:

set serveroutput on;
declare
begin
    GoiTen(‘CT00’);
end;

2. Hàm

– Nếu hàm không có tham số đầu vào thì không để ( . . . ), chỉ có tên hàm thôi!

create or replace function TAMUNGCN return nvarchar2

Gọi hàm :   select TongLuong(30) as Total from DUAL;

Gọi hàm và truyền vào biến:

     DECLARE
            kq  NUMBER;  //result  NUMBER := get_dept_salary(30);
      BEGIN   
            kq  := TongLuong(30);
            dbms_output.put_line(kq);
      END;

Viết một hàm để lấy tổng tiền lương của một phòng ban nào đó

create or replace function tongluong(ma number) return number
is
    sumsal number :=0 ;
begin
   select  sum(sal) into sumsal from emp
   where deptno = ma;
  return sumsal;
end;

3. Ngoại lệ

exception
    when no_data_found then
       dbms_output.put_line (‘Ma cong viec ‘ || p_jobid ||  ‘ khong tim thay’);
    when others then
       dbms_output.put_line (‘Khong biet loi gi’);

VI. THỰC HÀNH BUỔI 5

– Before : chạy trigger trước, kiểm tra dữ liệu thêm vào có họp lệ hay không rồi mới thêm

– After: chạy trigger sau, thường để lưu trữ thông tin khi xóa, sửa

– Cấu trúc 1:

CREATE OR REPLACE TRIGGER Cau1
AFTER INSERT OR UPDATE OF SAL, DEPTNO ON EMP
DECLARE
–Khai báo
BEGIN
…………
END;

– Cấu trúc 2:

CREATE OR REPLACE TRIGGER Cau2
AFTER UPDATE OF SAL on EMP
FOR EACH ROW
BEGIN
//(:new.Empno, :old.sal, :new.sal);
END;

Chú ý:Chỉ thuộc tính có trong bảng thay đổi mới có thể dùng :new. hoặc :old., còn những thuộc tính khác phải khai báo biến và truy xuất từ các bảng khác dựa trên các :new . (Như Câu 3 đề thi)