網(wǎng)站模板織夢免費西安百度推廣優(yōu)化公司
目錄標題
- 1.基本語法結(jié)構(gòu)
- 二級目錄
- 三級目錄
- 1.基本語法結(jié)構(gòu)
- 2。變量聲明和使用
- 3. SELECT 查詢
- 4.插入 insert
- 5.更新UPDATE
- 6.刪除(DELETE)
- 7游標 cursor
- 例子1:基本游標使用
- 例子2:使用FOR循環(huán)的簡化寫法
- 實際應用例子:給高工資員工增加獎金
- 8 IF 條件判斷
- 9 循環(huán)語句
- 10 存儲過程
- 11 函數(shù)
1.基本語法結(jié)構(gòu)
二級目錄
三級目錄
1.基本語法結(jié)構(gòu)
BEGIN
– 執(zhí)行部分 必須
END;
例:
CopyBEGIN
DBMS_OUTPUT.PUT_LINE(‘Hello World’);
END;
結(jié)果:
Hello World
PL/SQL procedure successfully completed.
DECLARE
———聲明部分 可選
BEGIN
– 執(zhí)行部分 必須
EXCEPTION
——異常處理部分(可選)
END;
2。變量聲明和使用
DECLARE
–基本變量類型
V_name VARCHAR2(100);-- 字符串類型
V_age NUMBER ;—— 數(shù)字類型
V_brithday DATE;—— 日期類型
v_is_valid BOOLEAN; – 布爾類型
——變量聲明并賦值
v_sarary NUMBER := 8000;–直接賦值
V_dept_name VARCHAR2(50) DFFAULT ‘技術(shù)部’ ;—— 使用DEFAULT賦默認值
BEGIN
—— 變量賦值
V_name : = ‘張三’;
V_age := 25;
V_brithday := TO_DATE(‘1998-01-01’, ‘YYYY-MM-DD’);
v_is_valid := TRUE;
——打印變量
DBMS_OUTPUT.PUT_LINE(‘姓名:’ || v_name);
DBMS_OUTPUT.PUT_LINE(‘ 年齡:’ || V_age);
DBMS_OUTPUT.PUT_LINE(‘ 生日:’|| TO_CHAR(v_birthday,‘YYYY-MM-DD’));
END;
3. SELECT 查詢
DECLARE
v_emp_name VERCHAR2(100);
V_emp_salary NUMNER;
BEGIN
– 單個值查詢
SELECT first_name,salary
INTO v_emp_name,V_emp_salary – 使用INTO將查詢結(jié)果存入變量
FROM emloyees
WHERE employee_id =100;
DBMS_OUTPUT.PUT_LINE('員工姓名:'||v_emp_name);
DBMS_OUTPUT.PUT_LINE('員工薪資:'||v_emp_salary);
END;
結(jié)果:
員工姓名: Steven
工資: 24000
PL/SQL procedure successfully completed.
4.插入 insert
DECLARE
V_emp_id NUMBER :=301;
BEGIN
– 插入一條新記錄
INSERT INTO employees
( employee_id,first_name,last_name,email,hire_date,job_id)
VALUES
(v_emp_id,‘小明’,‘王’,‘xiaoming’,SYSDATE,‘IT_PROG’);
– 提交事物
COMMIT;
DBMS_OUTPUT.PUT_LINE(‘插入成功’);
EXCEPTION
WHEN OTHERS THEN
-- 發(fā)生錯誤時回滾
ROLLBACK;
DBMS_OUTPUT.PUT_LINE(‘插入失敗:’||SQLERRM);
END;
5.更新UPDATE
DECLARE
v_salary_increase。NUMber :=1000;
BEGIN
– 更新滿足提哦啊賤的記錄
UPDATE employees
SET salary=salary + V_salary_increase
WHERE department_id = 90;
– 輸出更新的行數(shù)
DBMS_OUTPUT.PUT_LINE('更新了’||SQL%ROWCOUNT||‘條記錄’);
COMMIT;
EXCEPTION
WHEN OTHERS THEN
ROLLB ACK:
DBMS_OUTPUT.PUT_LINE('更新失敗’||SQLERRM);
END;
6.刪除(DELETE)
DECLARE
V_dept_id NUMBER:=10;
BEGIN
– 刪除指定部門的員工
DELETE FROM employees
WHERE department_id = v_dept_id;
DBMS_OUTPUT.PUT_LINE('刪除了’||SQL%ROWCOUNT||‘條記錄’);
COMMIT;
EXCEPTION
WHEN OTHERS THEN
ROLLBACK;
DBMS_OUTPUT.PUT_LINE(’刪除失敗:‘||SQLERROM);
END;
7游標 cursor
例如TBL
EMPLOYEE_ID FIRST_NAME SALARY
100 Steven 24000
101 Neena 17000
102 Lex 17000
例子1:基本游標使用
DECLARE
– 1 定義游標
CURSOR emp_cur IS
SELECT employee_id,first_name,salary
FROM employees
WHERE salary > 15000;
– 2 定義變量接收數(shù)據(jù)
v_emp_id employees.employee_id%TYPE;
v_name. employees.first_name%TYPE;
v_salary. employees.salary%TYPE;
BEGIN
– 3.打開游標
OPEN emp_cur;
– 4 循環(huán)讀取數(shù)據(jù)
LOOP
FETCH emp_cur INTO v_emp_id, v_name, v_salary;
EXIT WHEN emp_cur%NOTFOUND;
DBMS_OUTPUT.PUT_LINE('ID: ’ || v_emp_id ||
', 姓名: ’ || v_name ||
', 工資: ’ || v_salary);
END LOOP;
– 5,關(guān)閉游標
CLOSE emp_cur;
END;
結(jié)果
ID: 100, 姓名: Steven, 工資: 24000
ID: 101, 姓名: Neena, 工資: 17000
ID: 102, 姓名: Lex, 工資: 17000
PL/SQL procedure successfully completed.
例子2:使用FOR循環(huán)的簡化寫法
DECLARE
– 只需定義游標
CURSOR emp_cur IS
SELECT employee_id, first_name, salary
FROM employees
WHERE salary > 15000;
BEGIN
– FOR循環(huán)自動處理打開、獲取和關(guān)閉游標
FOR emp_rec IN emp_cur LOOP
DBMS_OUTPUT.PUT_LINE('ID: ’ || emp_rec.employee_id ||
', 姓名: ’ || emp_rec.first_name ||
', 工資: ’ || emp_rec.salary);
END LOOP;
END;
實際應用例子:給高工資員工增加獎金
DECLARE
CURSOR emp_cur IS
SELECT employee_id, salary
FROM employees
WHERE salary > 15000;
v_bonus NUMBER;
BEGIN
FOR emp_rec IN emp_cur LOOP
– 計算獎金:工資的10%
v_bonus := emp_rec.salary * 0.1;
-- 更新員工獎金UPDATE employees SET bonus = v_bonusWHERE employee_id = emp_rec.employee_id;DBMS_OUTPUT.PUT_LINE('員工ID ' || emp_rec.employee_id || ' 的獎金更新為: ' || v_bonus);
END LOOP;-- 提交事務
COMMIT;
END;
結(jié)果
員工ID 100 的獎金更新為: 2400
員工ID 101 的獎金更新為: 1700
員工ID 102 的獎金更新為: 1700
PL/SQL procedure successfully completed.
游標就像一個指針,指向查詢結(jié)果集中的當前行:
開始時指向第一行之前
每次FETCH后移動到下一行
直到?jīng)]有更多數(shù)據(jù)時停止
8 IF 條件判斷
DECLARE
v_salary NUMBER := 5000;
BEGIN
– 基本IF語句
IF v_salary > 3000 THEN
DBMS_OUTPUT.PUT_LINE(‘工資高于3000’);
ELSIF v_salary > 2000 THEN
DBMS_OUTPUT.PUT_LINE(‘工資在2000-3000之間’);
ELSE
DBMS_OUTPUT.PUT_LINE(‘工資低于2000’);
END IF;
END;
9 循環(huán)語句
有三種循環(huán)方式:
– 1. 基本LOOP
DECLARE
v_counter NUMBER := 1;
BEGIN
LOOP
DBMS_OUTPUT.PUT_LINE('計數(shù): ’ || v_counter);
v_counter := v_counter + 1;
EXIT WHEN v_counter > 3; – 退出條件
END LOOP;
END;
– 2. WHILE循環(huán)
DECLARE
v_counter NUMBER := 1;
BEGIN
WHILE v_counter <= 3 LOOP
DBMS_OUTPUT.PUT_LINE('計數(shù): ’ || v_counter);
v_counter := v_counter + 1;
END LOOP;
END;
– 3. FOR循環(huán)
BEGIN
FOR i IN 1…3 LOOP
DBMS_OUTPUT.PUT_LINE('計數(shù): ’ || i);
END LOOP;
END;
10 存儲過程
– 創(chuàng)建存儲過程
CREATE OR REPLACE PROCEDURE update_salary(
p_emp_id IN NUMBER, – 輸入?yún)?shù)
p_salary_increase IN NUMBER,
p_result OUT VARCHAR2 – 輸出參數(shù)
)
IS
v_old_salary NUMBER;
BEGIN
– 獲取原工資
SELECT salary INTO v_old_salary
FROM employees
WHERE employee_id = p_emp_id;
-- 更新工資
UPDATE employees
SET salary = salary + p_salary_increase
WHERE employee_id = p_emp_id;-- 設(shè)置輸出結(jié)果
p_result := '更新成功!原工資:'||v_old_salary||',新工資:'||(v_old_salary + p_salary_increase);COMMIT;
EXCEPTION
WHEN NO_DATA_FOUND THEN
p_result := ‘未找到員工’;
WHEN OTHERS THEN
p_result := ‘更新失敗:’||SQLERRM;
ROLLBACK;
END;
– 調(diào)用存儲過程
DECLARE
v_result VARCHAR2(200);
BEGIN
update_salary(100, 1000, v_result);
DBMS_OUTPUT.PUT_LINE(v_result);
END;
11 函數(shù)
– 創(chuàng)建函數(shù)
CREATE OR REPLACE FUNCTION calculate_bonus(
p_salary IN NUMBER,
p_rating IN NUMBER
) RETURN NUMBER
IS
v_bonus NUMBER;
BEGIN
– 根據(jù)評級計算獎金
CASE p_rating
WHEN 1 THEN v_bonus := p_salary * 0.2;
WHEN 2 THEN v_bonus := p_salary * 0.15;
WHEN 3 THEN v_bonus := p_salary * 0.1;
ELSE v_bonus := 0;
END CASE;
RETURN v_bonus;
END;
– 調(diào)用函數(shù)
DECLARE
v_bonus NUMBER;
BEGIN
v_bonus := calculate_bonus(5000, 1);
DBMS_OUTPUT.PUT_LINE('獎金是: ’ || v_bonus);
END;
區(qū)別:
存儲過程:可以有多個輸入輸出參數(shù),不返回值
函數(shù):可以有多個輸入?yún)?shù),但只能返回一個值