我的编程空间,编程开发者的网络收藏夹
学习永远不晚

什么是 PL/SQL? 怎么用?

短信预约 信息系统项目管理师 报名、考试、查分时间动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

什么是 PL/SQL? 怎么用?

什么是 PL/SQL? 怎么用?

PL/SQL

1.什么是PL/SQL?

PL/SQLProcedure Language/SQL)是Oraclesql语言的过程化扩展,指在SQL命令语言中增加了过程处理语句(如分支/条件、循环变量、类型等),使SQL语言具有过程处理能力。把SQL语言的数据操纵能力与过程语言的数据处理能力结合起来,使得PLSQL面向过程但比过程语言简单、高效、灵活和实用。

 

基本语法结构

[declare  
   --声明变量
   ]
 begin
   --代码逻辑  
 [exception
   --异常处理
   ]
 end;

 

 

2.变量

-- 声明变量的语法:
变量名 类型(长度);
i varchar2(20);


--变量赋值的语法
变量名 :=变量值
i :="煌煌"

 

举例使用:

--入门练习1;打印"welcome!!"
begin 
  dbms_output.put_line("welcome!!!");
  end;



--实例1;定义变量 i,并赋值 "你好",输出
--变量类型,一定要支持赋值的长度
declare 
 i varchar2(20);
begin 
   i :="你好";
   dbms_output.put_line("输出内容是:" || i);
end;   




--多个变量
declare
 sname varchar2(20):="huangsir";
 age int:=18;
 sex varchar2(20):="男";
 begin 
   dbms_output.put_line("姓名:" ||sname || ",年龄:" ||age || ",性别:" ||sex);
 end;

 

如何执行查看呢?

 

 

Select into方式 赋值

语法结构: into关键字是能用在过程中

select 列名1,列名2  into  变量名1,变量名2  from 表名 where 条件

举例:

--练习1;打印业主名称
declare 
  --声明变量,用于存放name的值
  v_name varchar2(50);

begin
  --执行查询语句,获得name的值,并赋值变量
  select  name into v_name from t_owners where id=11;
  --打印变量
dbms_output.put_line(v_name);
end;

 

3. 变量类型 %type

如果自定义类型大小,如果设置的太小会出现数字或值错误:字符缓存区太小的错误
所以可用%type自己引用表类型即可

语法:

-- 语法
变量名  表名.列名%type;
-- 实例
v_name towners.name%type;

 

案例:

--练习2;打印业主名称
declare 
  --声明变量,用于存放name的值
  v_name t_owners.name%type;    --使用%type  可以不用自定义数据类型,直接从表数据获取类型

begin
  --执行查询语句,获得name的值,并赋值变量
  select  name into v_name from t_owners where id=11;
  --打印变量
dbms_output.put_line(v_name);
end;

 

练习:

--练习3:  需求:计算台账表中编号为1的用户当月用水金额。
      --要求输出:单价、吨数、金额、上月用水量、本月用水量

declare
 v_price number; --单价
 v_num0 number;   --t_account.num0%type   上月累计用水量
 v_num1 number;   --t_account.num1%type   本月累计用水量
 v_usenum number;  --t_account.usenum%type    使用量
 v_money number;  --金额
 v_usenum2 number;  --吨数
 
begin
  v_price:=3.45; --单价赋值
  --查询数据;获得用水量,金额
 select num0,num1,usenum,money into v_num0,v_num1,v_usenum,v_money from t_account where id = 45;
    --吨数 19920 /1000 ->> 19.920 -->19.92
    v_usenum2:=round(v_usenum/1000 ,2);
       v_money:=v_price*v_usenum2;
   --打印
   dbms_output.put_line("单价、"|| v_price ||"吨数、"||v_usenum2|| "金额"||v_money ||"、上月用水量"||v_num0 ||"、本月用水量"||v_num1); 
    
end;

 

 

%ROWTYPE   记录型 

  • 作用:  标识某个表的行记录类型
  • 通过%rowtype获得某一行的所有类型,相当于一个对象,存放一条记录

声明变量 :

--语法
变量 表名%rowtype;
--实例
v_account t_account%rowtype;

 

赋值 :

-- 单列
select 列名,列名2,... into 变量.列名,变量.列名2,...  from 表名;
-- 所有
select * into 变量  from 表名;

 

示例:重写上个练习:使用%rowtype

declare 
 --单价
  v_price number;
  --声明行变量
  v_account t_account%rowtype;
