Oracle基础-PL/SQL编程 备份

1、PL/SQL简介

 PL/SQL块结构

约定:为了方便,本文后面把PL/SQL简称PL。

        PL程序都是以块(BLOCK)为基本单位,整个PL块分三部分:声明部分(使用DECLARE开头)、执行部分(以BEGIN开头)和异常处理部分(以EXCEPTION开头)。其中执行部分是必须的,其他两个部分可选。无论PL的代码量有多大,其基本结构都是由这三部分组成。标准的PL语法格式如下:

[DECLARE]

        --   声明部分,可选

BEGIN

        --  执行部分,必须

[EXCEPTION]

        --  异常处理,可选

接下来对PL块的三个部分进行详细说明:

(1)声明部分由关键字DECLARE开始,到BEGIN关键字结束。在这部分可以声明PL程序块中所用到的变量、常亮和游标等。需要注意的是:在某个PL块中声明的内容只能在当前块中使用,而在其他的PL中无法引用。

(2)执行部分以关键字BEGIN开始,它的结束方式通常有两种。如果PL块中的代码在运行时出现异常,则执行完异常处理部分的代码就结束;如果没有使用异常处理或PL未出现异常,则以END关键字结束。执行部分是整个PL程序块的主体,主要的逻辑控制和运算都在这部分完成,所以在执行部分可以包含多个PL语句和SQL语句。

(3)异常处理部分以关键字EXCEPTION开始,在该关键字所包含的代码执行完毕后,整个PL块也就执行结束了。在执行PL代码的过程中,可能会产生一些意想不到的错误,比如除数为零,空值参与运算等,这些错误都会导致程序中断运行。这样程序设计人员就可以在异常处理部分通过编写一定量的代码来纠正错误或者给用户提供一些错误信息提示,甚至将各种数据操作回退到异常产生之前的状态,以备重新运行代码块。另外,对于可能出现的多种异常情况,用户可以使用WHEN THEN语句来实现多分支判断,然后在每个分支下通过编写代码来处理相应的异常。

        对于PL块中的语句,需要指出的是:每一条语句都必须以分号结束,每条SQL语句可以写成多行的形式,同样必须使用分号来结束。另外,一行中也可以有多条SQL语句,但是他们之间必须以分号分隔。

【例1.1】定义一个PL,计算两个整数的和与这两个整数的差的商。

set serveroutput on;
declare
    a int := 100;
    b int := 200;
    c number;
   begin
     c := (a+b)/(a-b);
     dbms_output.put_line(c);
   exception
     when zero_divide then
       dbms_output.put_line('除数不能为零');
    end;
    /

3791b99968ca43fb846a847c5fc72668.png

 在上面的代码中,首先使用"set serveroutput on"命令来实现在服务端显示执行结果;然后使用declare关键字声明了3个变量,其中,前两个为int变量a和b的初始值分别为100,200;最后在PL块的执行部分计算,并调用"dbms_output.put_line(c)"输出。为了防止除数为0,还设置了异常处理部分。若发生除数为零的情况,则代码块通过调用dbms_output.put_line('除数不能为零'),向用户提示。如

f2ed3df7bce7441b9a891a31ab270b9c.png

2、数据类型、变量和常量

2.1 概述

        数据类型本质上是一种用于描述数据存储的内存结构,用它来决定变量中所存储数据的类型,而变量本质上是一种用名称进行识别的标示符号,它可以存储不同类型的数据。根据不同的数据类型,定义不同名称的变量,这样就可以存储不同类型的数据。变量在程序运行的过程中,其值可以发生变化,与变量对应的就是常量,常量是指在程序运行的过程中,值不会发生变化。

2.2 基本数据类型

        PL有多种数据类型,这些数据类型能够满足在编写PL程序过程中定义变量和常量。

        2.2.1 数值类型

                数值类型主要包括NUMBER、PLS_INTEGER和BINARY_INTEGER三种基本类型。其中,NUMBER变量可以存储整数或浮点数,而PLS_INTEGER和BINARY_INTEGER只能存储整数。

                NUMBER 类型还可以通过number(P,S)的形式来格式化数字。其中,P表示精度,S表示刻度范围。精度是指数值中所有有效数字的个数,而刻度范围是指小数点右边小数位的个数,其中P和S都是可选的。

                【例2.2.1.1】声明一个精度为9,刻度范围是2的表示金额的变量Num_Money,代码如下。

        

