首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Oracle11g全新讲解之PLSQL编程

Oracle11g全新讲解之PLSQL编程

作者头像
用户4919348
发布于 2023-04-28 07:04:14
发布于 2023-04-28 07:04:14
78800
代码可运行
举报
文章被收录于专栏:波波烤鸭波波烤鸭
运行总次数:0
代码可运行
一、PLSQL编程

  是过程语言(Procedural Language)与结构化查询语言(SQL)结合而成的编程语言.通过增加变量、控制语句,使我们可以写一些逻辑更加复杂的数据库操作.

语法结构

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
declare
	--声明变量  变量名称 v_ 开头,规范
begin
   --执行具体的语句
   --异常处理
end;

注意:

  1. 赋值通过’:='完成
  2. begin和end之间必须有一行可执行的代码
  3. end之后必须跟上’;’
  4. 如果没有需要声明的变量declare可以省略掉
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
declare
    v_hello varchar(20);
begin
    v_hello := 'Hello Oracle';
    dbms_output.put_line(v_hello);
end;

begin
   dbms_output.put_line('hello');
end;

dbms_output不输出的问题。执行如下命令即可 set serveroutput on;

1. dbms_output用法

  dbms_output包主要用于调试pl/sql程序,或者在sql*plus命令中显示信息(displaying message)和报表,譬如我们可以写一个简单的匿名pl/sql程序块,而该块出于某种目的使用dbms_output包来显示一些信息。

  1. enable:在serveroutput on的情况下,用来使dbms_output生效(默认即打开)
  2. disable:在serveroutput on的情况下,用来使dbms_output失效
  3. put:将内容写到内存,等到put_line时一起输出
  4. put_line:不用多说了,输出字符
  5. new_line:作为一行的结束,可以理解为写入buffer时的换行符
  6. get_line(value, index):获取缓冲区的单行信息
  7. get_lines(array, index):以数组形式来获取缓冲区的多行信息
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
begin
   dbms_output.put('a1');
   dbms_output.put('b2');
   dbms_output.new_line(); -- 输出缓存中的信息,新起一行
   dbms_output.put_line('aaaaa'); -- 会输出缓存中的信息和当前的信息,不会换行
end;

2.赋值操作

2.1 :=

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
-- 定义两个变量 v_a,v_b 计算和是多少
declare
    v_a number(3); --- 声明变量
    v_b number(3) :=20 ; -- 声明变量同时赋值
    v_num number(3);
    v_f constant varchar(20) :='我是常量';
begin
   -- v_f := 'aaa'; -- 常量不能够被修改
    v_a := 30;
    v_num := v_a + v_b;
    dbms_output.put_line(v_a||'+'|| v_b ||'='||v_num); -- || 字符串拼接我们通过 || 来实现
end;

2.2 into

  into我们在执行SQL操作的时候,需要把查询的字段信息赋值给变量。那么这时我们就可以通过into 关键字来实现。如果有多个字段要赋值。我们只需要在into的左右两侧建立好对应关系即可。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
declare
   v_name varchar2(30);
   v_sex varchar2(3);
   v_dept varchar2(10);
begin
   select name,sex,department into v_name,v_sex,v_dept from student where id = 901;
   dbms_output.put_line(v_name||'-'||v_sex||'-'||v_dept);
end;


-- 定义两个变量 v_a,v_b 计算和是多少
declare
    v_a number(3) :=&请输入a; --- 声明变量
    v_b number(3) :=&请输入b; -- 声明变量同时赋值
    v_num number(3);
begin
    v_num := v_a + v_b;
    dbms_output.put_line(v_a||'+'|| v_b ||'='||v_num); -- || 字符串拼接我们通过 || 来实现
end;

2.3 属性类型

  1. %type:变量和字段类型的绑定
  2. %rowtype:表结构中的一条记录的绑定
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
-- 变量的类型如果和字段的类型不一致怎么办?
-- 属性类型
declare
   v_name student.name%type;
   v_sex student.sex%type;
   v_dept student.department%type;
begin
   select name,sex,department into v_name,v_sex,v_dept from student where id = 901;
   dbms_output.put_line(v_name||'-'||v_sex||'-'||v_dept);
end;
-- 表结构中有很多个字段。我们对于的就需要声明多少个变量,很繁琐。
declare
   v_row student%rowtype;
