一篇文章带你学会 Oracle 存储过程的基本介绍和高阶用法(上)

简介: 一篇文章带你学会 Oracle 存储过程的基本介绍和高阶用法

🏆 文章目标:关于之前发布的 PostgreSQL 存储过程相关的文章,网友反馈还是不错的,特此编写这篇文章来帮助那些需要了解Oracle 存储过程,用于快速整改或者上手,也是对大家的回馈。

🍀 一篇文章带你学会 Oracle 存储过程的基本介绍和高阶用法

✅ 创作者:Jay…

🎉 个人主页:Jay的个人主页

🍁 展望:若本篇讲解内容帮助到您,请帮忙点个赞吧,再点点您的小手关注下,您的支持是我继续写作的最大动力,谢谢🙏 作为回馈,对我博客内容感兴趣的小伙伴可以私聊我,我免费分享 Oracle PL/SQL 的编码规范,大家一起共同进步。

Oracle PL/SQL 入门教程

Oracle PL/SQL(Procedural Language/Structured Query Language)是Oracle数据库中的过程式扩展,用于构建复杂的数据库应用程序。本教程将带领您了解PL/SQL的基础知识和一些简单的案例。

PL/SQL是一种结构化的编程语言,允许开发者在Oracle数据库中编写过程、函数、触发器和包。这使得在数据库中执行复杂的逻辑操作成为可能。PL/SQL语言具有高性能、易于调试和维护的优点。

1. PL/SQL 基本结构

PL/SQL 的基本结构包括声明部分、执行部分和异常处理部分。一个典型的 PL/SQL 块如下所示:

基本结构:

DECLARE
  -- 声明部分
BEGIN
  -- 执行部分
EXCEPTION
  -- 异常处理部分
END;

示例:

DECLARE
  -- 声明部分
  v_name VARCHAR2(100);
BEGIN
  -- 执行部分
  SELECT first_name INTO v_name
  FROM employees
  WHERE employee_id = 100;
  
  DBMS_OUTPUT.PUT_LINE('Employee Name: ' || v_name);
EXCEPTION
  -- 异常处理部分
  WHEN NO_DATA_FOUND THEN
    DBMS_OUTPUT.PUT_LINE('No data found for employee ID 100.');
  WHEN OTHERS THEN
    DBMS_OUTPUT.PUT_LINE('An error occurred.');
END;
/

1.1 声明部分

在声明部分,可以声明变量、常量、游标、类型等。声明的语法如下:

variable_name data_type [NOT NULL] [:= default_value];
constant_name CONSTANT data_type := value;

1.2 执行部分

执行部分是 PL/SQL 块的主体,包括 SQL 语句、控制结构、循环等。

1.3 异常处理部分

异常处理部分用于捕获并处理运行时出现的错误。PL/SQL 支持自定义异常,也支持预定义异常。

2. 变量和常量

在PL/SQL中,可以使用DECLARE部分声明变量和常量。变量用于存储中间值,常量用于存储不可更改的值。

2.1 变量

声明变量的语法:

variable_name datatype [NOT NULL] [:= initial_value];

示例:

DECLARE
  v_age NUMBER := 30;
  v_salary NUMBER;
BEGIN
  v_salary := v_age * 1000;
  DBMS_OUTPUT.PUT_LINE('Salary: ' || v_salary);
END;
/

2.2 常量

声明常量的语法:

constant_name CONSTANT datatype := value;

示例:

DECLARE
  c_tax_rate CONSTANT NUMBER := 0.15;
  v_income NUMBER := 10000;
  v_tax NUMBER;
BEGIN
  v_tax := v_income * c_tax_rate;
  DBMS_OUTPUT.PUT_LINE('Tax: ' || v_tax);
END;
/

3. 条件和循环控制

PL/SQL支持多种条件和循环控制结构,例如IF语句、CASE语句、FOR循环和WHILE循环。

3.1 IF语句

