Oracle——PLSQLl入门

乌市泽哥  金牌会员 | 2024-9-24 11:59:19 | 来自手机 | 显示全部楼层 | 阅读模式
打印 上一主题 下一主题

主题 893|帖子 893|积分 2679

一、什么是PLSQL

        PL/SQL(Procedural Language/Structured Query Language)是 Oracle 数据库体系中的一种过程式编程语言,用于编写存储过程、函数、触发器、包等数据库程序单元。PL/SQL 继承了 SQL 的数据操作能力,并添加了过程性编程语言的功能,可以实现更复杂的逻辑和数据处置惩罚。
PL/SQL 具有以下特点:

  • 结构化编程: PL/SQL 支持次序、条件、循环等结构化编程控制流程,使得程序逻辑更清晰、易于明白和维护。
  • 数据范例: PL/SQL 支持多种数据范例,包罗数值、字符、日期、布尔、游标等,同时还支持用户自定义的复合数据范例。
  • 非常处置惩罚: PL/SQL 具有强大的非常处置惩罚机制,可以捕捉并处置惩罚运行时错误,保证程序的稳定性和可靠性。
  • 模块化编程: PL/SQL 支持将代码组织为模块(存储过程、函数、触发器、包等),可以进步代码的重用性和可维护性。
  • 数据库交互: PL/SQL 可以直接与 Oracle 数据库举行交互,可以实行 SQL 查询、DML 操作,以及调用存储过程和函数。
  • 安全性: PL/SQL 代码通常在数据库服务器端实行,可以在数据库内部实现安全访问控制,保护数据的安全性。
        PL/SQL 的语法和语义与传统的过程式编程语言(如 Ada、Pascal)相似,但也包含了一些特有的 Oracle 数据库相干的语法和功能。通过 PL/SQL,开辟人员可以编写高效、灵活和可维护的数据库应用程序,实现复杂的业务逻辑和数据处置惩罚需求。
二、PLSQL入门语法

1、变量入门

  1. -- 题目: 小王在超市购买
  2. -- 苹果 5斤 6元/斤
  3. -- 香蕉 2斤 10元/斤
  4. -- 请以plsql完成 完整显示如下
  5. -- 苹果-5斤-6元/斤
  6. -- 香蕉-2斤-10元/斤
  7. -- 总金额: 50元
  8. declare
  9.     name1 varchar2(30);
  10.     name2 varchar2(30);
  11.     weight1 number;
  12.     weight2 number;
  13.     price1 number;
  14.     price2 number;
  15.     money number;
  16. begin
  17.     name1 := '苹果';
  18.     name2 := '香蕉';
  19.     weight1 := 5;
  20.     weight2 := 2;
  21.     price1 := 6;
  22.     price2 := 10;
  23.     money := weight1*price1 + weight2*price2;
  24.     DBMS_OUTPUT.PUT_LINE('苹果-'||weight1||'斤-'||price1||'元/斤');
  25.     DBMS_OUTPUT.PUT_LINE('香蕉-'||weight2||'斤-'||price2||'元/斤');
  26.     DBMS_OUTPUT.PUT_LINE('总金额:'||money||'元');
  27. end;
复制代码
2、select_into方式赋值

  1. -- 从t_area表中获取获取区域数量并显示
  2. -- 1. my_count存储区域数量
  3. -- 2. 最终展示效果如下
  4. --    区域数量: 6
  5. declare
  6.     my_count number;
  7. begin
  8.     select count(ID) into my_count from T_AREA;
  9.     DBMS_OUTPUT.PUT_LINE('区域数量:'||my_count);
  10. end;
