何为存储过程何为函数,他们区别如何?

本文详细阐述了存储过程和函数在数据库操作中的不同应用。存储过程支持多种参数类型,包括输入、输出和输入输出参数,而函数仅支持输入参数并返回单一值。文章还介绍了它们的调用方式和语法结构,提供了具体的示例代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

存储过程和函数目的是为了可重复地执行操作数据库的sql语句的集合。

区别是写法和调用上。

写法上:存储过程的参数列表可以有输入参数,输出参数,可输入输出的参数;

            函数的参数列表只有输入参数,并且有返回<返回值类型,无长度说明>。

返回值上

    存储过程的返回值,可以有多个值,

           函数的返回值,只有一个值。

调用方式上

    存储过程的调用方式有:

1),exec <过程名>;

2),执行<过程名>;

3)中,在PL / SQL语句块中直接调用。

            函数的调用方式有:

      在PL / SQL语句块中直接调用。

                 具体分为:

  ----调用功能add_three_numbers

  ---- 1。位置表示法调用函数

  开始

  DBMS_OUTPUT.PUT_LINE(add_three_numbers(2,4,5-));

  结束;

  ---- 2。命名表示法调用函数

  开始

  dbms_output.put_line(add_three_numbers(b => 3,a => 4,c => 2));

  结束;

  ---- 3。混合使用位置表示法和命名表示法调用函数

  开始

  dbms_output.put_line(add_three_numbers(3,b => 4,c => 2));

  结束;

  ---- 4。排除表示法

  开始

  DBMS_OUTPUT.PUT_LINE(add_three_numbers(12,C => 2));

  结束;

  ---- 5。sql调用表示法 - 混合表示法

  SELECT add_three_numbers(3,b => 4,c => 2)FROM DUAL;

 

---- 1。该函数接受3个可选参数,返回3个数字的和

  创建或替换函数add_three_numbers

  (

  NUMBER:= 0,b NUMBER:= 0,c NUMBER:= 0

  )

  返回号码是

  开始

  返回a + b + c;

  结束;

      

存储过程:

基本语法:

create procedure <过程名>(<参数列表,无参时忽略>)

因为|是

变量声明,初始化

开始

业务处理,逻辑代码

例外

异常捕获,容错处理

结束<过程名>;

参数:<参数名> in | out | in out <参数类型,无长度说明>,如:v_name varchar2

在:入参

出:出参

in out:出入参

注:因为|是表示为或为

调用语法:

1),exec <过程名>;

2),执行<过程名>;

3)中,在PL / SQL语句块中直接调用。

例:

创建或替换过程up_wap(out varchar2中的v_param1,输出varchar2中的v_param2)

v_temp varchar2(20);

开始

dbms_output.put_line('交换前参数1:'|| v_param1 ||'参数2:'|| v_param2);

v_temp:= v_param1;

v_param1:= v_param2;

v_param2:= v_temp;

dbms_output.put_line('交换后参数1:'|| v_param1 ||'参数2:'|| v_param2);

例外

当其他人然后dbms_output.put_line('程序up_wap执行时出错!');

结束up_wap;

/

调用存储过程

宣布

v_param1 varchar2(20):='param1';

v_param2 varchar2(20):='param2';

开始

up_wap(v_param1 => v_param1,v_param2 => v_param2);

结束;

/

 

 自定义函数(功能)

基本语法:

创建函数<函数名>(<参数列表,无参时忽略>)

return <返回值类型,无长度说明>

因为|是

变量声明,初始化

开始

业务处理,逻辑代码

return <返回的值>;

例外

异常捕获,容错处理

结束<函数名>;

参数:in入参

注:只有入参的类型。

在存储过程和自定义函数中的参数的传递(入参和出参)不能使用类型%或%行类型匹配,不能使用空值零,但是存储过程可以返回空值。

例:

create function uf_select_name_by_id_test(v_id in number)

return varchar2

v_name t_test.t_name%type;

开始

从t_test中选择t_name到v_name,其中t_id = v_id;

return v_name;

例外

当其他人然后dbms_output.put_line('error');

结束uf_select_name_by_id_test;

/

从双重中选择uf_select_name_by_id_test(1)姓名; - 选择调用

declare  --pl / sql 语句块调用

v_name varchar2(20);

开始

v_name:= uf_select_name_by_id_test(1);

dbms_output.put_line('name ='|| v_name);

结束;

/