begin
   select * into v_row from student where id = 901;
   dbms_output.put_line(v_row.id||'-'||v_row.name||'-'||v_row.sex);
end;

3.控制语句

3.1 分支语句

3.1.1 if语句

  if语句的作用是控制程序的执行顺序。范围控制

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
declare
   v_age number(3) := &请输入年龄;
begin 
   dbms_output.put_line('v_age='||v_age);
   if v_age = 18 then
      dbms_output.put_line('成年小伙');
   end if;
   dbms_output.put_line('-------');
   if v_age = 18 then
      dbms_output.put_line('成年小伙');
      else
      dbms_output.put_line('未知...');
   end if;
   dbms_output.put_line('-------');
   if v_age = 18 then
      dbms_output.put_line('成年小伙');
      elsif v_age < 18 then
      dbms_output.put_line('小孩子');
      elsif v_age > 18 then
      dbms_output.put_line('成年人');
      else
      dbms_output.put_line('未知...');
   end if;
end;
3.1.2 case语句

  case语句是一个非常强大的关键字。既可以实现类似于Java中的switch语句的作用。也可以像if语句一样来实现范围的处理。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
-- case 语句
declare
   v_age number(3) := &输入年龄;
begin
   case
     when v_age < 18 then
      dbms_output.put_line('小朋友');
      when v_age > 18 then 
      dbms_output.put_line('成年人');
      else
      dbms_output.put_line('刚好成年');
   end case;
end;
-- case 语句可以实现类似于Java中的switch语句。在 case 和when之间声明变量就可以
-- 如果是在when 和 then 之间指定条件那么和if语句是类似的
declare
   v_age number(3) := &输入年龄;
begin
   case v_age
     when 18 then
      dbms_output.put_line('18');
      when 19 then 
      dbms_output.put_line('19');
      else
      dbms_output.put_line('未知');
   end case;
end;

3.2 循环语句

3.2.1 无限循环

  loop循环可以通过exit来指定条件跳出循环。如果不指定那么就是无限循环

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
-- 输出1~10
declare
  v_i number(3) := 1;
begin
  loop
     dbms_output.put_line(v_i);
     exit when v_i >= 10; -- 退出循环
     v_i := v_i + 1;
  end loop;
end;
3.2.2 有条件循环

通过while来指定循环的条件

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
declare
   v_i number(3) := 1;
begin
   while v_i <= 10 loop
      dbms_output.put_line(v_i);
      -- 修改变量
      v_i := v_i + 1;
   end loop;
end;
3.2.3 for循环
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
--for循环
begin
   for i in 1..10 loop
    dbms_output.put_line(i);
   end loop;
end;
select * from student;
begin
  for cur_row in (select id,name,sex,department  from student) loop
     dbms_output.put_line(cur_row.id||'-'|| cur_row.name ||'-' || cur_row.sex || '-' || cur_row.department);
  end loop;
end;

3.2.4 goto

顺序控制用于按顺序执行语句,goto关键字会跳转到我们指定的位置开始自上而下执行。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
-- goto
declare
   v1 number(3) := &请输入v1的值;
begin
   if v1 > 10 then
        goto c1;
   elsif v1 = 10 then 
      goto c2; 
   else
      dbms_output.put_line('其他');
   end if;
        dbms_output.put_line('666');
   <<c1>>
   dbms_output.put_line('大于10');
   <<c2>>
   dbms_output.put_line('等于10');
   
   dbms_output.put_line('----1----');
   dbms_output.put_line('----2----');
end;

4.动态SQL语句

  动态 SQL 是指在PL/SQL程序执行时生成的SQL 语句。

语法结构为:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
EXECUTE IMMEDIATE dynamic_sql_string
      [INTO  define_variable_list]
      [USING bind_argument_list];

案例

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
-- 可以根据名字或者性别来查询学生的信息
declare
    v_name student.name%type := '&请输入姓名';
    v_sex student.sex%type :='&请输入性别';
    v_sql varchar2(200);
    v_row student%rowtype;