Num_Money NUMBER(9,2);

PL还提出“子类型”的概念,子类型就是与NUMBER类型等价的类型别名,甚至可以说是NUMBER类型的多种命名形式,这些等价的子类型主要包括DEC,DECIMAL,DOUBLE,INTEGER,INT,NUMERIC,SMALLINT,BINARY_INTEGER,PLS_INTEGER等。

        2.2.2 字符类型

                字符类型主要包括VARCHAR2,CHAR,LONG,NCHAR,NVARCHAR2等,这些类型的变量可以用来存储字符串或字符数据。

                1、VARCHAR2

                PL语言中的VARCHAR2与数据库类型中的VARCHAR2类似,可以用来存储可变长度的字符串,声明语法格式为:

                VARCHAR2(maxlength)

                maxlength表示可以存储字符串的最大长度,这个参数值在定义变量时必须给出(因为VARCHAR2类型没有默认的最大长度),maxlength最大值是32767.

                注意:数据库类型的VARCHAR2的最大长度是4000字节,所以一个长度大于4000字节的PL类型VARCHAR2变量不可以赋值给数据库中的VARCHAR2变量,只能赋值给LONG类型的数据库变量。

                2、CHAR

                char 类型表示指定长度的字符串,其语法格式如下:

                CHAR(maxlength)

                maxlength指可存储字符串的最大长度,以字节为单位,最大32767字节,CHAR类型的默认最大长度是1。与VARCHAR2不同,maxlength可以不指定,默认为1。如果赋值CHAR类型的指不足maxlength,则会在后面用空格补全,这也是不同VARCHAR2的地方。

                注意:数据库类型的CHAR最大只有2000字节,所以如果PL中CHAR类型变量的长度大于2000字节,则不能赋给数据库中的CHAR。

                3、LONG

                LONG类型表示一个可变的字符串,最大长度是32767,而数据库类型的LONG最大长度为2GB,所以几乎任何字符串都可以赋值给它。

                4、NCHAR和NVARCHAR2

                NCHAR和NVARCHAR2类型是PL 8.0以后才加入的类型,它们的长度要根据各国字符集来确定,只能具体情况具体分析。

        2.2.3 日期类型

                日期类型只有一种DATE类型,用来存储日期和时间,DATE类型的存储空间是7个字节,分别使用一个字节存储世纪、年、月、日、小时、分、秒。

        2.2.4 布尔类型

                布尔类型也只有一种BOOLEAN,主要用户程序的流程控制和业务逻辑判断,其值可以使TRUE,FALSE,NULL。

2.3 特殊数据类型

        2.3.1 %TYPE类型

        使用%TYPE关键字可以声明一个与指定列相同的数据类型,它通常紧跟在指定列名的后面。

        【例2.3.1.1】声明一个与emp表中job列的数据类型完成相同的变量var_job

        

declare
    var_job emp.job%TYPE;

        使用%TYPE定义变量有两个好处:第一,用户不必查询表中各个列的数据类型,就可以确保所定义的变量能够存储检索的数据;第二,如果对表中已有列的数据类型进行修改,则不必考虑对已定义的变量所使用的的数据类型进行更改,因为%TYPE类型的变量会根据列的实际类型自动调整自身的数据类型。

        【例2.3.1.2】使用%TYPE类型的变量输出emp表中编号为7369的员工名称和职务信息

                

SQL> set serveroutput on
SQL> declare 
  2      var_ename emp.ename%TYPE;
  3      var_job   emp.job%TYPE;
  4      begin
  5           select ename,job 
  6           into var_ename,var_job
  7           from emp
  8           where empno = 7369;
  9           dbms_output.put_line(var_ename || '的职务是' || var_job);
 10     end;
 11  /

