【PLSQL】PLSQL基础

文章目录

  • 一:记录类型
    • 1.语法
    • 2.代码实例
  • 二:字符转换
  • 三:%TYPE和%ROWTYPE
    • 1.%TYPE
    • 2.%ROWTYPE
  • 四:循环
    • 1.LOOP
    • 2.WHILE(推荐)
    • 3.数字式循环
  • 五:游标
    • 1.游标定义及读取
    • 2.游标属性
    • 3.NO_DATA_FOUND和%NOTFOUND的区别
  • 六:异常错误
    • 1.异常处理
    • 2.非预定义异常处理
    • 3.用户自定义的异常处理
  • 七:存储过程或函数
    • 1.函数
      • 函数调用过程:
  • 八:包
    • 1.包的创建
    • 2.包的调用
  • 九:触发器
    • 1.触发器的组成
    • 2.语法
    • 3.触发器的限制
    • 4.实例
    • 5.创建替代(INSTEAD OF)触发器

一:记录类型

1.语法

TYPE record_type IS RECORD(column1 type,colunm2 type,… …
Variable_name record_type;

2.代码实例

declaretype test_rec is record(    --test_rec记录类型l_name varchar2(30),d_id number(4));v_emp test_rec;   --v_emp变量名
begin v_emp.l_name := '张三';v_emp.d_id := 1234;dbms_output.put_line(v_emp.l_name || ',' || v_emp.d_id);
end;

可以使用SELECT语句对记录变量进行赋值,只要保证记录字段与查询结果列表中的字段相匹配即可.

create table cux.employee
(last_name varchar2(20),
department_id number(4));insert into cux.employee values('李四',1235,234);declaretype test_rec is record(    --test_rec记录类型l_name varchar2(30),d_id number(4));v_emp test_rec;   --v_emp变量名
begin select last_name, department_id into v_empfrom cux.employeewhere employee_id = 234;dbms_output.put_line(v_emp.l_name || ', ' || v_emp.d_id);
end;

二:字符转换

在这里插入图片描述

三:%TYPE和%ROWTYPE

1.%TYPE

定义一个变量,其数据类型与已经定义的某个数据变量的类型相同,或者与数据库表的某个列的数据类型相同,这时可以使用%TYPE

使用%TYPE的优点:

  • 所引用的数据库列的数据类型不必知道;
  • 所引用的数据库列的数据类型可以实时改变.
declaretype test_rec is record(l_name cux.employee.last_name%type,d_id cux.employee.department_id%type);v_emp test_rec;
beginselect last_name,department_id into v_empfrom cux.employee where employee_id = 234;dbms_output.put_line(v_emp.l_name || ', ' || v_emp.d_id);
end;

2.%ROWTYPE

在这里插入图片描述

四:循环

1.LOOP

LOOP要执行的语句;EXIT WHEN<条件语句>;  --条件满足,退出
END LOOPdeclareint NUMBER(2) := 0;
beginLOOPint := int + 1;dbms_output.put_line('int的当前值为:' || int);EXIT WHEN int = 10;END LOOP;
END;

2.WHILE(推荐)

WHILE<布尔表达式> LOOP要执行的语句;
END LOOP;DECLAREx NUMBER(2) := 0;
BEGINWHILE x < 10 LOOPx := x + 1;dbms_output.put_line('x的当前值为:' || x);END LOOP;
END;

3.数字式循环

FOR 循环计数器 IN[REVERSE] 下限 .. 上限 LOOP要执行的语句
END LOOP;

每循环一次,循环变量自动加1;使用关键字REVERSE,循环变量自动减1。跟在IN REVERSE后面的数字必须是从小到大的顺序,而且必须是整数,不能是变量或者表达式。可以使用EXIT退出循环。

beginFOR i in reverse 2 .. 10 LOOPDBMS_OUTPUT.PUT_LINE('i的值为' || i);END LOOP;
end;

五:游标

1.游标定义及读取

--游标FOR读取
declare cursor c_emp(dep_id number default 1236) is select last_name,employee_id epidfrom cux.employeewhere department_id = dep_id;
beginfor v_emp in c_emp loopDBMS_OUTPUT.PUT_LINE(v_emp.last_name || ', ' || v_emp.epid);end loop;
end;

2.游标属性

  • %FOUND:布尔类型属性,当最近一次读记录时成功返回,则值为TRUE;
  • %NOTFOUND:布尔类型属性,与%FOUND相反;
  • %ISOPEN:布尔型属性,当游标已打开时返回TRUE;
  • %ROWCOUNT:数字型属性,返回已从游标中读取的记录数。

3.NO_DATA_FOUND和%NOTFOUND的区别

SELECT … INTO 语句触发NO_DATA_FOUND;

当一个显示游标的WHERE子句未找到时触发%NOTFOUND;当UPATE或DELETE语句的WHERE子句未找到时触发SQL%NOTFOUND;在提取循环中要用%NOTFOUND或%FOUND来确定循环退出条件,不要用NO_DATA_FOUND。

六:异常错误

在这里插入图片描述

1.异常处理

EXCEPTION WHEN first_exception THEN <code to handle first exception>WHEN second_exception THEN <code to handle second exception>WHEN OTHERS THEN <code to handle others exception>
END;

异常处理可以按照任意次序排列,但OTHERS必须放在最后。

declare -- Local variables herev_empid cux.employee.employee_id%type := &v_empid;v_sal cux.employee.salary%type;
/* 预定义异常处理 */
begin-- Test statements hereselect salary into v_salfrom cux.employeewhere employee_id = v_empidfor update;if v_sal <= 3000 then update cux.employee set salary = salary+1000where employee_id = v_empid;DBMS_OUTPUT.PUT_LINE('编号为:'|| v_empid || '工资已更新');else DBMS_OUTPUT.PUT_LINE('编号为:'|| v_empid || '工资不需更新');end if;
exceptionWHEN NO_DATA_FOUND THENDBMS_OUTPUT.PUT_LINE('编号为:'|| v_empid || '员工不存在');WHEN TOO_MANY_ROWS THENDBMS_OUTPUT.PUT_LINE('数据行数太多,请使用游标');WHEN OTHERS THEN DBMS_OUTPUT.PUT_LINE('其他错误');
end;

2.非预定义异常处理

  1. 在PL/SQL块定义部分定义异常情况 <异常情况> EXCEPTION

  2. 将其定义好的异常情况,与标准的ORACLE错误联系起来,使用PRAGMA EXCEPTION_INIT语句;

    PRAGMA EXCEPTION(<异常情况>,<错误代码>);

  3. 在PL/SQL异常情况处理部分对异常情况做出相应处理。

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

用户定义的异常错误是通过显式使用RAISE语句来触发。当引发一个异常错误时,控制就转向到EXCEPTION块异常错误部分,执行错误处理代码。

步骤:

  1. 在PL/SQL块的定义部分定义异常情况;

  2. <异常情况> EXCEPTION

    RAISE<异常情况>;

在PL/SQL块的异常情况处理部分对异常情况做出相应处理。

七:存储过程或函数

把PL/SQL程序存储在数据库中,并可以在任何地方来运行它。过程和函数的唯一区别是函数总向调用者返回数据,而过程则不返回数据。

1.函数

IN参数标记表示传递给函数的值在该函数执行中不改变;OUT标记表示一个值在函数中进行计算并通过该参数传递给调用语句;IN OUT标记表示传递给函数的值可以变化并传递给调用语句。若省略标记,则参数隐含为IN。因为函数需要一个返回值,所以RETURN包含返回结果的数据类型。

create or replace function get_salary(dep_id cux.employee.department_id%type (default 1235),emp_count out number)return numberisv_sum number;
beginselect sum(salary), count(*) into v_sum, emp_countfrom cux.employeewhere department_id = dep_id;return v_sum;
exceptionwhen no_data_found then DBMS_OUTPUT.PUT_LINE('查询的数据不存在');when others then DBMS_OUTPUT.PUT_LINE(sqlcode || '--' || sqlerrm);end;

函数调用过程:

1.位置表示法;

declarev_num number;v_sum number;
beginv_sum := get_salary(1237,  v_num);DBMS_OUTPUT.PUT_LINE('1237号部门的工资总和:' || v_sum || ' 人数:' || v_num);
end;

2.名称表示法

形式参数必须和函数定义时声明的形式参数名称相同,顺序可以任意排列。

 v_sum := get_salary(dep_id => 1237, emp_count => v_num);

3.混合表示法

使用位置表示法所传递的参数必须放在名称表示法所传递的参数前面。也就是说,无论函数具有多少个参数,只要其中有一个参数使用名称表示法,其后所有的参数都必须使用名称表示法。

 v_sum := get_salary(1237, emp_count => v_num);

八:包

1.包的创建

create or replace package demo_pack is-- Author  : 11313321-- Created : 2023/8/22 8:45:06-- Purpose : 练习测试-- Public type declarationsEmpRec cux.employee%ROWTYPE;-- Public function and procedure declarationsfunction add_emp(last_name VARCHAR2, dept_id number, emp_id NUMBER, salary number)return number;function remove_emp(emp_id number)return number;procedure query_empl(emp_id number);end demo_pack;

包主体的创建方法,它实现上面所声明的包定义:

create or replace package body demo_pack isfunction add_emp(last_name VARCHAR2, dept_id number, emp_id NUMBER, salary number)return numberisempno_remaining exception;pragma exception_init(empno_remaining, -1);begininsert into cux.employee values(last_name, dept_id, emp_id, salary,TO_DATE('2023,5,20','yyyy-mm-dd'));if sql%found thenreturn 1;end if;exceptionwhen empno_remaining then return 0;when others then return -1;end add_emp;function remove_emp(emp_id number)return numberisbegindelete from cux.employee where employee_id = emp_id;if sql%found then return 1;elsereturn 0;end if;exceptionwhen others thenreturn -1;end remove_emp;procedure query_empl(emp_id number)isbeginselect * into EmpRec from cux.employee where employee_id = emp_id;exceptionwhen no_data_found thenDBMS_OUTPUT.PUT_LINE('数据库中没有该员工');when too_many_rows thenDBMS_OUTPUT.PUT_LINE('程序运行错误!请使用游标');when others thenDBMS_OUTPUT.PUT_LINE(sqlcode || '--' || sqlerrm);end query_empl;begin-- Initializationnull;
end demo_pack;

2.包的调用

对包内共有元素的调用格式为:报名.元素名称

declarevar number;
beginvar := demo_pack.add_emp('老马', 1476, 789, 3800);if var=-1 thenDBMS_OUTPUT.PUT_LINE(sqlcode || '--' || sqlerrm);elsif var=0 thenDBMS_OUTPUT.PUT_LINE('该记录已存在');else DBMS_OUTPUT.PUT_LINE('添加记录成功');demo_pack.query_empl(789);DBMS_OUTPUT.PUT_LINE(demo_pack.EmpRec.employee_id||'--'||demo_pack.EmpRec.last_name||'--'||demo_pack.EmpRec.department_id);var := demo_pack.remove_emp(788);if var=-1 thenDBMS_OUTPUT.PUT_LINE(sqlcode || '--' || sqlerrm);elsif var=0 thenDBMS_OUTPUT.PUT_LINE('该记录不存在');elseDBMS_OUTPUT.PUT_LINE('删除记录成功');end if;end if;
end;

九:触发器

1.触发器的组成

  • 触发事件:在何种情况下触发TRIGGER,例如:INSERT,UPDATE,DELETE
  • 触发时间:触发之前(BEFORE)、之后(AFTER)
  • 触发器本身:触发之后的目的和意图
  • 触发频率:语句级(STATEMENT)触发器和行级(ROW)触发器。
    • 语句级:当触发某事件时,该触发器只执行一次
    • 行级:当某事件发生时,对受到该操作影响的每一行数据,触发器都单独执行一次。
    • 行触发器和语句触发器的区别表现在:行触发器要求当一 个 DML 语句操做影响数据库中的多行数据时,对于其中的每个数据行,只要它们符合触发约束条件,均激 活一次触发器;而语句触发器将整个语句操作作为触发事件,当它符合约束条件时,激活一次触发器。

2.语法

CREATE [OR REPLACE] TRIGGER trigger_name{BEFORE | AFTER}{INSERT|DELETE|UPDATE[OF column[,column...]]}ON [schema.] table_name[FOR EACH ROW][WHEN condition]trigger body;

FOR EACH ROW选项说明触发器为多行触发器。当省略FOR EACH ROW选项时,BEFORE和AFTER触发器为语句触发器,而INSTEAD OF触发器则为行触发器。

3.触发器的限制

  • 触发器体内的SELECT语句只能为SELECT…INTO…结构,或者为定义游标所使用的SELECT语句。
  • 触发器中不能使用数据库事务控制语句COMMIT;ROLLBACK;SAVEPOINT语句。
  • 由触发器所调用的过程或函数也不能使用数据库事务控制语句。

当触发器被触发时,要使用被插入、更新或删除的记录中的列值,有时要使用操作前、后列的值

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

4.实例

--创建表
create table cux.emp_his as
select * from cux.employee
where 1 = 2;--创建触发器
create or replace trigger del_emp_triggerbefore delete on cux.employee for each row
begininsert into cux.emp_his(last_name, department_id, employee_id, salary)values(:old.last_name, :old.department_id, :old.employee_id, :old.salary);
end;

5.创建替代(INSTEAD OF)触发器

CREATE [OR REPLACE] TRIGGER trigger_name
INSTEAD OF
{INSERT | DELETE | UPDATE [OF column [, column …]]}
ON [schema.] view_name
[FOR EACH ROW ]
[WHEN condition]
trigger_body;

INSTEAD OF用于对视图的DML触发。

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

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

相关文章

Rancher2.5.9版本证书更新

一、环境 主机名IP地址操作系统rancher版本K8s-Master192.168.10.236Centos 72.5.9 二、更新证书 1、查看当前证书到期时间 2、进行证书轮换 [rootK8s-Master ~]# docker ps |grep rancher/rancher d581da2b7c4e rancher/rancher:v2.5.9 &q…

ISO 22737-2021预定轨迹低速自动驾驶系统-系统要求、性能要求和性能测试规范(中文全文版)

简介 自动驾驶系统的发展导致了人员、货物和服务运输方式的转变。其中一种新的运输方式是低速自动驾驶(LSAD)系统,它在预定的路线上运行。LSAD系统将被用于最后一英里的运输、商业区的运输、商业或大学校园区以及其他低速环境的应用。 由LSAD系统驾驶的车辆(可以包括与基…

【C语言基础】数据输入输出

&#x1f4e2;&#xff1a;如果你也对机器人、人工智能感兴趣&#xff0c;看来我们志同道合✨ &#x1f4e2;&#xff1a;不妨浏览一下我的博客主页【https://blog.csdn.net/weixin_51244852】 &#x1f4e2;&#xff1a;文章若有幸对你有帮助&#xff0c;可点赞 &#x1f44d;…

Spring Security存在认证绕过漏洞 CVE-2021-22096

文章目录 0.前言1.参考文档2.基础介绍漏洞影响范围&#xff1a;官方说明&#xff1a;修复版本&#xff1a;漏洞利用步骤&#xff1a;修复方式&#xff1a; 3.解决方案 0.前言 背景&#xff1a;项目被扫到Spring Boot 的漏洞&#xff0c;严格的说应该是Spring Security 组件的漏…

地下水质分析积分球

我国的河流水资源相当丰富&#xff0c;河川径流总量历年来位居世界第三&#xff0c;年均达到了27000亿m。但经济快速发展的同时对河流水资源产生了一定的负面影响&#xff0c;河流水质污染和富营养化的现象偶有发生&#xff0c;在对我国七大水系216条河流503个主要断面进行监测…

【学习笔记】求解线性方程组的G-S迭代法

求解线性方程组的G-S迭代法 // 运行不成功啊function [x,k,index] Gau_Seid(A,b,ep,it_max) % 求解线性方程组的G-S迭代法&#xff0c;其中 % A为方程组的系数矩阵 % b为方程组的右端项 % ep为精度要求&#xff0c;省缺为1e-5 % it_max为最大迭代次数&#xff0c;省缺为100 % …

Redis之集群模式

一、Redis集群 一个节点就是一个运行在集群模式下的Redis服务器&#xff0c;Redis服务器在启动时会根据cluster-enabled配置选项是否为yes来决定是否开启服务器的集群模式。 Redis节点不会互相发现&#xff0c;连接各个节点的工作需要使用cluster meet命令来完成 CLUSTER MEE…

自然语言处理(三):基于跳元模型的word2vec实现

跳元模型 回顾一下第一节讲过的跳元模型 跳元模型&#xff08;Skip-gram Model&#xff09;是一种用于学习词向量的模型&#xff0c;属于Word2Vec算法中的一种。它的目标是通过给定一个中心词语来预测其周围的上下文词语。 这节我们以跳元模型为例&#xff0c;讲解word2vec的…

【Python开发环境搭建】【Pycharm设置】 新建python文件默认添加编码格式、时间、作者、文件名等信息

1、设置路径 打开pycharm&#xff0c;选择File->Settings&#xff08;Ctrl Alt S&#xff09;&#xff0c;Editor->File and Templates->Python Script 文件- 设置-编辑器-文件和代码模板-Python Script 2、设置内容 # -*- coding: utf-8 -*- # Time : ${DATE} …

pom.xml配置文件失效,显示已忽略的pom.xml --- 解决方案

现象&#xff1a; 在 Maven 创建模块Moudle时,由于开始没有正确创建好&#xff0c;所以把它删掉了&#xff0c;然后接着又创建了与一个与之前被删除的Moudle同名的Moudle时&#xff0c;出现了 Ignore pom.xml&#xff0c;并且新创建的 Module 的 pom.xml配置文件失效&#xf…

JVM 访问对象的两种方式

Java 程序会通过栈上的 reference 数据来操作堆上的具体对象。由于 reference 类型在《Java 虚拟机规范》里面只规定了它是一个指向对象的引用&#xff0c;并没有定义这个引用应该通过什么方式去定位、访问到堆中对象的具体位置&#xff0c;所以对象访问方式也是由虚拟机实现而…

如何通过内网穿透实现外部网络对Spring Boot服务端接口的HTTP监听和调试?

文章目录 前言1. 本地环境搭建1.1 环境参数1.2 搭建springboot服务项目 2. 内网穿透2.1 安装配置cpolar内网穿透2.1.1 windows系统2.1.2 linux系统 2.2 创建隧道映射本地端口2.3 测试公网地址 3. 固定公网地址3.1 保留一个二级子域名3.2 配置二级子域名3.2 测试使用固定公网地址…

[uniapp] scroll-view 简单实现 u-tabbar效果

文章目录 方案踩坑1.scroll-view 横向失败2.点击item不滚动?3. scrollLeft从哪里来? 效果图 方案 官方scroll-view 进行封装 配合属性 scroll-left Number/String 设置横向滚动条位置 即可 scroll-into-view 属性尝试过,方案较难实现 踩坑 1.scroll-view 横向失败 安装…

ACE_Proactor

服务端代码&#xff1a; #include "stdafx.h" #include <iostream> #include "ace/Message_Queue.h" #include "ace/Asynch_IO.h" #include "ace/OS.h" #include "ace/Proactor.h" #include "ace/Asynch_Accept…

网络综合布线专业技能人才培养方案

一、网络综合布线专业技能人才培养方案概述 网络综合布线专业技能人才培养方案旨在培养具备综合布线系统设计、安装与维护的全面技能和知识的专业人才。以下是一个概述&#xff1a; 培养目标&#xff1a;培养具备综合布线系统的理论基础和实践操作技能的专业人才&#xff0c;能…

MySQL中的free链表,flush链表,LRU链表

一、free链表 1、概述 free链表是一个双向链表数据结构&#xff0c;这个free链表里&#xff0c;每个节点就是一个空闲的缓存页的描述数据块的地址&#xff0c;也就是说&#xff0c;只要你一个缓存页是空闲的&#xff0c;那么他的描述数据块就会被放入这个free链表中。 刚开始数…

Java 体系性能优化工具

Java 体系性能优化 目录概述需求&#xff1a; 设计思路实现思路分析1.oom 异常来说&#xff1a;2.visualvm3.Arthas4.JProfiler &#xff08;全面&#xff09;5.jmeter 特有 参考资料和推荐阅读 Survive by day and develop by night. talk for import biz , show your perfect…

LeetCode第16~20题解

CONTENTS LeetCode 16. 最接近的三数之和&#xff08;中等&#xff09;LeetCode 17. 电话号码的字母组合&#xff08;中等&#xff09;LeetCode 18. 四数之和&#xff08;中等&#xff09; LeetCode 16. 最接近的三数之和&#xff08;中等&#xff09; 【题目描述】 给你一个…

vmware整理

一 部署ESXi 主机与vCenter(VCSA) 实验拓扑描述 实验部分 ESXi 安装 官方下载地址&#xff1a;www.vmware.com 下拉找到vSphere免费版本下载 登录后点击查看我的评估获取自己能下载的版本 VCSA的安装&#xff1a; vCenter&#xff08;VCSA&#xff09;部署 理论描述 虚拟化…

前端:html实现页面切换、顶部标签栏,类似于浏览器的顶部标签栏(完整版)

效果 代码 <!DOCTYPE html> <html><head><style>/* 左侧超链接列表 */.link {display: block;padding: 8px;background-color: #f2f2f2;cursor: pointer;}/* 顶部标签栏 */#tabsContainer {width:98%;display: flex;align-items: center;overflow-x: …