复制代码
3、引用变量

  1. declare
  2.     -- todo 1 声明变量: v_usenum 水费字数,v_num0 上月字数,v_num1 本月字数,
  3.     --  v_price 单价,v_usenum2 使用吨数,v_money 水费金额
  4.     v_price number(10,2);
  5.     v_usenum2 number(10,2);
  6.     v_money number(10,2);
  7.     v_usenum t_account.usenum%type;
  8.     v_num0 t_account.num0%type;
  9.     v_num1 t_account.num1%type;
  10. begin
  11.     -- todo 2 单价赋值=3.45
  12.     v_price := 3.45;
  13.     -- todo 3 使用 select into 给 水费字数, 上月字数, 本月字数 赋值
  14.     select NUM0,NUM1,USENUM into v_num0,v_num1,v_usenum
  15.     from T_ACCOUNT
  16.     where MONTH='01' and OWNERUUID=1 and YEAR='2012';
  17.     -- todo 4 求吨数
  18.     v_usenum2 := round(v_usenum/1000,2);
  19.     -- todo 5 计算应付金额 = 吨数 * 单价
  20.     v_money := v_usenum2 * v_price;
  21.     -- todo 6 输出 单价 吨数 应付金额 上月字数 本月字数
  22.     DBMS_OUTPUT.PUT_LINE('单价:'||v_price||', 吨数:'||v_usenum2||', 应付金额:'||v_money);
  23. end;
复制代码
4、行变量

  1. declare
  2.     -- todo 1 声明变量: v_price 单价, v_usenum 水费字数,  v_num0 上月字数, v_num1  本月字数, v_usenum2 使用吨数, v_money 水费金额
  3.     v_price number(10,2);
  4.     v_usenum2 number(10,2);
  5.     v_money number(10,2);
  6.     v_account T_ACCOUNT%rowtype; --声明行变量类型
  7. begin
  8.     -- todo 2 单价赋值=3.45
  9.     v_price := 3.45;
  10.     -- todo 3 使用 select into 给 水费字数, 上月字数, 本月字数 赋值
  11.     select * into v_account
  12.     from T_ACCOUNT
  13.     where MONTH='01' and OWNERUUID=1 and YEAR='2012';
  14.     -- todo 4 求吨数
  15.     v_usenum2 := round(v_account.USENUM/1000,2);
  16.     -- todo 5 计算应付金额 = 吨数 * 单价
  17.     v_money := v_usenum2 * v_price;
  18.     -- todo 6 输出 单价 吨数 应付金额 上月字数 本月字数
  19.     DBMS_OUTPUT.PUT_LINE('单价:'||v_price||', 吨数:'||v_usenum2||', 应付金额:'||v_money);
  20. end;
复制代码
5、非常

  1. --异常处理
  2. -- 异常处理的语法
  3. -- exception
  4. --     when 错误类型 then
  5. --         处理异常;
  6. declare
  7.     -- 声明变量: v_price 单价, v_account 行变量, v_usenum2 使用吨数, v_money 水费金额
  8.     v_price number(10, 2);
  9.     v_account t_account%rowtype;
  10.     v_usenum2 number(10, 2);
  11.     v_money number(10, 2);
  12. begin
  13.     -- 单价赋值=3.45
  14.     v_price := 3.45;
  15.     -- 给行变量赋值
  16.     select * into v_account from T_ACCOUNT
  17.     -- 正常
  18.     where OWNERUUID=1 and YEAR=2012 and month='01';
  19.     -- 模拟异常1: 数据多了
  20.     -- where YEAR=2012;
  21.     -- 模拟异常2: 数据没找到
  22.     --  where OWNERUUID=1000;
  23.     -- 求吨数
  24.     v_usenum2 := round(v_account.USENUM/1000,2);
  25.     -- 计算应付金额 = 吨数 * 单价
  26.     v_money := v_price * v_usenum2;
  27.     -- 输出 单价 吨数 应付金额 上月字数 本月字数
  28.     DBMS_OUTPUT.PUT_LINE('单价: ' || v_price || ', 吨数: ' || v_usenum2 || ', 应付金额: ' || v_money);
  29.     -- 处理异常 exception
  30.     exception
  31.     -- 处理 未找到数据异常 no_data_found when then
  32.         when no_data_found then
  33.             DBMS_OUTPUT.PUT_LINE('未找到数据!!!');
  34.     -- 处理 查询条件有误, 返回多条数据异常 too_many_rows
  35.         when too_many_rows then
  36.             DBMS_OUTPUT.PUT_LINE('数据太多了!!!');
  37.     -- 其他异常 others
  38.     --  sqlcode错误代码
  39.     --  sqlerrm错误信息
  40.         when others then
  41.             DBMS_OUTPUT.PUT_LINE('错误类型:'||sqlcode||sqlerrm);
  42. end;