begin
    v_sql := 'select * from student where 1=1 ';
    if v_name is not null then
        v_sql := v_sql || ' and name like ''%'||v_name||'%''' ;
    end if;
  
    if v_sex is not null then
       v_sql := v_sql || ' and sex = '''|| v_sex||'''' ;
    end if;
    execute immediate v_sql into v_row ;
  
  
    dbms_output.put_line(v_row.name||'---'||v_row.sex||'---'||v_row.department);
end;

如果查询的结果不存在或者返回的记录过多那么都会爆出异常信息

5.异常语句

在运行程序时出现的错误叫做异常 发生异常后,语句将停止执行,控制权转移到PL/SQL 块的异常处理部分 异常有两种类型

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

处理系统预定义异常:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
-- 异常的应用
-- 系统预定义异常: 
-- too_many_rows 多行数据
-- no_data_found 找不到
-- others 其他异常
declare
   v_name student.name%type;
   
begin
   select name into v_name from student where id = 900 ;
   dbms_output.put_line(v_name);
   
   -- 异常语句块
   exception
       when too_many_rows then
        dbms_output.put_line('返回太多行');
       when no_data_found then
        dbms_output.put_line('找不到数据');
       when others then
        dbms_output.put_line('其他错误');
end;

自定义异常:

步骤:

  1. 需要显示的声明自定义的异常
  2. 在业务逻辑代码中通过raise关键字抛出自定义异常
  3. 我们需要在异步部分来声明自定义异常满足条件的处理方案
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
-- 自定义异常
declare
   myException exception; -- 声明异常
   v_name varchar2(30) := '张三1';
begin
   if v_name not in ('张三','李四','王五') then
      -- 满足条件就抛出异常
      raise myException;
    else
      dbms_output.put_line('---------------------');
   end if;
    dbms_output.put_line('---------66666------------');
   
   exception
      when myException then
        dbms_output.put_line('---------触发了自定义异常------------');
      when others then
       dbms_output.put_line('---------其他异常------------');
end;
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2023-04-20,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
蔚来7年老将离职,裁员之火烧到造车新势力
---- 新智元报道   编辑:袁榭 桃子 【新智元导读】裁员降成本之火,现在蔓延到了造车新势力?小鹏据说已裁员两轮,理想传闻中也要开始,蔚来连高管都在跳槽。 造车新势力日子不好过了吗? 前段时间,互联网大厂用裁员「大镰刀」收割了一茬又一茬高薪梦想。 如今,裁员之火烧到了新能源造车领域。 造车新势力裁员:小鹏已裁员两轮,理想也跟进? 不提旋起旋灭、PPT造车的其他创业企业,造车新势力中的御三家「理小蔚」,2022年也要开始裁员了 近日,有网友在职场社交软件脉脉上爆料:理想汽车将在2022年第二季度裁
新智元
2022/04/08
4400
蔚来7年老将离职,裁员之火烧到造车新势力
威马汽车「冲刺」港交所:曾经的行业领头羊,还有机会追上「蔚小理」吗?
销量寒冬之下,活下去最重要。 作者 | 来自镁客星球的家衡 进入2022年,二线新势力们开始铆足劲推进港股IPO计划,威马也不例外。 6月1日,威马控股有限公司(以下简称 " 威马 ")正式向港交所递交招股说明书,拟在主板挂牌上市。如果一切顺利,威马将成为“蔚小理”之后,又一家登陆港股的新势力车企。 但仔细阅读这份招股书,却可以发现其中的数据并不“美丽”:自2018年9月推出首款车型以来,威马三年来仅卖出8.3万辆,并且三年里累计亏损高达174.35亿元。 如果再算上过去一年里车辆频繁自燃、锁电、科创板
镁客网
2022/06/02
2890
威马汽车「冲刺」港交所:曾经的行业领头羊,还有机会追上「蔚小理」吗?
蔚来、理想、小鹏终有一战
作为一个被外界一致认定是未来趋势的行业,新能源汽车前几年在市场中丝毫没有一点“明日之子”的样子,反倒是众望所归的眼神中坐上了过山车,尝尽了起起落落。
刘旷
2020/11/23
3100
蔚来、理想、小鹏终有一战
「蔚小理」告别春天
新能源汽车江湖正走向大乱斗。 作者 | 来自镁客星球的王饱饱 2022的3月份已经走到了尽头,意味着今年的春天也逐渐进入了尾声。 在这个多灾多难的第一季度,作为新能源造车头部势力的“蔚小理”陆续发布了2021年的全年财报。交付数据上小鹏“逆袭”坐到了第一的位置,但实际上并未和蔚来、理想拉开差距,且三者均离“十万辆大关”差了一口气;研发投入上蔚来仍高居首位,理想处于尾席;盈利虽然仍是个难题,但理想已经距离“上岸”不甚遥远。 整体看来,“蔚小理”在这一年都有属于自己的高光一面,也都没有彻底从亏损泥潭中解脱出来。
镁客网
2022/04/01
2910
「蔚小理」告别春天
想把G6做成爆款,小鹏比抛弃用户求生存的蔚来更着急?
根据乘联会最新数据,在1-5月新能源厂商零售销量排行榜中,前五名除特斯拉中国,就是背靠传统汽车生意和渠道的比亚迪、广汽埃安、上汽通用五菱和吉利。
用户8049510
2023/06/20
2150
“蔚小理”都有七寸
经过这两年的大浪淘沙,多家新能源车企已经被淘汰出局,存活下来的蔚来、小鹏、理想等造车新势力则日渐壮大,并凭借“硬科技”以及“软实力”成功跻身行业前列,而在这些头部新能源车企之间也迎来了新一轮的全面竞争。
金融外参
2022/01/11
2380
事故频出,缺芯少魂!新能源汽车又双叒叕出事了:这次是蔚来
“【报告下载】后台回复关键词“数据智能”可免费下载数据猿最新发布的完整高清版《2021中国数据智能产业发展报告》
数据猿
2021/06/08
3930
蔚来、小鹏过冬术:昔日死敌,今日亲兄弟
《蔚来李斌,2019年最惨的人》刷爆朋友圈之际,小鹏汽车创始人何小鹏在微博上对李斌发出如下鼓励和感概。
刘旷
2019/12/27
4950
蔚来、小鹏过冬术:昔日死敌,今日亲兄弟
蔚来汽车的换电革命
从蔚来市值不断上涨,到二季度财报中的毛利转正,蔚来终于慢慢从低谷中走出。而近日蔚来又有新动作,公布其BaaS(Battery as a Service,即电池租用服务)正式商用,提供车电分离、电池租赁、可充可换可升级的服务。
刘旷
2020/08/26
5120
蔚来汽车的换电革命
理想被IPD送进ICU?
学华为者生,似华为者死。 本文转载自公众号:字母榜(ID:wujicaijing),作者:于师兄;编辑:王靖 风水轮流转,理想的好日子似乎要暂告一段落了。 2019年年底,蔚来创始人李斌去香港出差,恰好小鹏汽车董事长何小鹏也在香港,两个掉进造车大坑的男人相约在海边,一直聊到凌晨。期间李斌说缺钱啊,融不到钱,蔚来像是躺在ICU里,随时可能挂掉。何小鹏说兄弟你别急,我就在ICU门口坐着,说不定下一个挂的就是我。 蔚来和小鹏汽车确实是难兄难弟,要么缺钱,要么缺销量。但与蔚来和小鹏并称造车三杰的理想汽车,却在这两年
镁客网
2022/09/14
3440
理想被IPD送进ICU?
IPO背后,理想汽车的无奈与迫切
北京时间7月30日晚间,理想汽车以股票代码“LI”提前一天登陆纽约证券交易所,成为国内第二家在美国上市的造车新势力,也是第三家上市的电动汽车企业。
镁客网
2020/08/02
6440
表面风光的造车新势力,其实个个缺钱
随着各地企业陆续复工复产,电动车企业们也恢复到往日的生产节奏中。不过他们并没有带来新的车型或是新的销售策略,而是和疫情发生之前一样,依然在为钱而奔走着。
罗超频道
2020/03/11
4570
后厂村:蔚来汽车二次上市,与钱无关?
2022年,或许是新势力车企们最具“历史性意义”的一年,或许也是新能源汽车用户终将难忘的一年。随着全球化的智能电动汽车品牌蔚来在3月10日登陆港交所实现二次上市,中国新造车势力三驾马车——蔚来、小鹏、理想正式集合港股市场,均实现美国、中国香港两地上市,这也说明新能源汽车产业的竞争白热化的时代已经到来。
后厂村
2022/03/19
3180
后厂村:蔚来汽车二次上市,与钱无关?
亮眼财报之下,小鹏汽车们迎新大考
最近,关于“基金又跌了”的讨论在网络上不绝于耳,各种段子、金句、表情包频出,很多年轻人抱着实现财富自由的想法入局,却每天只能看着绿油油的屏幕干着急。不少热门板块都出现了不小的下跌,其中新能源汽车就是具有代表性的一个领域。
刘旷
2021/03/17
2860
亮眼财报之下,小鹏汽车们迎新大考
蔚来「人到中年」
纵观2021年蔚来财报,虽仍有作为,但疲态尽显。 作者 | 来自镁客星球的王饱饱 久在江湖飘,脸面最重要。 进入三月份,受到供应链等因素的等多重压力,中国新能源汽车市场迎来2022年的第一波涨价潮。 镁客网注意到,包括特斯拉、比亚迪、理想、小鹏、零跑和哪吒等一众知名、不知名,甚至极少出现在大众视野中的新能源车企,都已经开始了不同幅度的涨价。不过,作为造车新势力中“老大哥”地位的蔚来,却在这波涨价潮来临时,显出了一股豪气。 蔚来表示,“价格稳定对用户利益对市场都有好处,短期我们没有涨价的打算。目前国际原材料价
镁客网
2022/03/28
3720
蔚来能否挺过生存关键期?
如果单从销量表现来看,以蔚小理打头的新势力,已经转变为理小蔚,尤其是蔚来,作为曾经的新势力代表,似乎已经开始进入增长瓶颈期,而且面临一堆麻烦问题。
用户8049510
2023/06/07
2310
新能源车又迎洗牌年:蔚来向左、埃安向右
油价上涨和电车涨价的消息接连传来,让不少车主陷入了两难境地:开油车有钱包焦虑,开电车有里程焦虑。虽然车主们百般纠结,但电车市场依旧形势大好,新能源汽车成为“市场宠儿”已是不争的事实了。
用户6132544
2022/04/20
2730
蔚来人车试验,一车两命陨落!
---- 新智元报道   编辑:桃子 如願 【新智元导读】谁知「速度与激情」的惊险一幕竟在上海上演。6月22日,一辆蔚来测试车突然冲出上海总部大楼,车顶直击地面,2名试驾员抢救无效死亡。 近日,上海上演了「速度与激情」中令人惊悚的一幕。 一辆蔚来测试车从上海总部大楼一冲而出,车顶直击地面。 现场,2名试驾员抢救无效死亡。 一时间,蔚来汽车坠楼冲上微博知乎热搜。 网友纷纷表示,这哪里是在搞开发,简直就是在玩命... 随着事件的发酵,蔚来官方回应,初步确认是一场意外,与车无关。 那么,当时事发现场是
新智元
2022/06/27
2440
蔚来人车试验,一车两命陨落!
迈入第三次创业时代,小康股份一路“爬坡过坎”
如果要在大A股汽车板块中挑出一只牛股或者妖股,很多人会想到“小康股份”。即便是没有听过这个名字,那么它旗下的赛力斯问界M5,应该多少都有耳闻。
用户2908108
2022/09/02
2930
迈入第三次创业时代,小康股份一路“爬坡过坎”
测试车坠楼造成两死,蔚来回应:这是一起(非车辆原因导致的)意外事故
机器之心报道 编辑:shanshan 6 月 22 日 17 时 20 分左右,一辆蔚来测试车辆从上海创新港停车楼 3 层坠落,造成 2 名数字座舱测试人员罹难,其中一名为公司同事,另一名为合作伙伴员工。 6 月 23 日 20 时 33 分,蔚来官方微博就此事发布声明回应:事故发生后,公司第一时间协同公安部门启动了事故原因调查分析程序。根据对现场情况的分析可以初步确认,这是一起意外事故,与车辆本身没有关系。 首个官方回应引发一些网友争议。在被骂冷血后,蔚来官微删除了这条声明,并于 21 时 02 分重
机器之心
2022/06/27
4260
测试车坠楼造成两死,蔚来回应:这是一起(非车辆原因导致的)意外事故
推荐阅读
相关推荐
蔚来7年老将离职,裁员之火烧到造车新势力
更多 >
LV.2
这个人很懒,什么都没有留下~
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档