plsql复习(基本语法、流程控制、游标、异常处理机制、存储函数和存储过程、触发器)

news/2024/3/29 4:34:02/文章来源:https://blog.csdn.net/Jack_Pearson/article/details/129157449

一、基本语法

使用set serveroutput on 命令设置环境变量serveroutput为打开状态,从而使得pl/sql程序能够在SQL*plus中输出结果
使用函数dbms_output.put_line()可以输出参数的值。

set serveroutput ondeclare--声明变量v_sal employees.salary%type;v_email employees.email%type;v_hire_date employees.hire_date%type;
begin--sql语句的操作:select...into...from...where...select salary,email,hire_date into v_sal,v_email,v_hire_date from employees where employee_id = 100;--打印dbms_output.put_line(v_sal||','||v_email||','||v_hire_date);
end;

二、流程控制

--用while循环求2-100之间的质数(素数)
declarev_i number(3) := 2;v_j number(3) := 2;v_flag number(1) := 1;
beginwhile v_i <= 100 loop
--为什么是 j <= i/j 例如 i = 20,那么可能整除的组合就是 2 * 10、4 * 5、5 * 4、10 * 2。
--可以发现组合是重复的了一次的
--所以只要 j <= i/j 就能试完所有的情况,即j<=sqrt(i)    while v_j <= sqrt(v_i) loopif mod(v_i,v_j) = 0 then v_flag := 0;end if;v_j := v_j + 1;end loop;if v_flag = 1 then dbms_output.put_line(v_i);end if;v_j := 2;v_i := v_i + 1;v_flag := 1;end loop;end;
--用for循环求2-100之间的质数(素数)
declarev_flag number(1) := 1;
beginfor v_i in 2..100 loopfor v_j in 2..sqrt(v_i) loopif mod(v_i,v_j) = 0 then v_flag := 0;goto label;end if;end loop;<<label>>if v_flag = 1 then dbms_output.put_line(v_i);end if;v_flag := 1;end loop;end;
--打印1-100的自然数,当打印到50时,跳出循环,输出“打印结束”
beginfor i in 1..100 loopif i = 50 then goto label;end if;dbms_output.put_line(i);end loop;<<label>>dbms_output.put_line('打印结束');  
end;

三、游标

游标是一个指向上下文的句柄( handle)或指针。

--打印出80号部门所有员工的员工号和工资:empid:xxx salary:xxx
declare--声明一个记录类型type emp_record is record(v_sal employees.salary%type,v_empid employees.employee_id%type);--声明一个记录类型的变量v_emp_record emp_record;--定义游标cursor emp_sal_cursor is select salary,employee_id from employees where department_id = 80;
begin--打开游标open emp_sal_cursor;--提取游标fetch emp_sal_cursor into v_emp_record;while emp_sal_cursor%found loopdbms_output.put_line('empid:'||v_emp_record.v_empid||' salary:'||v_emp_record.v_sal);fetch emp_sal_cursor into v_emp_record;end loop;--关闭游标close emp_sal_cursor;
end;
/*利用游标,调整公司中员工的工资:工资范围        调整基数0-5000          5%5000-10000      3%10000-15000     2%15000-          1%
*/
declarecursor emp_sal_cursor is select employee_id,salary from employees;v_temp number(4,2);v_empid employees.employee_id%type;v_sal employees.salary%type;beginopen emp_sal_cursor;fetch emp_sal_cursor into v_empid,v_sal;while emp_sal_cursor%found loopif v_sal < 5000 then v_temp := 0.05;elsif v_sal < 10000 then v_temp := 0.03;elsif v_sal < 15000 then v_temp := 0.02;else v_temp := 0.01;end if;dbms_output.put_line(v_empid||','||v_sal);update employeesset salary = salary * (1 + v_temp)where employee_id = v_empid;fetch emp_sal_cursor into v_empid,v_sal;end loop;close emp_sal_cursor; 
end;
--使用sql中的decode函数实现
update employees
set salary = salary * (1 + (decode(trunc(salary/5000),0,0.05,1,0.03,2,0.02,0.01)))
--使用for循环实现
declarecursor emp_sal_cursor is select employee_id,salary from employees;v_temp number(4,2);beginfor c in emp_sal_cursor loopif c.salary < 5000 then v_temp := 0.05;elsif c.salary < 10000 then v_temp := 0.03;elsif c.salary < 15000 then v_temp := 0.02;else v_temp := 0.01;end if;update employeesset salary = salary * (1 + v_temp)where employee_id = c.employee_id; end loop;end;

四、异常处理机制

1.预定义的异常处理