30aa49a10ce140748f3b367e897c3806.png

在上面的代码中使用into子句,它位于select子句的后面,用于设置将从数据库检索的数据存储到哪个变量中。

注意:由于into子句中的变量只能存储一个单独的值,所以要求select子句只能返回一行数据,这个由where子句进行了限定,如果select子句返回多行数据,则代码运行后会返回错误信息 

        2.3.2 RECORD类型

        RECORD称为记录类型,使用该类型的变量可以存储由多个列值组成的一行数据,在声明记录类型变量之前,首先需要定义记录类型,然后才可以声明记录类型的变量。记录类型是一种结构化的数据类型,它使用type语句进行定义,在记录类型的定义结构中包含成员变量及其数据类型,语法:

        type record_type is record

        (

                var_member1 data_type [not null] [:=default_value],

                ...

                var membern data_type [not null] [:=default_value]

        )

        record_type:表示要定义的记录类型名称

        var_member1:表示该记录类型的成员变量名称。

        data_type:表示成员变量的数据类型

        【例2.3.2.1】声明一个记录类型emp_type,然后使用该类型的变量存储emp表中的一条记录信息,并输出。

set serveroutput on;
SQL> declare
  2      type emp_type is record
  3      (
  4           var_name varchar2(20),
  5           var_job varchar2(20),
  6           var_sal number
  7      );
  8      empinfo emp_type;
  9      begin
 10          select ename,job,sal into empinfo
 11          from emp
 12          where empno = 7369;
 13          dbms_output.put_line('员工' || empinfo.var_name || '的职务是' || empinfo.var_job ||',工资是' || empinfo.var_sal);
 14          end;
 15  /

1e558d9fb1ee4c7b9b351928728e0cbb.png

 2.3.3 %ROWTYPE类型

%rowtype 类型变量结合了“%type”和“record”变量的优点,它可以根据数据表中行的结构定义一种特殊的数据类型,用来存储从数据表中检索到的一行数据。语法:

rowVar_name table_name%rowtype;

rowVar_name:表示可以存储一行数据的变量名

table_name:指定的表名

【例2.3.3.1】声明一个%ROWTYPE类型的变量rowVar_emp,然后使用该变量存储emp表中的一行数据。

set serveroutput on;
SQL> declare
  2      rowVar_emp emp%rowtype;
  3      begin
  4        select * into rowVar_emp from emp where empno = 7369;
  5        dbms_output.put_line('员工'||rowVar_emp.ename || '的编号是' || rowVar_emp.empno ||',职务是' || rowVar_emp.job);
  6        end;
  7  /

952e6f3cb53044b090423121c68c01bc.png

 2.4 定义变量和常量

        2.4.1 定义变量

        变量是指其值在程序运行过程中可以改变的数据存储结构,定义变量必须的元素就是变量名和数据类型,另外还有可选择的初始值,格式如下:

<变量名><数据类型>[(长度) := <初始值>];

      可见,与许多面向对象的编程语言不通,PL中的变量定义要求变量名在数据类型的前面,而不是后面;语法中的长度和初始值是可选项,根据实际情况而定。

【例2.4.1.1】定义一个用户存储国家名称的可变字符串变量var_country,该变量的长度是50,并且该变量的初始值是"中国",代码如下:

var_country varchar2(50) := '中国';

        2.4.2 定义常量

        常量是指其值在程序运行过程中不可改变的数据存储结构,定义常量必须的元素包括常量名、数据类型、常量值和constant关键字,格式如下:

感谢关注,未完待续~~~~

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

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

相关文章

武汉星起航:跨境电商优势尽显,引领全球贸易与文化交流新浪潮

在全球化日益加深的今天&#xff0c;跨境电商行业以其独特的优势和好处&#xff0c;逐渐超越了国内电商行业&#xff0c;成为了电商领域的新宠。跨境电商不仅拓展了企业的市场范围&#xff0c;还为消费者带来了更多选择和便利。武汉星起航认为与国内电商相比&#xff0c;跨境电…

