当前位置: 首页 > article >正文

【PL/SQL】常用操作复习20250212

目录标题

  • 1.基本语法结构
    • 二级目录
      • 三级目录
    • 1.基本语法结构
    • 2。变量声明和使用
    • 3. SELECT 查询
    • 4.插入 insert
      • 5.更新UPDATE
      • 6.删除(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 VARCHAR2(100);-- 字符串类型
V_age NUMBER ;—— 数字类型
V_brithday DATE;—— 日期类型
v_is_valid BOOLEAN; – 布尔类型

——变量声明并赋值
v_sarary NUMBER := 8000;–直接赋值
V_dept_name VARCHAR2(50) 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(‘插入失败:’||SQLERRM);

END;

5.更新UPDATE

DECLARE
v_salary_increase。NUMber :=1000;

BEGIN

– 更新满足提哦啊贱的记录
UPDATE employees
SET salary=salary + 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 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 定义变量接收数据
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_bonus
    WHERE 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;

区别:

存储过程:可以有多个输入输出参数,不返回值
函数:可以有多个输入参数,但只能返回一个值


http://www.kler.cn/a/545454.html

相关文章:

  • PHP防伪溯源查询系统小程序
  • 基于 Filebeat 的日志收集
  • windows 通过docker 安装mysql
  • 数据集成实例分享:金蝶云星空对接旺店通实现库存管理自动化
  • Java 后端开发:如何提取请求头中的 Cookie 和身份验证 Token
  • 【ISO 14229-1:2023 UDS诊断全量测试用例清单系列:第五节】
  • AI 网关对决:Higress 与 OneAPI 的功能对比
  • 使用MaxKB及deepseek搭建本地AI知识库
  • 开发美颜相机录制视频时,对于音频数据的处理
  • 数据结构 动态顺序表-vector
  • 《8天入门Trustzone/TEE/安全架构》
  • uniapp - iconfont下载本地并且运用至项目上
  • vscode C/C++ CMake 调试
  • DeepSeek 本地部署(电脑安装)
  • “PEP 8: W292 no newline at end of file“报错 IntelliJ IDEA自动添加空行问题
  • 读取本地excel并生成map,key为第一列,value为第二列
  • CSS实现与文字长度相同的下划线
  • CSS实现自上层放大动画
  • ANI-AGI-ASI
  • Postman配置环境变量(超详细的)