declarev_salary employees.salary%type;
beginselect salary into v_salaryfrom employeeswhere employee_id > 100;dbms_output.put_line(v_salary);
exceptionwhen too_many_rows then dbms_output.put_line('输出的行数太多了!!');when others then dbms_output.put_line('出现其他类型的异常');
end;
--通过select...into...查询某人的工资。若没有查询到,则输出“未找到数据”
declarev_sal employees.salary%type;
beginselect salary into v_sal from employees where employee_id = 1001;dbms_output.put_line(v_sal);
exceptionwhen no_data_found then dbms_output.put_line('未找到数据');
end;

2.非预定义的异常处理

declaree_deleteid_exception exception;pragma exception_init(e_deleteid_exception,-02292);
begindelete from employees where employee_id = 100;
exceptionwhen e_deleteid_exception then dbms_output.put_line('违反完整性约束条件,故不可删除此用户');
end;

3.用户自定义的异常处理

--查询员工号为100的员工工资,如工资大于10000,抛出异常并进行异常处理:"工资太高了!!"
declaree_too_high_sal exception;v_sal employees.salary%type;beginselect salary into v_sal from employees where employee_id = 100;if v_sal > 10000 thenraise e_too_high_sal;end if;exceptionwhen e_too_high_sal then dbms_output.put_line('工资太高了!!');end;

*五、存储函数和存储过程

过程和函数的唯一区别是函数总向调用者返回数据,而过程则不返回数据。

1.存储函数(有返回值)

--定义一个函数hello_world:返回一个"helloworld"的字符串
create or replace function hello_world
return varchar2
is
beginreturn 'helloworld';
end;  
--定义一个函数:获取给定部门的工资总和。要求:部门号定义为参数,工资总额定义为返回值
create or replace function get_sal(dept_id number)
return number
isv_sumsal number(10) := 0;cursor salary_cursor is select salary from employees where department_id = dept_id;beginfor c in salary_cursor loopv_sumsal := v_sumsal + c.salary;end loop;return v_sumsal;
end;

函数名后面是一个可选的参数列表,其中包含 IN、OUT 或 IN OUT 标记。参数之间用逗号隔开。
IN 参数标记表示传递给函数的值在该函数执行中不改变;
OUT 标记表示一个值在函数中进行计算并通过该参数传递给调用语句;
IN OUT 标记表示传递给函数的值可以变化并传递给调用语句。
若省略标记,则参数隐含为 IN。

--定义一个函数:获取给定部门的工资总和 和 该部门的员工总数(定义为OUT类型的参数)。
--要求:部门号定义为参数,工资总额定义为返回值
create or replace function get_sal1(dept_id number,total_count out number)
return number
isv_sumsal number(10) := 0;cursor salary_cursor is select salary from employees where department_id = dept_id;begintotal_count := 0;for c in salary_cursor loopv_sumsal := v_sumsal + c.salary;total_count := total_count + 1;end loop;return v_sumsal;
end;
----------------------------------------------declarev_num number(5) := 0;
begindbms_output.put_line(get_sal1(80,v_num));dbms_output.put_line(v_num);
end;

2.存储过程(没有返回值)

--定义一个存储过程:获取给定部门的工资总和(通过OUT函数)。要求:部门号和工资总额定义为参数
create or replace procedure get_sal2(dept_id number,sumsal out number)
iscursor salary_cursor is select salary from employees where department_id = dept_id;       
beginsumsal := 0;for c in salary_cursor loopsumsal := sumsal + c.salary;end loop;dbms_output.put_line(sumsal);
end;
----------------------------------------------
declarev_sal number(10) := 0;
beginget_sal2(80,v_sal);
end;
/*
自定义一个存储过程完成以下操作: 
对给定部门(作为输入参数)的员工进行加薪操作, 若其到公司的时间在 (? , 95) 期间,为其加薪 %5[95 , 98)              %3       [98, ?)                %1
得到以下返回结果: 为此次加薪公司每月需要额外付出多少成本(定义一个 OUT 型的输出参数).
*/
create or replace procedure add_sal(dept_id number,temp_sal out number)
iscursor sal_cursor is select employee_id,salary,hire_date from employees where department_id = dept_id;v_i number(4,2) := 0;
begintemp_sal := 0;for c in sal_cursor loopif to_char(c.hire_date,'yyyy') < '1995' then v_i := 0.05;elsif to_char(c.hire_date,'yyyy') < '1998' then v_i := 0.03;else v_i := 0.01;end if;--1.更新工资update employees set salary = salary * (1 + v_i) where employee_id = c.employee_id;--2.公司每月需额外付出成本temp_sal := temp_sal + c.salary * v_i;end loop;dbms_output.put_line(temp_sal);
end;
----------------------------------------------
declarev_temp number(10);
beginadd_sal(80,v_temp);
end;

