app开发用到的技术,seo服务外包费用,devexpress 网站开发,个人网页设计页眉目录标题 1.基本语法结构二级目录三级目录 1.基本语法结构2。变量声明和使用3. SELECT 查询4.插入 insert5.更新UPDATE6.删除(DELETE) 7游标 cursor例子1#xff1a;基本游标使用例子2#xff1a;使用FOR循环的简化写法实际应用例子#xff1a;给高工资员工增加奖金 8 IF 条… 目录标题 1.基本语法结构二级目录三级目录 1.基本语法结构2。变量声明和使用3. SELECT 查询4.插入 insert5.更新UPDATE6.删除(DELETE) 7游标 cursor例子1基本游标使用例子2使用FOR循环的简化写法实际应用例子给高工资员工增加奖金 8 IF 条件判断9 循环语句10 存储过程11 函数 1.基本语法结构
二级目录
三级目录
1.基本语法结构 BEGIN – 执行部分 必须
END 例 CopyBEGIN DBMS_OUTPUT.PUT_LINE(‘Hello World’); END;
结果 Hello World
PL/SQL procedure successfully completed. DECLARE ———声明部分 可选 BEGIN – 执行部分 必须
EXCEPTION ——异常处理部分可选 END
2。变量声明和使用
DECLARE –基本变量类型 V_name VARCHAR2100-- 字符串类型 V_age NUMBER —— 数字类型 V_brithday DATE—— 日期类型 v_is_valid BOOLEAN; – 布尔类型
——变量声明并赋值 v_sarary NUMBER 8000–直接赋值 V_dept_name VARCHAR250 DFFAULT ‘技术部’ —— 使用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将查询结果存入变量 FROM emloyees WHERE employee_id 100;
DBMS_OUTPUT.PUT_LINE(员工姓名v_emp_name); DBMS_OUTPUT.PUT_LINE(员工薪资v_emp_salary);
END
结果 员工姓名: 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 -- 发生错误时回滚
ROLLBACK
DBMS_OUTPUT.PUT_LINE‘插入失败’SQLERRMEND
5.更新UPDATE
DECLARE v_salary_increase。NUMber 1000
BEGIN
– 更新满足提哦啊贱的记录 UPDATE employees SET salarysalary V_salary_increase WHERE department_id 90;
– 输出更新的行数
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 NUMBER10 BEGIN – 删除指定部门的员工 DELETE FROM employees WHERE department_id v_dept_id; DBMS_OUTPUT.PUT_LINE(删除了’SQL%ROWCOUNT‘条记录’) COMMITEXCEPTION
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 定义变量接收数据 v_emp_id employees.employee_id%TYPE; v_name. employees.first_name%TYPE; v_salary. employees.salary%TYPE;
BEGIN
– 3.打开游标
OPEN emp_cur; – 4 循环读取数据 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,关闭游标 CLOSE emp_cur;
END;
结果 ID: 100, 姓名: Steven, 工资: 24000 ID: 101, 姓名: Neena, 工资: 17000 ID: 102, 姓名: Lex, 工资: 17000
PL/SQL procedure successfully completed.
例子2使用FOR循环的简化写法
DECLARE – 只需定义游标 CURSOR emp_cur IS SELECT employee_id, first_name, salary FROM employees WHERE salary 15000; BEGIN – FOR循环自动处理打开、获取和关闭游标 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;
结果
员工ID 100 的奖金更新为: 2400 员工ID 101 的奖金更新为: 1700 员工ID 102 的奖金更新为: 1700
PL/SQL procedure successfully completed.
游标就像一个指针指向查询结果集中的当前行
开始时指向第一行之前 每次FETCH后移动到下一行 直到没有更多数据时停止
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 循环语句
有三种循环方式
– 1. 基本LOOP DECLARE v_counter NUMBER : 1; BEGIN LOOP DBMS_OUTPUT.PUT_LINE(计数: ’ || v_counter); v_counter : v_counter 1; EXIT WHEN v_counter 3; – 退出条件 END LOOP; END;
– 2. WHILE循环 DECLARE v_counter NUMBER : 1; BEGIN WHILE v_counter 3 LOOP DBMS_OUTPUT.PUT_LINE(计数: ’ || v_counter); v_counter : v_counter 1; END LOOP; END;
– 3. FOR循环 BEGIN FOR i IN 1…3 LOOP DBMS_OUTPUT.PUT_LINE(计数: ’ || i); END LOOP; END;
10 存储过程
– 创建存储过程 CREATE OR REPLACE PROCEDURE update_salary( p_emp_id IN NUMBER, – 输入参数 p_salary_increase IN NUMBER, p_result OUT VARCHAR2 – 输出参数 ) 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;-- 设置输出结果
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;
– 调用存储过程 DECLARE v_result VARCHAR2(200); BEGIN update_salary(100, 1000, v_result); DBMS_OUTPUT.PUT_LINE(v_result); END;
11 函数
– 创建函数 CREATE OR REPLACE FUNCTION calculate_bonus( p_salary IN NUMBER, p_rating IN NUMBER ) RETURN NUMBER IS v_bonus NUMBER; BEGIN – 根据评级计算奖金 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;
– 调用函数 DECLARE v_bonus NUMBER; BEGIN v_bonus : calculate_bonus(5000, 1); DBMS_OUTPUT.PUT_LINE(奖金是: ’ || v_bonus); END;
区别
存储过程可以有多个输入输出参数不返回值 函数可以有多个输入参数但只能返回一个值