5032温补晶振的一些常用型号和实例应用

5032晶振是常用的一种尺寸的晶振&#xff0c;而5032温补晶振因为其高精度高稳定性而被广泛应用。小尺寸封装5.0mm*3.2mm*1.45mm&#xff0c;非常节省空间&#xff0c;便于设计与使用。其实爱普生推出了一系列的5032温补晶振:以TG5032CAN、TG5032SAN、TG5032CDN、TG5032SDN&…

IDEA一行代码出现下划实线,怎么处理?

&#x1f3c6;本文收录于「Bug调优」专栏&#xff0c;主要记录项目实战过程中的Bug之前因后果及提供真实有效的解决方案&#xff0c;希望能够助你一臂之力&#xff0c;帮你早日登顶实现财富自由&#x1f680;&#xff1b;同时&#xff0c;欢迎大家关注&&收藏&&…

【Qt】使用Qt实现Web服务器(九):EventSource+JSON实现工业界面数据刷新

1、效果 效果如下,实时刷新温度、湿度 2、源码 2.1 index.html <html><body> <!-- 页面布局,本人对HTML标签不熟悉,凑合看吧 --> <div><label for

整顿编剧市场:程序员提交测试流程的最佳实践

讲动人的故事,写懂人的代码 最近,一部去年推出的国产电视剧在IT圈子里引起了轰动。 引起关注的原因,并非剧中程序员的外形出众,而是她提交代码测试的方式——将写有代码的纸张放入文件夹,然后递给了对面的测试人员。如图1所示。 图1 程序员将写有代码的纸张放入文件夹,并…

2024年全新靠谱的FTP替代升级解决方案

随着企业规模的扩大和业务的多元化&#xff0c;传统的TCP协议在数据传输效率上逐渐显现出局限性。TCP协议虽然以其稳定性和可靠性被广泛应用&#xff0c;但在面对大规模数据传输时&#xff0c;其性能瓶颈逐渐成为企业发展的阻碍。同时&#xff0c;基于TCP的应用协议如Telnet、F…

JS两道题:判断这个月有几天;计算薪资缴税。

计算的时候直接在字符串模版中没问题的&#xff1a; swicth语句分支结构&#xff1a;&#xff08;很多不一样的固定值&#xff09; break结束当前穿透现象 他它的表达式的结果和值必须是全等的关系 当所有的值都不匹配的时候就执行这个部分代码 其实就是在考察条件问题。比如&…

网络钓鱼升级 Darcula如何窃取用户信息

近日&#xff0c;网络安全领域一种名为 “Darcula” 的网络钓鱼欺诈&#xff08;PhaaS&#xff09;悄然兴起。这种新型钓鱼方式不同于传统的手段&#xff0c;它巧妙地利用了谷歌信息和 iMessage 的富通信服务&#xff08;RCS&#xff09;&#xff0c;成为了网络犯罪分子的新手段…

AI绘画软件有什么用?

人工智能(AI)的应用已经渗透到我们生活的各个角落&#xff0c;其中就包括图像生成。AI绘画软件&#xff0c;是一种基于深度学习技术的创新工具&#xff0c;它能够根据指定的风格、主题或者素材自动创作出新的图片。那么&#xff0c;AI绘画软件具体有什么用呢? 首先&#xff0c…

开源大模型AI代理操作系统:像Windows一样,操控AI代理

去年&#xff0c;AutoGPT的出现让我们见识到了AI代理强大的自动化能力&#xff0c;并开创了一个全新的AI代理赛道。但在子任务调度、资源分配以及AI之间协作还有不少的难题。 因此&#xff0c;罗格斯大学的研究人员开源了AIOS&#xff0c;这是一种以大模型为核心的AI代理操作系…

资源优化题

资源平滑类资源优化题 不改变关键路径的情况下&#xff0c;如何避免资源扎堆使用。 破解思路: 1、能串行尽量串行。 2、一定要并行&#xff0c;尽量躲开跟人数多的活动并行。 3、如何躲开&#xff0c;就靠时差来实现。 例题1&#xff1a;某工程包括A、B、C、D、E、F、G七项工作…