IF语句语法:

IF condition THEN
  -- statements
ELSIF condition THEN
  -- statements
ELSE
  -- statements
END IF;

示例:

DECLARE
  v_age NUMBER := 25;
BEGIN
  IF v_age < 20 THEN
    DBMS_OUTPUT.PUT_LINE('Teenager');
  ELSIF v_age >= 20 AND v_age < 30 THEN
    DBMS_OUTPUT.PUT_LINE('Young adult');
  ELSE
    DBMS_OUTPUT.PUT_LINE('Adult');
  END IF;
END;
/

3.2 CASE语句

CASE语句语法:

CASE [expression]
  WHEN value1 THEN
    -- statements
  WHEN value2 THEN
    -- statements
  [ELSE
    -- statements]
END CASE;

示例:

DECLARE
  v_score NUMBER := 85;
  v_grade CHAR(1);
BEGIN
  CASE
    WHEN v_score >= 90 THEN
      v_grade := 'A';
    WHEN v_score >= 80 THEN
      v_grade := 'B';
    WHEN v_score >= 70 THEN
      v_grade := 'C';
    ELSE
      v_grade := 'F';
  END CASE;
  
  DBMS_OUTPUT.PUT_LINE('Grade: ' || v_grade);
END;
/

3.3 FOR循环

FOR循环语法:

FOR counter IN [REVERSE] lower_bound..upper_bound LOOP
  -- statements
END LOOP

示例:

DECLARE
BEGIN
  FOR i IN 1..5 LOOP
    DBMS_OUTPUT.PUT_LINE('Iteration: ' || i);
  END LOOP;
END;
/

3.4 WHILE循环

WHILE循环语法:

WHILE condition LOOP
  -- statements
END LOOP;

示例:

DECLARE
  v_counter NUMBER := 1;
BEGIN
  WHILE v_counter <= 5 LOOP
    DBMS_OUTPUT.PUT_LINE('Iteration: ' || v_counter);
    v_counter := v_counter + 1;
  END LOOP;
END;
/

3.5 示例

计算阶乘

以下示例演示了如何使用PL/SQL计算一个数字的阶乘:

DECLARE
  v_number NUMBER := 5;
  v_factorial NUMBER := 1;
BEGIN
  FOR i IN 1..v_number LOOP
    v_factorial := v_factorial * i;
  END LOOP;
  DBMS_OUTPUT.PUT_LINE('Factorial of ' || v_number || ' is ' || v_factorial);
END;
/
检查素数

以下示例演示了如何使用PL/SQL检查一个数字是否为素数:

DECLARE
  v_number NUMBER := 29;
  v_is_prime BOOLEAN := TRUE;
BEGIN
  FOR i IN 2..FLOOR(SQRT(v_number)) LOOP
    IF MOD(v_number, i) = 0 THEN
      v_is_prime := FALSE;
      EXIT;
    END IF;
  END LOOP;
  IF v_is_prime THEN
    DBMS_OUTPUT.PUT_LINE(v_number || ' is a prime number.');
  ELSE
    DBMS_OUTPUT.PUT_LINE(v_number || ' is not a prime number.');
  END IF;
END;
/
计算平均工资

假设我们有一个 employees 表,现在要计算所有员工的平均工资,并将结果存储在一个变量中。

sqlCopy code
DECLARE
  v_total_salary NUMBER := 0;
  v_avg_salary NUMBER;
  v_employee_count NUMBER := 0;
BEGIN
  -- 计算员工总工资
  SELECT SUM(salary) INTO v_total_salary
  FROM employees;
  -- 计算员工总数
  SELECT COUNT(*) INTO v_employee_count
  FROM employees;
  -- 计算平均工资
  IF v_employee_count > 0 THEN
    v_avg_salary := v_total_salary / v_employee_count;
    DBMS_OUTPUT.PUT_LINE('平均工资为:' || TO_CHAR(v_avg_salary));
  ELSE
    DBMS_OUTPUT.PUT_LINE('无员工数据');
  END IF;