begin 
   --单价赋值
   v_price :=3.45;
   --保存-行数
   select * into v_account from t_account where id=45;
   --打印
   dbms_output.put_line("单价"||v_price ||",金额"||v_account.money ||",上月用水量"
   ||v_account.num0 ||",本月用水量"||v_account.num1);
   end;

 

 

4. 异常

在运行程序时出现的错误叫做异常

发生异常后,语句将停止执行,控制权转移到 PL/SQL 块的异常处理部分

异常有两种类型:

  • 预定义异常 -  当 PL/SQL 程序违反 Oracle 规则或超越系统限制时隐式引发
  • 用户定义异常  -  用户可以在 PL/SQL 块的声明部分定义异常,自定义的异常通过 RAISE 语句显式引发

 

预定义异常

Oracle预定义异常 21个

命名的系统异常

产生原因

ACCESS_INTO_NULL

未定义对象

CASE_NOT_FOUND

CASE 中若未包含相应的 WHEN ,并且没有设置 ELSE 时

COLLECTION_IS_NULL

集合元素未初始化

CURSER_ALREADY_OPEN

游标已经打开

DUP_VAL_ON_INDEX

唯一索引对应的列上有重复的值

INVALID_CURSOR

在不合法的游标上进行操作

INVALID_NUMBER

内嵌的 SQL 语句不能将字符转换为数字

NO_DATA_FOUND

使用 select into 未返回行

TOO_MANY_ROWS

执行 select into 时,结果集超过一行

ZERO_DIVIDE

除数为 0

SUBSCRIPT_BEYOND_COUNT

元素下标超过嵌套表或 VARRAY 的最大值

SUBSCRIPT_OUTSIDE_LIMIT

使用嵌套表或 VARRAY 时,将下标指定为负数

VALUE_ERROR

赋值时,变量长度不足以容纳实际数据

LOGIN_DENIED

PL/SQL 应用程序连接到 oracle 数据库时,提供了不正确的用户名或密码

NOT_LOGGED_ON

PL/SQL 应用程序在没有连接 oralce 数据库的情况下访问数据

PROGRAM_ERROR

PL/SQL 内部问题,可能需要重装数据字典& pl./SQL 系统包

ROWTYPE_MISMATCH

宿主游标变量与 PL/SQL 游标变量的返回类型不兼容

SELF_IS_NULL

使用对象类型时,在 null 对象上调用对象方法

STORAGE_ERROR

运行 PL/SQL 时,超出内存空间

SYS_INVALID_ID

无效的 ROWID 字符串

TIMEOUT_ON_RESOURCE

Oracle 在等待资源时超时

 

 

语法:

-- 语法
declare
begin
	-- 正常代码
	-- 异常块
	exception
		when 异常类型 then
			处理
		when 异常类型 then
			处理
		....
end;
-- 常见异常类型:
no_date_found , 没有数据异常,查询结果为null
too_many_rows,太多行,查询结果大于1条

 

练习4:查询台账表,id为1所有信息,并打印部分 -- 异常情况--没有数据

-- 异常处理
-- 练习4:查询台账表,id为1所有信息,并打印部分
declare 
  v_account t_account%rowtype;
begin 
  --查询
  select * into v_account from t_account where id = 999;
  --打印
  dbms_output.put_line("上月用水量" || v_account.num0 || "本月用水量" || v_account.num1);
  -- 异常处理
  exception 
    when no_data_found then
      dbms_output.put_line("没有查询到数据");
    when too_many_rows then
      dbms_output.put_line("查询结果大于1条");
end;

 

练习4:查询台账表,id为1所有信息,并打印部分 -- 异常情况--查询多条数据

declare 
  v_account t_account%rowtype;
begin 
  --查询
  select * into v_account from t_account ; --少了where id=45 ,数据有多条
  --打印
  dbms_output.put_line("上月用水量" || v_account.num0 || "本月用水量" || v_account.num1);
  -- 异常处理
  exception 
    when no_data_found then
      dbms_output.put_line("没有查询到数据");
    when too_many_rows then
      dbms_output.put_line("查询结果大于1条");
end;

 

 

5. 条件判断

基本语法1

if 条件 then

     业务逻辑

end if;

 

基本语法2

 if 条件 then

   业务逻辑

 else

   业务逻辑

 end if;

 

基本语法3

if 条件 then
     业务逻辑
elsif 条件 then
     业务逻辑
else
     业务逻辑  
end if;

 