Vue ElementPlus Input 输入框

Input 输入框 通过鼠标或键盘输入字符 input 为受控组件&#xff0c;它总会显示 Vue 绑定值。 通常情况下&#xff0c;应当处理 input 事件&#xff0c;并更新组件的绑定值&#xff08;或使用v-model&#xff09;。否则&#xff0c;输入框内显示的值将不会改变&#xff0c;不支…

生鲜网上交易信息系统的设计与实现|Springboot+ Mysql+Java+ B/S结构(可运行源码+数据库+设计文档)海鲜,餐饮电商,超市,农产品,购物车,订单管理,广告信息管理,生鲜信息管理

本项目包含可运行源码数据库LW&#xff0c;文末可获取本项目的所有资料。 推荐阅读300套最新项目持续更新中..... 最新ssmjava项目文档视频演示可运行源码分享 最新jspjava项目文档视频演示可运行源码分享 最新Spring Boot项目文档视频演示可运行源码分享 2024年56套包含ja…

【Hello,PyQt】PyQt5中的一些对话框

QDialog类是一种特殊的窗口&#xff0c;它被设计出来作为和用户进行交换的对话框。QDialog上是可以包含其他的控件的&#xff0c;比如QLineEdit&#xff0c;QPushButton等。QDialog类的子类主要有QMessageBox&#xff0c;QFileDialog&#xff0c;QColorDialog&#xff0c;QFont…

OKCC厂家原来还有语音通知系统

最近遇到一个场景是这样的&#xff0c;可能是最开始的需求不明确&#xff0c;代理商以为他的客户场景需要用AI语音机器人来实现&#xff0c;于是已经购买了一套机器人系统给客户上线&#xff0c;但是由于系统并发问题&#xff0c;客户那边的呼叫任务机器人完不成&#xff0c;于…

OpenAI ChatGPT 与 Google Gemini 特性深度对比分析

ChatGPT与Gemini对决&#xff1a;AI 语言模型的未来之战 介绍 人工智能语言模型的出现开辟了技术的新领域。 最近&#xff0c;ChatGPT和Gemini一直是LLM的主要话题&#xff0c;并且有很多关于它们功能的比较。 在本文中&#xff0c;我们比较了该领域的两个领先者&#xff1a;Op…

书生·浦语大模型实战营 | 第1次学习笔记

前言 书生浦语大模型应用实战营 第二期正在开营&#xff0c;欢迎大家来学习。&#xff08;参与链接&#xff1a;https://mp.weixin.qq.com/s/YYSr3re6IduLJCAh-jgZqghttps://mp.weixin.qq.com/s/YYSr3re6IduLJCAh-jgZqg&#xff09; 第一堂课的视频链接&#xff1a;https://m…

AI在招聘中的优势:如何颠覆传统?

在当今快节奏的商业环境中&#xff0c;企业争相寻找提升效率的方法&#xff0c;特别是在招聘这一关键领域。人工智能&#xff08;AI&#xff09;凭借其卓越的数据处理能力和学习算法&#xff0c;为企业的招聘流程带来了革命性的变化。但是&#xff0c;人工智能到底是如何在招聘…

【设计】枚举的应用

什么是枚举 枚举是一种特殊的数据类型&#xff0c;用于定义具有固定个数的常量集。它可以帮助我们更好地管理常量&#xff0c;使代码更易于阅读和维护。 Java枚举是一种高效、可读性强的常量管理方式&#xff0c;它可以使代码更易于维护和扩展。使用Java枚举可以帮助我们有效…

frp内网穿透,让外网可以访问内网

需求 我们的svn部署在内网&#xff0c;用的一直没问题&#xff0c;但是有时候有需求在外网访问svn&#xff0c;进行提交更新等操作&#xff0c;这时候就有了内网穿透这个需求。 当然&#xff0c;我们也可以借助花生壳等软件进行内网穿透&#xff0c;傻瓜化操作&#xff0c;也…