*六、触发器

1.修饰符:NEW :OLD

:NEW 修饰符访问操作完成后列的值
:OLD 修饰符访问操作完成前列的值

--编写一个触发器,在对my_emp记录进行删除的时候,在my_emp_bak表中备份对应的记录
1)准备工作:
create table my_emp as select employee_id id, last_name name, salary sal from employeescreate table my_emp_bak as select employee_id id, last_name name, salary sal from employees where 1 = 2
2)编写触发器
create or replace trigger delete_emp_trigger
before delete on my_emp
for each row
begininsert into my_emp_bakvalues(:old.id,:old.name,:old.sal);
end;

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

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

相关文章

二叉搜索树中的众数Java解法

给你一个含重复值的二叉搜索树&#xff08;BST&#xff09;的根节点 root &#xff0c;找出并返回 BST 中的所有 众数&#xff08;即&#xff0c;出现频率最高的元素&#xff09;。 如果树中有不止一个众数&#xff0c;可以按 任意顺序 返回。 假定 BST 满足如下定义&#xf…

【Web逆向】万方数据平台正文的逆向分析(上篇--加密发送请求)—— 逆向protobuf

【Web逆向】万方数据平台正文的逆向分析&#xff08;上篇--加密发送请求&#xff09;—— 逆向protobuf声明一、了解protobuf协议&#xff1a;二、前期准备&#xff1a;二、目标网站&#xff1a;三、开始分析&#xff1a;我们一句句分析&#xff1a;先for循环部分&#xff1a;后…

【算法】最短路算法

&#x1f600;大家好&#xff0c;我是白晨&#xff0c;一个不是很能熬夜&#x1f62b;&#xff0c;但是也想日更的人✈。如果喜欢这篇文章&#xff0c;点个赞&#x1f44d;&#xff0c;关注一下&#x1f440;白晨吧&#xff01;你的支持就是我最大的动力&#xff01;&#x1f4…

电子技术——输出阶类型

电子技术——输出阶类型 输出阶作为放大器的最后一阶&#xff0c;其必须有较低的阻抗来保证较小的增益损失。作为放大器的最后一阶&#xff0c;输出阶需要处理大信号类型&#xff0c;因此小信号估计模型不适用于输出阶。尽管如此&#xff0c;输出阶的线性也非常重要。实际上&a…

为什么要用线程池?

1.降低资源消耗。通过重复利用已创建的线程降低线程创建和销毁造成的消耗。 2.提高响应速度。当任务到达时&#xff0c;任务可以不需要的等到线程创建就能立即执行。 3.提高线程的可管理性。线程是稀缺资源&#xff0c;如果无限制的创建&#xff0c;不仅会消耗系统资源&#…

Python实现贝叶斯优化器(Bayes_opt)优化支持向量机回归模型(SVR算法)项目实战

说明&#xff1a;这是一个机器学习实战项目&#xff08;附带数据代码文档视频讲解&#xff09;&#xff0c;如需数据代码文档视频讲解可以直接到文章最后获取。1.项目背景贝叶斯优化器 (BayesianOptimization) 是一种黑盒子优化器&#xff0c;用来寻找最优参数。贝叶斯优化器是…

AI_News周刊:第三期

CV - 计算机视觉 | ML - 机器学习 | RL - 强化学习 | NLP 自然语言处理 2023.02.20—2023.02.25 News 1.OpenAI 现在正在帮助可口可乐改善其营销和运营 2023 年 2 月 21 日——贝恩公司今天宣布与 OpenAI 建立全球服务联盟&#xff0c;OpenAI 是人工智能系统 ChatGPT、DA…

java Spring JdbcTemplate配合mysql实现数据库表数据添加

本文为 java Spring JdbcTemplate 准备工作的续文 如果您还没有大家好JdbcTemplate 的基础环境 可以先查看前文 首先 之前数据库我们已经弄好了 然后 我们在下面创建一个表 我这里叫 user_list 每一个数据库表 要对应一个实体类 这里 我们打开上一文搭建的项目环境 src下创建…

【华为OD机试模拟题】用 C++ 实现 - 英文输入法(2023.Q1)

最近更新的博客 【华为OD机试模拟题】用 C++ 实现 - 分积木(2023.Q1) 【华为OD机试模拟题】用 C++ 实现 - 吃火锅(2023.Q1) 【华为OD机试模拟题】用 C++ 实现 - RSA 加密算法(2023.Q1) 【华为OD机试模拟题】用 C++ 实现 - 构成的正方形数量(2023.Q1) 【华为OD机试模拟…

