【达梦数据库】存储过程调用实践案例-select

目录

  • 前言
  • 创建表
  • 插入数据
  • 查询表中数据
  • 创建存储过程
  • 打开dbms_output包输出开关
  • 调用存储过程

前言

  • 如果要在存储过程中执行一个SELECT语句并处理其结果,你不能直接使用EXECUTE IMMEDIATE,因为EXECUTE IMMEDIATE主要用于执行那些不返回行的语句(如INSERT、UPDATE、DELETE等)或者那些你不需要处理返回结果的SELECT语句。

  • 对于需要处理返回结果的SELECT语句,你应该使用游标(CURSOR)。以下是一个存储过程的示例,它接受一个SQL查询字符串作为输入,使用游标执行该查询,并遍历结果集来打印每一行的数据(在实际应用中,你可能会对结果集进行其他处理)。

创建表

CREATE TABLE employees (
    employee_id NUMBER PRIMARY KEY,
    first_name VARCHAR2(50),
    last_name VARCHAR2(50),
    email VARCHAR2(100),
    hire_date DATE,
    job_id VARCHAR2(10),
    salary NUMBER(8, 2),
    department_id NUMBER
);

插入数据

INSERT INTO employees (employee_id, first_name, last_name, email, hire_date, job_id, salary, department_id) VALUES
(1, 'John', 'Doe', 'john.doe@example.com', TO_DATE('2023-01-15', 'YYYY-MM-DD'), 'IT_PROG', 6000, 10),
(2, 'Jane', 'Smith', 'jane.smith@example.com', TO_DATE('2022-07-22', 'YYYY-MM-DD'), 'ST_CLERK', 4500, 20),
(3, 'Michael', 'Johnson', 'michael.johnson@example.com', TO_DATE('2021-11-30', 'YYYY-MM-DD'), 'SA_REP', 7000, 30);

COMMIT;

查询表中数据

SELECT * FROM EMPLOYEES;

EMPLOYEE_ID		FIRST_NAME	LAST_NAME	EMAIL							HIRE_DATE		JOB_ID		SALARY		DEPARTMENT_ID
1				'John'		'Doe'		'john.doe@example.com'			'2023-01-15'	'IT_PROG'	6000.00		10
2				'Jane'		'Smith'		'jane.smith@example.com'		'2022-07-22'	'ST_CLERK'	4500.00		20
3				'Michael'	'Johnson'	'michael.johnson@example.com'	'2021-11-30'	'SA_REP'	7000.00		30

创建存储过程

CREATE OR REPLACE PROCEDURE sp_dynamic_select(
    p_sql IN VARCHAR2
) AS
    -- 定义一个游标变量
    c SYS_REFCURSOR;
    -- 定义变量来存储从游标中检索到的数据
    v_employee_id   NUMBER;
    v_first_name    VARCHAR2(50);
    v_last_name     VARCHAR2(50);
    v_email         VARCHAR2(100);
    v_hire_date     DATE;
    v_job_id        VARCHAR2(10);
    v_salary        NUMBER(8, 2);
    v_department_id NUMBER;
BEGIN
    -- 打开游标并传递SQL查询字符串
    OPEN c FOR TO_CHAR(p_sql); -- 注意:这里使用TO_CHAR是为了确保p_sql被当作字符串处理,尽管在这个例子中它已经是字符串了

    -- 循环遍历游标中的每一行
    LOOP
        -- 从游标中检索数据到变量中
        FETCH c INTO v_employee_id, v_first_name, v_last_name, v_email, v_hire_date, v_job_id, v_salary, v_department_id;
        
        -- 检查是否到达游标的末尾
        EXIT WHEN c%NOTFOUND;
        
        -- 打印检索到的数据(在实际应用中,你可以对数据进行其他处理)
        DBMS_OUTPUT.PUT_LINE('Employee ID: ' || v_employee_id ||
                             ', First Name: ' || v_first_name ||
                             ', Last Name: ' || v_last_name ||
                             ', Email: ' || v_email ||
                             ', Hire Date: ' || TO_CHAR(v_hire_date, 'YYYY-MM-DD') ||
                             ', Job ID: ' || v_job_id ||
                             ', Salary: ' || TO_CHAR(v_salary) ||
                             ', Department ID: ' || v_department_id);
    END LOOP;
    
    -- 关闭游标
    CLOSE c;