实例:需求:设置三个等级的水费 5吨以下2.45元/吨 5吨到10吨部分3.45元/吨 ,超过10吨部分4.45 ,根据使用水费的量来计算阶梯水费

declare 
   --定义3个水费价格
   v_price1 number;
    v_price2 number;
    v_price3 number;
   --查询台账记录
   v_account t_account%rowtype;
   --使用量(吨数)
   v_usenum2 number;
   --金额
   v_money number;
begin
    --确定水费价格
    v_price1:=2.45;
     v_price2:=3.45;
      v_price3:=4.45;
    --查询记录
    select  * into v_account from t_account where id=45;
    --计算使用量
     v_usenum2:=round(v_account.usenum/1000,2);
     
    
    --根据使用量,计算阶梯水费
    
    if v_usenum2<=5 then
    --小于5吨 ,  使用量*2.45
     v_money:=v_usenum2*2.45;
     elsif v_usenum2 <=10 then
    --小于10吨   5* 2.45 +(使用量-5) *3.45
      v_money:=5 *2.45 +(v_usenum2-5)*3.45;
    else
    --大于10吨   5*2.45 +5*3.45 +使用量-10) *4.45
    v_money:=5 *2.45+5*3.45+(v_usenum2-10)*4.45;
    end if;
    --打印水费
    dbms_output.put_line(v_money);
end;

 

 

6.循环

(1)无条件循环

语法:

--语法
loop
	-- 代码
	-- 结束循环
	exit;
end loop;

 

练习:输出从1开始的100个数

declare
 v_i int :=1;
begin
  loop
    dbms_output.put_line(v_i);
    --累加
    v_i:=v_i+1;
    -- 退出
   if v_i > 100 then
     exit;
     end if;
     end loop;
end;

 

 

(2)条件循环-while

语法:

--语法结构
while 条件
loop
  ...
end loop;

 

举例:求1-100和,并打印

declare
--计数器
 v_i int :=1;
 --求和变量
 v_sum int :=0;
begin 
  while v_i <=100
  loop
     --求和
     v_sum :=v_sum+v_i;
     
     --累加
     v_i:=v_i +1;
     end loop;
     --打印
     dbms_output.put_line(v_sum);
end;     

 

 

(3)for循环

语法:

for 变量  in 起始值..终止值
loop
  
end loop;

 

举例:

求1-100所有偶数的和,并打印

declare
--计数变量
v_i int;
 --求和变量
 v_sum int :=0;
begin
  for v_i in 1..100
    loop
      --mod()用于求余
     if  mod(v_i,2)= 0 then
      v_sum :=v_sum+v_i;
      end if;
    end loop;  
      dbms_output.put_line(v_sum); 
end;

 

 

 

练习前.需要知道的小知识:

declare
begin
  --一行输出
    dbms_output.put("123");
  --换行输出
  dbms_output.put_line("abc");

end;

 

练习: 99乘法表 :分步骤实现

--1.普通循环
declare 
 vi int;
begin
  --循环
  for vi in 1..9
    loop
      dbms_output.put_line(vi);
      end loop;
end;




--2.嵌套循环
declare 
 vi int;
 vj int;
begin 
  --嵌套循环
  for vi in 1..9
    loop
      --内部循环
     for vj in 1..9
       loop 
           dbms_output.put_line(vi || vj);
       end loop;
    
     end loop; 
end;      




---3.总

declare 
 v_i int;
 v_j int;
begin
  --嵌套循环
  for v_i in 1..9
    loop
      --内部循环
      for v_j in 1..v_i
        loop 
          dbms_output.put(v_j || "*" || v_i ||"=" ||(v_i*v_j) );
      dbms_output.put("   "); 
     end loop;
     dbms_output.put_line("");
     end loop;
end;

 

 

7.游标

(1)什么是游标?

游标是系统为用户开设的一个数据缓冲区,存放SQL语句的执行结果。我们可以把游标理解为PL/SQL中的结果集。

  • 游标就是将查询结果存放到缓存区,可以通过游标依次获得数据

 

 

语法

--在声明区声明游标,语法如下:
cursor 游标名称 is SQL语句;

 

 

declare
    --声明游标
    cursor 游标名称 is 查询语句;
begin
    open 游标名称;
    loop;
        -- 给游标指向当前行进行命名,方便获得当前行的数据
        fetch 游标名称 into 变量;
        -- 使用当前行数据
        -- 结束信息
        exit when 游标名称%notfound;
    end loop;
    close 游标名称;