复制代码
6、if判定

  1. --业务: 设置三个等级的水费
  2. --  5 吨以下           2.45  元/吨,
  3. --  5 吨到 10 吨部分   3.45  元/吨,
  4. --  超过 10 吨部分     4.45  元/吨,
  5. --  根据使用水费的量来计算阶梯水费
  6. declare
  7.     v_price1 number(5,2);
  8.     v_price2 number(5,2);
  9.     v_price3 number(5,2);
  10.     v_account T_ACCOUNT%rowtype;
  11.     v_usenum2 number(5,2);
  12.     v_money number(5,2);
  13. begin
  14.     v_price1 := 2.45;
  15.     v_price2 := 3.45;
  16.     v_price3 := 4.45;
  17.     select * into v_account from t_account
  18.     where owneruuid=1 and year='2012' and month='01';
  19.     v_usenum2 :=round(v_account.usenum/1000,2);
  20.     if v_usenum2>=0 and v_usenum2 <= 5 then
  21.         v_money := v_usenum2 * v_price1;
  22.     elsif v_usenum2 >5 and v_usenum2 <= 10 then
  23.         v_money := 5 * v_price1 + (v_usenum2-5) * v_price2;
  24.     else
  25.         v_money := 5 * v_price1 + (5) * v_price2 + (v_usenum2-10) * v_price3;
  26.     end if;
  27.     DBMS_OUTPUT.PUT_LINE('吨数:'||v_usenum2||',金额:'||v_money);
  28. end;
复制代码
7、循环

        7.1、平凡循环

  1. -- 使用 loop 输出 1 ~ 100
  2. declare
  3. -- 定义变量 v_num
  4.     v_num number;
  5. begin
  6. -- 赋值 v_num等于1
  7.     v_num := 1;
  8. -- 编写 loop 循环
  9.     loop
  10. -- 进入循环, 输出 v_num变量的值
  11.         DBMS_OUTPUT.PUT_LINE('数字:'||v_num);
  12. -- 变量 v_num 加 1
  13.         v_num := v_num + 1;
  14. -- 当 exit when v_num>100时退出
  15.         exit when v_num>100;
  16.     end loop;
  17. end;
复制代码
        7.2、while循环

  1. -- 使用 while 输出 1 ~ 100
  2. declare
  3.     -- todo 1 初始化变量 v_num等于1
  4.     v_num number := 1;
  5. begin
  6.     -- todo 2 编写 while 循环, 指定继续执行条件 v_num<=100
  7.     while v_num<=100 loop
  8.         -- todo 2.1 进入循环, 输出 v_num变量的值
  9.         DBMS_OUTPUT.PUT_LINE('数值为:'||v_num);
  10.         -- todo 2.2 变量 v_num 加 1
  11.         v_num := v_num + 1;
  12.         end loop;
  13. end;
复制代码
        7.3、for循环

  1. -- 使用 for 输出 1 ~ 100
  2. declare
  3. begin
  4.     for num in 1..100 loop
  5.         DBMS_OUTPUT.PUT_LINE('数值为:'||num);
  6.     end loop;
  7. end;
  8. -- todo 9.1 练习
  9. -- 使用 for 输出 1 ~ 100之间的偶数
  10. declare
  11. begin
  12.     for num in 1..100 loop
  13.         if mod(num,2) = 0 then
  14.             DBMS_OUTPUT.PUT_LINE('数值为:'||num);
  15.             end if;
  16.         end loop;
  17. end;
