首页 > 编程语言 >解释 FUNCATION,PROCEDURE 和 PACKAGE 区别 ?思维导图 代码示例(java 架构)

解释 FUNCATION,PROCEDURE 和 PACKAGE 区别 ?思维导图 代码示例(java 架构)

时间:2025-01-07 12:05:54浏览次数:3  
标签:salary FUNCATION PACKAGE 示例 NUMBER emp employee id PROCEDURE

在PL/SQL中,FUNCTIONPROCEDUREPACKAGE 是三种不同的程序单元,它们各自有特定的用途和特性。下面将通过思维导图的形式来概述它们的区别,并提供相应的代码示例。

思维导图结构

- PL/SQL 程序单元
  - FUNCTION
    - 定义
      - 返回一个值
    - 使用场景
      - 计算并返回结果
      - SQL语句中使用
    - 特点
      - 必须有RETURN语句
      - 可以有输入参数
  - PROCEDURE
    - 定义
      - 执行一系列操作
    - 使用场景
      - 数据库操作(增删改查)
      - 不需要返回值
    - 特点
      - 可以有输入输出参数
      - 不需要RETURN语句
  - PACKAGE
    - 定义
      - 组织多个相关对象
    - 使用场景
      - 封装和组织函数、过程和其他对象
      - 提供私有和公共接口
    - 特点
      - 包含声明部分和可选的主体部分
      - 支持封装、重载、全局变量

代码示例

FUNCTION 示例
CREATE OR REPLACE FUNCTION get_employee_salary (emp_id IN NUMBER)
RETURN NUMBER IS
  emp_salary NUMBER;
BEGIN
  SELECT salary INTO emp_salary FROM employees WHERE employee_id = emp_id;
  RETURN emp_salary;
END;
/

此函数接收员工ID作为参数,并返回该员工的薪水。它可以在SQL查询中被调用,例如:

SELECT get_employee_salary(101) FROM dual;
PROCEDURE 示例
CREATE OR REPLACE PROCEDURE update_employee_salary (
  emp_id IN NUMBER,
  new_salary IN NUMBER
) IS
BEGIN
  UPDATE employees SET salary = new_salary WHERE employee_id = emp_id;
  COMMIT;
END;
/

这个过程接收员工ID和新的薪水作为参数,并更新数据库中的相应记录。

PACKAGE 示例
CREATE OR REPLACE PACKAGE emp_mgmt IS
  -- Public declarations
  FUNCTION hire_employee (emp_name VARCHAR2, job_id VARCHAR2, salary NUMBER) RETURN NUMBER;
  PROCEDURE fire_employee (emp_id NUMBER);
  
  -- Private declarations can be placed here in the package body
END emp_mgmt;
/

CREATE OR REPLACE PACKAGE BODY emp_mgmt IS
  FUNCTION hire_employee (emp_name VARCHAR2, job_id VARCHAR2, salary NUMBER) RETURN NUMBER IS
    emp_id NUMBER;
  BEGIN
    INSERT INTO employees (employee_name, job_id, salary) VALUES (emp_name, job_id, salary) RETURNING employee_id INTO emp_id;
    RETURN emp_id;
  END;

  PROCEDURE fire_employee (emp_id NUMBER) IS
  BEGIN
    DELETE FROM employees WHERE employee_id = emp_id;
    COMMIT;
  END;
END emp_mgmt;
/

在这个包中,hire_employee 函数用于雇佣新员工并返回新生成的员工ID,而 fire_employee 过程用于解雇员工。这些成员可以通过 emp_mgmt 包名进行访问。

Java 应用层考虑

在Java应用程序中,您可以使用JDBC API来调用上述定义的PL/SQL程序单元。例如,调用存储过程或函数可以如下所示:

import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.Types;