end;

 

 

案例: 需求:打印业主类型为1的价格表 

实现方式1:

--方式1;游标的基本操作
declare
  --声明游标
  cursor cur_pricetable is select * from t_pricetable where ownertypeid=1;
 --声明表里,可以存放一条记录
 v_pricetable t_pricetable%rowtype;

begin
   --开启
   open cur_pricetable;
     
   loop 
     --游标指向行数据,打印价格(给游标中的数据进行命名,方便获得行数据)
     fetch cur_pricetable into v_pricetable;
    
     --没有数据,退出
  exit when cur_pricetable%notfound;
  --打印
   dbms_output.put_line(v_pricetable.price);
 end loop;
   
   --关闭
   close cur_pricetable;
end;

 

 

实现方式2.for循环(简化)

declare
 --声明游标
 cursor cp is select * from t_pricetable where ownertypeid=1;
  --变量
  vp t_pricetable%rowtype;
begin
    --for遍历
     for vp in cp
       loop
         dbms_output.put_line(vp.price);
       end loop;  
end;

 

 

具有参数的游标

语法:

 --curso 游标名称(参数名称 类型) is  SQL语句..where id=参数名称;
 -- 在for vp in cp(想要传递的参数);

 

案例:

declare
 --声明游标
 cursor cp(v_ownertypeid number) is select * from t_pricetable where ownertypeid=v_ownertypeid;
  --变量
  vp t_pricetable%rowtype;
begin
    --for遍历
     for vp in cp(3)
       loop
         dbms_output.put_line(vp.price);
       end loop;  
end;

 

 

 

 

看完恭喜你,又知道了一点点!!!

你知道的越多,不知道的越多! 

~感谢志同道合的你阅读,  你的支持是我学习的最大动力 ! 加油 ,陌生人一起努力,共勉!!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

什么是 PL/SQL? 怎么用?

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

什么是 PL/SQL? 怎么用?

PL/SQL 1.什么是PL/SQL? PL/SQL(Procedure Language/SQL)是Oracle对sql语言的过程化扩展,指在SQL命令语言中增加了过程处理语句(如分支/条件、循环、变量、类型等),使SQL语言具有过程处理能力。把SQL语言的
什么是 PL/SQL? 怎么用?
2016-03-08
2024-04-02

PL/SQL中的游标是什么

PL/SQL中的游标是一种用于处理查询结果集的数据结构。它允许开发人员逐行处理查询结果,类似于数据库中的指针。通过游标,开发人员可以在PL/SQL代码中对查询结果进行循环处理,以便进一步处理数据或执行其他操作。游标可以分为显式游标和隐式游标
PL/SQL中的游标是什么
2024-03-02

【赵强老师】什么是PL/SQL?

一、什么是PL/SQL? PL/SQL(Procedure Language/SQL)是oracle在标准的sql语言上的扩展。ql/sql不仅允许嵌入sql语言,还可以定义变量和常量,允许私用条件语句和循环语句,允许使用例外处理各种错误,这使得它的功能变得更
【赵强老师】什么是PL/SQL?
2016-06-10

PL/SQL的控制结构是什么

PL/SQL的控制结构包括以下几种:IF-THEN-ELSE语句:用于在条件成立时执行某些操作,否则执行其他操作。CASE语句:用于根据不同的条件执行不同的操作。LOOP语句:用于循环执行一段代码,直到满足退出条件。WHILE循环:在指定条
PL/SQL的控制结构是什么
2024-05-07

PL/SQL的调试技术是什么

PL/SQL的调试技术主要有以下几种:使用DBMS_OUTPUT包:通过在代码中插入DBMS_OUTPUT.PUT_LINE语句,可以打印出变量的值,帮助开发人员了解程序的执行过程。使用断点:在PL/SQL开发工具中设置断点,可以在程序执行
PL/SQL的调试技术是什么
2024-05-08

PL/SQL的包与集合是什么

PL/SQL的包是一种存储过程、函数、变量和数据类型的逻辑单元,在数据库中封装了一组相关的程序和数据结构。包可以帮助组织和管理代码,提高代码的重用性和可维护性。集合是一种数据结构,可以存储多个元素并对这些元素进行操作。在PL/SQL中,有
PL/SQL的包与集合是什么
2024-05-08

PL/SQL的语法与结构是什么

PL/SQL(Procedural Language/Structured Query Language)是 Oracle 数据库中的一种过程化编程语言,用于编写存储过程、函数、触发器和包等数据库对象。PL/SQL的语法和结构主要包括以下几
PL/SQL的语法与结构是什么
2024-05-07