<think>我们正在讨论键值对(Key-Value Pair)的概念。键值对是一种基本的数据结构,由两个相关联的元素组成:键(Key)值(Value)。键是唯一的标识符,用于访问检索对应的值。值则是与键关联的数据。 在计算机科学中,键值对广泛应用于各种场景,例如: - 数据库系统(如Redis)中存储数据 - 编程语言中的映射(Map)或字典(Dictionary)数据结构 - 配置文件中的参数设置 - 分布式文件系统(如HDFS)中处理数据的分割 根据引用[1]引用[2],我们可以从两个角度理解键值对: 1. **在Hadoop MapReduce中**(引用[1]): - 当处理存储在HDFS中的文件时,InputFormat将文件分割成多个部分,并由RecordReader转换成键值对。 - 例如,对于文本文件,默认的TextInputFormat会产生这样的键值对: - **Key**:该行在文件中的起始字节偏移量(一个长整数) - **Value**:该行的内容(不包括行结束符) - 示例:文件内容为"Jerry is a good man.",可能被转换成键值对`(0, "Jerry is a good man.")`。 2. **在Java集合框架中**(引用[2]): - Map是一种存储键值对的集合,其中键是唯一的,每个键映射到一个值。 - 常见的Map实现类包括: - `HashMap`:基于哈希表实现,无序。 - `TreeMap`:基于红黑树实现,按键的自然顺序排序。 - `LinkedHashMap`:保持键的插入顺序。 - 遍历Map时,可以通过`entrySet()`方法获取键值对集合(`Entry<Key, Value>`),然后遍历每个键值对。 ### 键值对的特性 - **键的唯一性**:在同一个集合中,每个键只能出现一次。如果重复添加相同的键,新值会覆盖旧值。 - **快速访问**:通过键可以快速检索到对应的值,效率很高(通常为$O(1)$或$O(\log n)$时间复杂度)。 - **键值的类型**:键值可以是任意对象类型(在Java中必须是对象,不能是基本数据类型)。 ### 示例代码(Java中的Map使用) ```java import java.util.HashMap; import java.util.Map; public class KeyValueExample { public static void main(String[] args) { // 创建一个HashMap实例 Map<String, Integer> studentScores = new HashMap<>(); // 添加键值对 studentScores.put("Alice", 95); studentScores.put("Bob", 88); studentScores.put("Charlie", 91); // 通过键获取值 int aliceScore = studentScores.get("Alice"); System.out.println("Alice's score: " + aliceScore); // 输出: Alice's score: 95 // 遍历所有键值对 for (Map.Entry<String, Integer> entry : studentScores.entrySet()) { System.out.println(entry.getKey() + ": " + entry.getValue()); } } } ``` ### 键值对的应用场景 1. **缓存系统**:如Redis,通过键快速存取数据。 2. **配置文件**:将配置参数存储为键值对(如`key=value`)。 3. **数据索引**:在数据库中通过键(如主键)查找记录。 4. **分布式计算**:MapReduce框架中,MapperReducer处理的数据单位就是键值对。 ### 键值对与其他数据结构的比较 | 数据结构 | 特点 | 适用场景 | |----------|------|----------| | 数组/列表 | 通过索引访问元素,有序 | 需要顺序访问或索引已知的情况 | | 集合(Set) | 存储唯一元素,无序 | 去重操作,成员存在性检查 | | 键值对(Map) | 通过唯一键访问值 | 快速查找、关联数据存储 | > 键值对的核心优势在于**通过键直接定位值**,无需遍历整个数据集,这使得它在需要高效查找的场景中非常有用[^1][^2]。 --- §§ 相关问题 §§ 1. 在Java中如何正确重写`equals()``hashCode()`方法以作为Map的键? 2. Redis的键值对存储与Java的Map实现有何异同? 3. 如何处理MapReduce中键冲突(相同Key)的问题? 4. 在分布式系统中,如何保证键值对存储的一致性?</think>### 键值对(Key-Value Pair)详解 键值对是计算机科学中的**基础数据结构**,由两个关联元素组成: - **键(Key)**:唯一标识符,用于定位检索数据 - **值(Value)**:与键关联的实际数据内容 #### 核心特性 1. **唯一性** 同一集合中键必须唯一(如Java的`Map`或Redis),重复键会覆盖旧值 ```java Map<String, Integer> scores = new HashMap<>(); scores.put("Alice", 95); // 键="Alice", 值=95 scores.put("Alice", 100); // 覆盖原有值 ``` 2. **高效检索** 通过键可直接访问值,时间复杂度通常为$O(1)$(哈希表实现) 3. **键值关系** - 键决定数据存储位置(如哈希函数映射) - 值可以是任意数据类型(字符串、对象、集合等) #### 典型应用场景 1. **Hadoop MapReduce**(引用[1]) - 输入阶段:`TextInputFormat`将文本转换为键值对 ```python # 文件内容: "Jerry is a good man." (0, "Jerry is a good man.") # Key=字节偏移量, Value=行内容 ``` - Mapper输出:`(中间Key, 中间Value)` - Reducer输入:`(Key, Value集合)` 2. **Java集合框架**(引用[2]) | 实现类 | 特点 | 键值对示例 | |--------------|-----------------------|--------------------------| | `HashMap` | 无序,基于哈希表 | `{"name":"Jerry", "age":35}` | | `TreeMap` | 按键自然排序 | `{"a":1, "b":2, "c":3}` | | `LinkedHashMap` | 保留插入顺序 | `{"z":1, "x":2, "y":3}` → 遍历顺序不变 | 3. **数据库系统** - Redis:`SET user:1001 "Jerry"` - NoSQL:文档数据库中的JSON对象(如MongoDB) #### 键值对操作示例(Java) ```java Map<String, String> userData = new HashMap<>(); // 添加键值对 userData.put("name", "Jerry"); userData.put("job", "Engineer"); // 通过键检索值 String name = userData.get("name"); // 返回"Jerry" // 遍历所有键值对 for (Map.Entry<String, String> entry : userData.entrySet()) { System.out.println("Key: " + entry.getKey() + ", Value: " + entry.getValue()); } ``` 输出: ``` Key: name, Value: Jerry Key: job, Value: Engineer ``` #### 与其他数据结构对比 | 结构类型 | 特点 | 是否键值对 | |------------|-----------------------|------------| | 数组 | 索引→值,定长 | ❌ | | `List` | 索引→值,有序可重复 | ❌ | | `Set` | 仅存储唯一值 | ❌ | | `Map` | 键→值,键唯一 | ✔️ | > 键值对的核心价值在于**通过键快速定位值**,这种设计使它在缓存系统(Redis)、配置文件、字典结构大数据处理中成为基础构建块[^1][^2]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

度白白

提前收摊,今晚加鸡腿

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值