EXCEPTION
    WHEN OTHERS THEN
        -- 捕获并处理异常
        DBMS_OUTPUT.PUT_LINE('Error executing query: ' || SQLERRM);
        -- 如果游标已经打开,则关闭它(尽管在异常处理中这通常不是必需的,因为游标会在过程结束时自动关闭)
        IF c%ISOPEN THEN
            CLOSE c;
        END IF;
END;
/

打开dbms_output包输出开关

dbms_output.enable;

调用存储过程

BEGIN
    -- 调用存储过程,并传递一个SELECT查询字符串作为参数
    sp_dynamic_select('SELECT employee_id, first_name, last_name, email, hire_date, job_id, salary, department_id FROM employees WHERE department_id = 10');
END;
/

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/933807.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

C语言:指针(第一天)

C语言:指针(第一天) 预备知识 内存地址 字节:字节是内存的容量单位,英文名byte,一个字节有8位,即1byte8bits地址:系统为了便于区分每一个字节而对他们逐一进行的编号,…

vue3如何实现点击回车,自动登录?

vue3如何实现点击回车,自动登录? 场景:登录账号的时候,可能有的人不习惯直接点击登录,而是通过顺手敲个回车键实现登录 解决办法:上代码 //监听回车 function onKeyUp(e) {//console.log(e)if (e.key En…

LNMP和Discuz论坛

文章目录 LNMP和Discuz论坛1 LNMP搭建1.1 编译安装nginx服务1.1.1 编译安装1.1.2 添加到系统服务 1.2 编译安装MySQL服务1.2.1 准备工作1.2.2 编辑配置文件1.2.3 设置路径环境变量1.2.4 数据库初始化1.2.5 添加mysqld系统服务1.2.6 修改mysql的登录密码 1.3 编译安装PHP服务1.3…

目标跟踪算法:SORT、卡尔曼滤波、匈牙利算法

目录 1 目标检测 2 卡尔曼滤波 3《从放弃到精通!卡尔曼滤波从理论到实践》视频简单学习笔记 3.1 入门 3.2 进阶 3.2.1 状态空间表达式 3.2.2 高斯分布 3.3 放弃 3.4 精通 4 匈牙利算法 5 《【运筹学】-指派问题(匈牙利算法)》视…

Linux DNS之进阶篇bind-chroot企业级部署方式

BIND-chroot 服务是利用 chroot 机制为 BIND 服务创建伪根目录以限制其访问范围,增强安全性,但配置与维护相对较为复杂的一种服务机制。 本章我们将部署chroot模式的DNS服务,以增加安全性 案例要求: 此案例域名为xjh.com www 解析…

241206学习日志——[CSDIY] [InternStudio] 大模型训练营 [21].md

CSDIY:这是一个非科班学生的努力之路,从今天开始这个系列会长期更新,(最好做到日更),我会慢慢把自己目前对CS的努力逐一上传,帮助那些和我一样有着梦想的玩家取得胜利!!&…

YOLOv5白皮书-第Y2周:训练自己的数据集

>- **🍨 本文为[🔗365天深度学习训练营]中的学习记录博客** >- **🍖 原作者:[K同学啊]** 本人往期文章可查阅: 深度学习总结 接着上一篇文章 YOLOv5白皮书-第Y1周:调用官方权重进行检测 ,…

Java的Mvc整合Swagger的knife4框架

Swagger的介绍 Swagger 是一个规范和完整的框架,用于生成、描述、调用和可视化 RESTful 风格的 Web 服务。使用Swagger,就是把相关的信息存储在它定义的描述文件里面(yml或json格式),再通过维护这个描述 文件可以去更…

共筑数字安全防线,2024开源和软件安全沙龙即将启幕