PL/SQL异常处理机制是什么

PL/SQL异常处理机制是一种用于处理运行时错误和异常情况的技术。当PL/SQL程序执行过程中发生错误或异常时,可以使用异常处理机制来捕获和处理这些异常,以便程序可以继续执行或者提供更好的错误信息给用户。异常处理机制通常包括以下几个关键步
PL/SQL异常处理机制是什么
2024-05-08

PL/SQL的序列与游标是什么

PL/SQL中的序列和游标是两种不同的概念。序列是用来生成唯一值的对象,通常用于给表的主键列赋值。序列可以通过CREATE SEQUENCE语句创建,并通过NEXTVAL和CURRVAL关键字来获取序列的下一个值和当前值。游标则是用于在P
PL/SQL的序列与游标是什么
2024-05-08

Oracle数据库中的PL/SQL是什么

PL/SQL是Procedural Language/Structured Query Language的缩写,是用于Oracle数据库的编程语言。PL/SQL结合了SQL语句和过程性编程语言的特性,可以用于编写存储过程、触发器、函数等数据
Oracle数据库中的PL/SQL是什么
2024-04-09

Oracle中PL/SQL包的概念是什么

PL/SQL包是一种存储过程和函数的集合,它们被组织在一起以便于共享和重用。一个PL/SQL包包含了声明、变量、常量、异常、游标、存储过程和函数等,这些都是在数据库中执行的代码片段。通过将相关的存储过程和函数放在一个包中,可以更好地组织和
Oracle中PL/SQL包的概念是什么
2024-04-19

PL/SQL中的SQL注入防范策略是什么

在PL/SQL中,防范SQL注入的策略主要包括以下几点:使用绑定变量:通过使用绑定变量来传递参数,而不是直接将参数拼接到SQL语句中,可以有效防止SQL注入攻击。绑定变量可以在SQL语句中使用冒号(:)来表示,然后通过绑定参数的方式传递变量
PL/SQL中的SQL注入防范策略是什么
2024-05-08

PL/SQL的绑定变量是什么意思

PL/SQL的绑定变量是在SQL语句中使用冒号(:)来引用的变量,这些变量在执行SQL语句时由应用程序或用户提供。绑定变量可以在SQL语句中多次使用,提供了一种灵活和高效的方式来执行相同的SQL语句,只需改变绑定变量的值即可。绑定变量可以避
PL/SQL的绑定变量是什么意思
2024-05-07

PL/SQL的权限管理方法是什么

在PL/SQL中,权限管理主要通过使用角色和权限来进行管理。角色是一组权限的集合,可以将角色赋予用户或其他角色,从而控制其对数据库对象的访问权限。权限可以分为系统权限和对象权限两种类型,系统权限包括对数据库的操作权限,而对象权限包括对特定对
PL/SQL的权限管理方法是什么
2024-05-08

Oracle中PL/SQL与SQL有什么区别

PL/SQL(Procedural Language/Structured Query Language)是Oracle数据库中的一种编程语言,它结合了SQL和过程化编程的特点。SQL(Structured Query Language)是
Oracle中PL/SQL与SQL有什么区别
2024-04-19

PL/SQL的触发器有什么作用

PL/SQL的触发器是一种存储在数据库中的程序,其目的是通过在指定的表上自动执行一组操作来实现数据一致性和完整性。触发器可以在数据插入、更新或删除时触发,并执行用户定义的操作,例如更新其他表的数据、记录日志、发送通知等。触发器的作用包括但
PL/SQL的触发器有什么作用
2024-05-07

PL/SQL怎么与Java集成使用

在PL/SQL中与Java集成可以通过使用Java存储过程或函数来实现。以下是步骤:创建Java类和方法:首先在Java中编写需要使用的方法或函数,然后将其打包成.jar文件。将Java类加载到Oracle数据库中:将.jar文件上传到Or
PL/SQL怎么与Java集成使用
2024-05-07

PL/SQL中的动态SQL技术怎么应用

在PL/SQL中,动态SQL技术可以通过使用EXECUTE IMMEDIATE语句来实现。动态SQL允许在运行时构建和执行SQL语句,而不是在编译时静态定义SQL语句。以下是一个简单的示例,演示如何在PL/SQL中使用动态SQL技术:D
PL/SQL中的动态SQL技术怎么应用
2024-05-07

编程热搜

目录