复制代码
8、游标

        8.1、不带参数游标

  1. -- 价格: 2.45, 吨位: 0--5
  2. -- 价格: 3.45, 吨位: 5--10
  3. -- 价格: 4.45, 吨位: 10--
  4. declare
  5. -- todo 1 声明行变量 v_pricetable
  6.     v_pricetable T_PRICETABLE%rowtype;
  7. -- todo 2 声明游标 cur_pricetable 保存业主类型为 1 的价格表
  8.     cursor cur_pricetable is
  9.         select * from T_PRICETABLE where OWNERTYPEID=1;
  10. begin
  11. -- todo 3 打开游标
  12.     open cur_pricetable;
  13. -- todo 4 loop 循环
  14.     loop
  15. -- todo 5 fetch 游标 into 变量 提取游标到变量
  16.         fetch cur_pricetable into v_pricetable;
  17. -- todo 6 输出 价格: XX, 吨位: YY-ZZ
  18.         DBMS_OUTPUT.PUT_LINE(
  19.             '价格:'||v_pricetable.PRICE||', 吨位:'||v_pricetable.MINNUM||'--'||v_pricetable.MAXNUM
  20.             );
  21. -- todo 7 当游标到最后一行下面退出循环 exit when 游标%notfound;
  22.         exit when cur_pricetable%notfound;
  23.     end loop;
  24. -- todo 8 关闭游标
  25.     close cur_pricetable;
  26. end;
复制代码
        8.2、带参数游标

  1. --需求:打印业主类型为 (参数) 的价格表 显示如下
  2. -- 价格: 2.45, 吨位: 0--5
  3. -- 价格: 3.45, 吨位: 5--10
  4. -- 价格: 4.45, 吨位: 10--
  5. declare
  6. -- todo 1 声明行变量 v_pricetable
  7.     v_pricetable T_PRICETABLE%rowtype;
  8. -- todo 2 声明有参数的游标 cur_pricetable(变量名 类型) 保存业主类型为 1 的价格表 <cursor 游标名称 is SQL语句;>
  9.     cursor cur_pricetable(v_type number) is
  10.     select * from T_PRICETABLE where OWNERTYPEID=v_type;
  11. begin
  12. -- todo 3 打开游标(传入参数)
  13.     open cur_pricetable(1);
  14. -- todo 4 loop 循环
  15.     loop
  16. -- todo 5 fetch 游标 into 变量 提取游标到变量
  17.         fetch cur_pricetable into v_pricetable;
  18. -- todo 7 当游标到最后一行下面退出循环
  19. --  exit when 游标%notfound;
  20.         exit when cur_pricetable%notfound;
  21. -- todo 6 输出 价格: XX, 吨位: YY-ZZ
  22.         DBMS_OUTPUT.PUT_LINE(
  23.             '价格:'||v_pricetable.PRICE||', 吨位:'||v_pricetable.MINNUM||'--'||v_pricetable.MAXNUM
  24.             );
  25.     end loop;
  26. -- todo 8 关闭游标
  27.     close cur_pricetable;
  28. end;
复制代码
        8.3、for+游标

  1. --需求:使用for 打印根据参数值显示指定业主类型 的 价格表
  2. declare
  3. -- todo 1 声明带参数游标 cur_pricetable 根据参数值获取指定类型的价格表
  4.     cursor cur_pricetable(v_type number) is
  5.     select * from T_PRICETABLE where OWNERTYPEID=v_type;
  6. begin
  7. -- todo 2 使用 for 循环遍历
  8.     for i in cur_pricetable(1) loop
  9. -- todo 2.1 打印 价格: XX, 吨位: YY-ZZ
  10.         DBMS_OUTPUT.PUT_LINE('价格:'||i.PRICE||', 吨位:'||i.MINNUM||'--'||i.MAXNUM);
  11.         end loop;
  12. end;
复制代码


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

乌市泽哥

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表