EXCEPTION
  WHEN OTHERS THEN
    DBMS_OUTPUT.PUT_LINE('发生错误:' || SQLERRM);
END;
/

这个例子展示了 PL/SQL 基本结构和控制结构的用法。首先,我们声明了三个变量:v_total_salaryv_avg_salaryv_employee_count。然后,在执行部分,我们分别查询员工总工资和员工总数,并将结果存储在相应的变量中。接下来,我们使用 IF-THEN-ELSE 控制结构计算平均工资,并通过 DBMS_OUTPUT.PUT_LINE 输出结果。最后,我们使用异常处理部分捕获可能出现的错误。

4. 存储过程和函数

PL/SQL 允许创建存储过程和函数,它们是可重用的 PL/SQL 代码块,可以从其他PL/SQL代码块、SQL语句或应用程序中调用。存储过程和函数的主要区别在于,函数必须返回一个值,而存储过程不需要。

关注公众号:熊猫Jay字节之旅,了解更多 AI 技巧 ~

一篇文章带你学会 Oracle 存储过程的基本介绍和高阶用法(下)+https://developer.aliyun.com/article/1492306

相关文章
|
2天前
|
SQL Oracle 关系型数据库
Oracle中的游标用法总结
Oracle中的游标用法总结
|
19天前
|
存储 关系型数据库 MySQL
MySQL数据库——存储过程-if条件判断、参数、case(介绍、用法、案例)
MySQL数据库——存储过程-if条件判断、参数、case(介绍、用法、案例)
30 0
|
22天前
|
存储 SQL Oracle
oracle 存储过程导出sql语句 导出为文件
oracle 存储过程导出sql语句 导出为文件
50 0
|
1月前
|
存储 SQL 数据库
MSSQL存储过程的功能和用法
MSSQL存储过程的功能和用法
29 1
|
1月前
|
SQL 存储 Oracle
一篇文章带你学会 Oracle 存储过程的基本介绍和高阶用法(下)
一篇文章带你学会 Oracle 存储过程的基本介绍和高阶用法
|
1月前
|
存储 SQL 数据库
MSSQL 存储过程:功能和用法详解
MSSQL 存储过程:功能和用法详解
27 0
|
21天前
|
Oracle 关系型数据库 数据库
已解决:idea 连接 oracle 数据库 避雷
已解决:idea 连接 oracle 数据库 避雷
19 2
|
1天前
|
Oracle 数据可视化 关系型数据库
Oracle数据库安装及使用Navicat连接oracle2
Oracle数据库安装及使用Navicat连接oracle
19 1
|
10天前
|
Oracle 关系型数据库 数据库
实时计算 Flink版产品使用问题之连接到Oracle数据库但无法读取到数据,是什么导致的
实时计算Flink版作为一种强大的流处理和批处理统一的计算框架,广泛应用于各种需要实时数据处理和分析的场景。实时计算Flink版通常结合SQL接口、DataStream API、以及与上下游数据源和存储系统的丰富连接器,提供了一套全面的解决方案,以应对各种实时计算需求。其低延迟、高吞吐、容错性强的特点,使其成为众多企业和组织实时数据处理首选的技术平台。以下是实时计算Flink版的一些典型使用合集。
|
18天前
|
SQL Oracle 关系型数据库
探索 Linux 命令 `db_archive`:Oracle 数据库归档日志的工具
探索 Linux 中的 `db_archive`,实际与 Oracle 数据库归档日志管理相关。在 Oracle 中,归档日志用于恢复,当在线重做日志满时自动归档。管理员可使用 SQL*Plus 查看归档模式,通过 `RMAN` 进行备份和恢复操作。管理归档日志需谨慎,避免数据丢失。了解归档管理对 Oracle 管理员至关重要,确保故障时能快速恢复数据库。

推荐镜像

更多