public class PlsqlCaller {
    public static void main(String[] args) {
        String url = "jdbc:oracle:thin:@localhost:1521:ORCL";
        String user = "your_username";
        String password = "your_password";

        try (Connection conn = DriverManager.getConnection(url, user, password)) {
            // 调用 FUNCTION
            try (CallableStatement csFunc = conn.prepareCall("{? = call get_employee_salary(?)}")) {
                csFunc.registerOutParameter(1, Types.NUMERIC);
                csFunc.setInt(2, 101); // 假设员工ID为101
                csFunc.execute();
                System.out.println("Employee Salary: " + csFunc.getInt(1));
            }

            // 调用 PROCEDURE
            try (CallableStatement csProc = conn.prepareCall("{call update_employee_salary(?, ?)}")) {
                csProc.setInt(1, 101); // 假设员工ID为101
                csProc.setDouble(2, 80000.00); // 新的薪水
                csProc.execute();
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

对于包中的成员,您同样可以使用类似的JDBC调用来执行它们。请注意,实际应用中应加入适当的错误处理和资源管理。

标签:salary,FUNCATION,PACKAGE,示例,NUMBER,emp,employee,id,PROCEDURE
From: https://blog.csdn.net/qq_33240556/article/details/144956635

相关文章

  • View 的使用示例
    创建一个简单的HTMLView假设有一个名为Index.cshtml的View文件,用于展示一个简单的页面:html@{Layout=null;}<!DOCTYPEhtml><html><head><title>IndexPage</title></head><body><h1>WelcometoMyWebsite</h1&g......
  • Java SpringBoot 图片转PDF示例
    一个SpringBoot工程里面用到了第三方签章服务,支持PDF多页盖章,用户上传的是多张图片格式的文件,所以需要将图片转成PDF。用了几个扩展包,出现过版本不兼容、转完的PDF带水印、还有操作复杂的。最后借助 aspose-pdf这个扩展包实现了,这里记录一下简单的Demo。pom.xml文件引入 a......
  • Shapefile代码示例
    Shapefile代码示例1.读取Shapefile文件1.1实现思路graphTDA[查找必要文件]-->B[获取文件编码]B-->C[打开图层]C-->D[获取要素集]D-->G[关闭图层]1.2代码示例publicstaticSimpleFeatureCollectionreadShp(StringshpPath){......
  • GeoJSON代码示例
    GeoJSON代码示例1.读取GeoJSON文件1.1实现思路graphTDA[读取GeoJSON文件]-->B[读取GeoJSON文件内容]B-->C[解析GeoJSON文件内容]C-->D[构建SimpleFeatureCollection]D-->E[返回SimpleFeatureCollection]1.2代码示例publicstaticSim......
  • FileGDB代码示例
    FileGDB代码示例返回1.读取FileGDB图层1.1实现思路graphTDA[注册OGR]-->B[设置中文路径支持]B-->C[打开数据驱动]C-->D[打开数据源]D-->G[获取图层]G-->H[读取图层信息]1.2代码示例publicLayerreadGdbLayer(StringdriverName,......
  • uniapp - 详解使用高德地图在地图上实现绘制边界/点聚合/行政区域高亮等功能,Uniapp高
    效果图在uni-app手机h5网页网站/支付宝微信小程序/安卓app/苹果app/nvue等(全平台兼容)开发中,实现各端都兼容的“安装使用高德地图并实现点聚合/地图绘制边界部分高亮显示”,高德地图点聚合标记及高德地图绘制行政边界等,标点窗体信息展示,在高德地图上标点及卡片气泡框面板......
  • Android13编译报错 PRODUCT_PACKAGES error cannot assign to readonly variable
    前言全局说明Android13编译报错PRODUCT_PACKAGESreadonlyvariable一、说明1.1环境:Android13二、问题高通定制版Android13里增加第三方模块,将家哟加入的模块写入到config.mk中,使用PRODUCT_PACKAGES变量,将要打包的模块告诉系统。并将config.mk加入到上......
  • 安全框架SpringSecurity进阶【详解,附有图文+示例代码】
    文章目录十二.SpringSecurity进阶12.1认证流程12.2简单实现(无权限)思路分析准备工作导入依赖添加Redis相关配置Redis使用FastJson序列化RedisCache缓存Redis配置类响应类JWT工具类WebUtils工具类数据库准备实体类yml配置文件实现配置密码加密器12.3自定义登录接口12.......
  • 模板方法模式的代码实践示例
    模板方法模式的概念:在操作中定义算法的框架,将一些步骤延迟到子类中。模板方法允许子类在不改变算法结构的情况下重新定义算法的某些步骤。什么时候可以用模板方法模式?有很固定的流程和步骤,就可以使用模板方法模式。所有子类都会按照相同的模板执行算法。子类不能改变算法结构......
  • 解密prompt系列46. LLM结构化输出代码示例和原理分析
    最近闭源大模型们都陆续支持结构化输出,这一章我们先结合demo看下开源和闭源对结构化输出的支持,随后会介绍ConstrainedDecoding和FormatRestrictingInstructions两种结构化输出约束方案,最后会给出结构化输出对比自然语言输出的一些观点。代码示例闭源-OpenAIhttps://pla......