随着数字化转型进程的加快以及开源代码的广泛应用,开源凭借平等、开放、协作、共享的优秀创作模式,逐渐成为推动数字技术创新、加速传统行业转型升级的重要模式。但随着软件供应链日趋复杂多元,使得其安全风险不断加剧,针对软件供…

SAP导出表结构并保存到Excel 源码程序

SAP导出表结构并保存到Excel,方便写代码时复制粘贴 经常做接口,需要copy表结构,找到了这样一个程程,特别有用。 01. 先看结果

LDR6500:音频双C支持,数字与模拟的完美结合

在当今数字化快速发展的时代,音频设备的兼容性和性能成为了用户关注的重点。LDR6500,作为乐得瑞科技精心研发的USB Power Delivery(PD)协议芯片,凭借其卓越的性能和广泛的应用兼容性,为音频设备领域带来了新…

Linux下mysql环境的搭建

1.mysql的下载 去MySQL官网下载mysql的linux压缩包 MySQL :: Download MySQL Community Server 如果下载慢请到网盘中自行下载 通过网盘分享的文件:mysql-8.0.40-1.el7.x86_64.rpm-bundle.tar 链接: https://pan.baidu.com/s/1vUJ-VuTwer1nLPT-haQCqw?pwd6342 提…

可视化建模以及UML期末复习篇----UML图

这是一篇相对较长的文章,如你们所见,比较详细,全长两万字。我不建议你们一次性看完,直接跳目录找你需要的知识点即可。 --------欢迎各位来到我UML国! 一、UML图 总共有如下几种: 用例图(Use Ca…

jenkins邮件的配置详解

Jenkins邮件的配置涉及多个步骤和细节,以下是详细的配置指南: 一、前期准备 确定邮件服务:明确Jenkins将要使用的邮件服务,如QQ邮箱、163邮箱、公司邮箱(基于Microsoft 365或Exchange Server)等。获取SMTP配置信息:根据邮件服务类型,获取相应的SMTP服务器地址、端口号…

JaveEE初阶--网络编程套接字

目录 一、引言 二、网络编程基本概念 2.1 什么是网络编程? 2.2 基本知识 三、Socket套接字 3.1 概念 3.2 分类 1.流套接字:使用传输层TCP协议 2. 数据报套接字:使用传输层UDP协议 3.原始套接字:用于自定义传输层协议 四、…

Python爬虫——HTML中Xpath定位

Xpath是一种路径查询语言。利用一个路径表达式从html文档中找到我们需要的数据位置,进而将其写入到本地或者数据库中。 学习Xpath爬虫,我们首先学习一下python中lxml库 关于库 lxml 终端下载Xpath需要用到的模块 pip install lxml 关于HTML 超文本标…

Spring Cloud Alibaba 之 “Sentinel”

从网上下载好sentinel-dashboard-1.6.3.jar,然后执行 java -jar sentinel-dashboard-1.6.3.jar,执行成功之后在浏览器输入localhost:8080,Sentinel的登录名和密码都是sentinel,登陆成功之后看到只有一个首页。 接下来开始整合Spring Cloud Alibaba Sen…

伟测科技再融资11.75亿:增收不增利,毛利率近年来持续下滑

《港湾商业观察》施子夫 王璐 12月9日,上海证券交易所上市审核委员会召开2024年第34次上市审核委员会审议会议,审议上海伟测半导体科技股份有限公司(再融资)(以下简称,伟测科技;688372.SH)事项。 今年8月…

Postman cURL命令导入导出

你是否曾为在Postman和终端之间切换、整理请求而抓狂?其实,Postman支持与cURL命令的无缝互通,通过导入导出,极大提升效率。用好这个功能,分分钟让接口测试更高效! Postman如何快速导入cURL命令?…

MR30分布式 I/O 模块助力 CNC 设备产能飞跃

背景分析 在现代制造业中,CNC 设备扮演着极为关键的角色。然而,CNC 设备在运行过程中也存在着诸多痛点。传统的 CNC 设备往往在控制与通信方面存在局限,其内部的 I/O 系统大多采用集中式架构。这种架构下,一旦需要处理大量的输入输…