【原创】java+swing+mysql生肖星座查询系统设计与实现

今天我们来开发一个比较有趣的系统&#xff0c;根据生日查询生肖星座&#xff0c;输入生日&#xff0c;系统根据这个日期自动计算出生肖和星座信息反馈到界面。我们还是使用javaswingmysql去实现这样的一个系统。 功能分析&#xff1a; 生肖星座查询系统&#xff0c;顾名思义…

【CSS】CSS 层叠样式表 ① ( 简介 | CSS 引入方式 - 内联样式 | 内联样式语法 | 内联样式缺点 )

文章目录一、CSS 层叠样式表二、CSS 引入方式 - 内联样式1、内联样式语法2、内联样式缺点3、内联样式代码示例① 核心代码示例② 完整代码示例③ 执行结果一、CSS 层叠样式表 CSS 全称 Cascading Style Sheets , 层叠样式表 ; 作用如下 : 设置 HTML 页面 文本内容 的 字体 , 颜…

【华为OD机试模拟题】用 C++ 实现 - 最少停车数(2023.Q1)

最近更新的博客 华为OD机试 - 入栈出栈(C++) | 附带编码思路 【2023】 华为OD机试 - 箱子之形摆放(C++) | 附带编码思路 【2023】 华为OD机试 - 简易内存池 2(C++) | 附带编码思路 【2023】 华为OD机试 - 第 N 个排列(C++) | 附带编码思路 【2023】 华为OD机试 - 考古…

绝对让你明明白白,脚把脚带你盯着 I2C 时序图将 I2C 程序给扣出来(基于STM32的模拟I2C)

目录前言一、关于STM32 I/O端口位的基本结构讲解二、模拟I2C编写前的需知道的知识1、I2C简介2、根据时序编写模拟I2C程序重要的两点Ⅰ、主机发送数据给从机时的时序控制Ⅱ、主机接收来自从机的数据时的时序控制Ⅲ、完整的I2C时序图&#xff08;按写程序的思想分割时序&#xff…

2023年湖北住建厅七大员建筑八大员怎么报考?启程别

2023年湖北住建厅七大员建筑八大员怎么报考&#xff1f;启程别 建筑施工企业关键技术岗位人员可以叫七大员也可以叫八大员&#xff0c;施工现场专业人员&#xff0c;从事相关岗位人员都应该持证上岗。 为什么有的叫七大员&#xff1f;有的叫八大员呢&#xff1f;甚至还有五大员…

sklearn学习-朴素贝叶斯(二)

文章目录一、概率类模型的评估指标1、布里尔分数Brier Score对数似然函数Log Loss二、calibration_curve&#xff1a;校准可靠性曲线三、多项式朴素贝叶斯以及其变化四、伯努利朴素贝叶斯五、改进多项式朴素贝叶斯&#xff1a;补集朴素贝叶斯ComplementNB六、文本分类案例TF-ID…

【信管12.5】项目集与项目组合管理

项目集与项目组合管理之前学习的 PMP 相关的项目管理知识&#xff0c;其实都是针对一个项目的管理过程。但是&#xff0c;在一个组织企业中&#xff0c;往往不止一个项目&#xff0c;可能会有多个相关联的项目&#xff0c;这种情况就叫做项目集。另外&#xff0c;多个项目一起完…

二叉树——堆

一&#xff0c;树的概念及结构 1.树 4.结点的度&#xff1a;一个节点含有子树的个数称为该结点的度&#xff1b;如&#xff1a;A 的度为6. 5.叶节点或终端节点&#xff1a;度为0的节点称为叶节点&#xff1b;如&#xff1a;B 6.非终端结点或分支节点&#xff1a;度部位0的结…

MySQL基础知识-刷题笔记

数据库刷题笔记 查漏补缺&#xff0c;面试八股文&#xff0c;以下内容未说明的均以MySQL数据库为准 where 不能和聚合函数一起使用 having可以和聚合函数一起使用 having必须与group by一起使用1、SUBSTRING_INDEX(str ,substr ,n)&#xff1a;返回字符substr在str中第n次出现位…

【强化学习】强化学习数学基础:贝尔曼公式

强化学习数学基础&#xff1a;贝尔曼公式强化学习的数学原理课程总览贝尔曼公式&#xff08;Bellman Equation&#xff09;一个示例状态值贝尔曼公式&#xff1a;推导过程贝尔曼公式&#xff1a;矩阵-向量形式&#xff08;Matrix-vector form&#xff09;贝尔曼公式&#xff1a…

基于合作型Stackerlberg博弈的考虑差别定价和风险管理的微网运行策略研究(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…