经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 数据库/运维 » Oracle » 查看文章
oracle学习笔记(十五) PL/SQL语法结构以及使用 - Stars-one
来源:cnblogs  作者:Stars-one  时间:2019/5/27 8:46:23  对本文有异议

PL/SQL

简介

  • PL/SQL 是过程语言(Procedural Language)与结构化查询语言(SQL)结合而成的编程语言。
  • PL/SQL 是对 SQL 的扩展。
  • 支持多种数据类型,如大对象和集合类型,可使用条件和循环等控制结构。
  • 可用于创建存储过程、函数、触发器和程序包,给SQL语句的执行添加程序逻辑。

作用:
如果出现需要插入1000条数据,这些数据带有某种规律性,就可以通过PL/SQL进行增加数据的操作
优点:

  1. 支持 SQL,在 PL/SQL 中可以使用:
    • 数据操纵命令:DML,DDL(需要动态执行)
    • 事务控制命令:TCL
    • 游标控制, 下一章学习
    • SQL函数和SQL运算符
  2. 与 SQL 紧密集成,简化数据处理。
    • 支持所有 SQL 数据类型
    • 支持 NULL 值
    • 支持 %TYPE 和 %ROWTYPE
      • %TYPE: 引用字段类型,如:employee.ename%TYPE
      • %ROWTYPE:引用表的行类型, 如: employee%ROWTYPE
  3. 支持面向对象编程 (OOP)
  4. 可移植性,可运行在任何操作系统和平台上的Oralce 数据库
  5. 更佳的性能,PL/SQL 经过编译执行

常用数据类型

  • 数值
    number, numeric, decimal, float, int, integer, real
  • 字符串
    varchar,varchar2,string(PLSQL特有的)
  • 布尔类型boolean
  • 日期常用类型
    date, timestamp
  • 属性类型
    %type:引用某一个变量的类型或都是某个列名(字段)的类型。employee.ename%type;
    %rowtype:表示可存储某表行的记录类型。Employee%rowtype;

变量声明以及赋值

  1. --赋值号为 :=
  2. $变量名$ [CONSTANT] $datatype$ [NOT NULL] [:= value];--赋值
  3. $变量名$ [CONSTANT] $datatype$ [NOT NULL] [DEFAULT expr];--默认值
  4. age int;--声明一个整型变量age,
  5. age int := 18;--声明age并赋值
  6. age int default 18;--默认age18
  7. age constant int :=18;--声明整型常量age并赋值为18
  8. --声明一个与employee.ename相同类型的变量myname
  9. myname employee.ename%type;
  10. --声明一个变量,类型为表的行类型(相当于表中每条数据对应的实体类)
  11. rec_emp employee%rowtype;--employee表中的数据有多少列,rec_emp也有多少列
  12. --例子,输入员工编号,输出该员工信息
  13. declare
  14. v_empno employee.empno%type;
  15. rec_emp employee%rowtype;
  16. begin
  17. v_empno := &请输入员工编号;
  18. select * into rec_emp from employee where empno=v_empno;
  19. --使用 .列名 得到列的值
  20. dbms_output.put_line(rec_emp.empno||','
  21. ||rec_emp.ename||','
  22. ||rec_emp.sal||','
  23. ||rec_emp.job);
  24. end;
  25. /
  26. --自定义一个新的数据类型,然后再用这个去声明变量,使用的话也是 .列名
  27. type TYPE_EMP_REC is record(
  28. empno employee.empno%type,
  29. ename employee.ename%type,
  30. sal employee.sal%type,
  31. job employee.job%type
  32. );
  33. --赋值还可以通过select into语句
  34. select ename into myname from employee where empno=7879;
  35. --多个变量,注意要两边要对应
  36. select ename,sal into myname,mysal from employee where empno =7879;

基本单元框架

  1. [DECLARE
  2. --声明变量、常量、游标、自定义记录类型等。
  3. ]
  4. BEGIN
  5. --执行部分。
  6. [EXCEPTION
  7. --异常处理部分。
  8. ]
  9. END;
  10. / --立即执行

输出输入语句

输出

oracle内置有一个dbms_output对象,负责输出
dbms_output对象有两个输出方法,一个为put,另外一个外put_line
参数可以接收数值型

  1. --此方法不能立即输出,需要等待数据缓冲区满了之后或者是刷新数据缓冲区之后才会输出
  2. dbms_output.put('hello world');
  3. --下面两个任选一个即可让上面的hello world立即输出
  4. dbms_output.put_line('');
  5. dbms_output.new_line;
  6. dbms_output.put_line('hello world');--立即输出

如果是在命令行窗口的话,没有见到输出语句,需要设置开启输出

  1. set serveroutput on;

输入

  1. --&号在PL/SQL中作为一个替代变量,用于在运行中输入值。如果输入的是字符类型那把&号放在两个单引号中,
  2. --若是数字则不用单引号括起来
  3. v_ename := '&请输入姓名:';
  4. v_sal := &请输入工资;

输入输出例子

  1. declare
  2. v_name varchar2(10) := '&输入名字';
  3. v_age int := &输入年龄;
  4. begin
  5. dbms_out.put_line('我是'||v_name||'年龄为'||v_age);
  6. --使用||连接字符串
  7. end;
  8. /

判断与分支语句

if判断

  1. --if判断
  2. if 表达式 then
  3. end if

if-else判断

  1. --if-else判断
  2. if 表达式 then
  3. --代码
  4. else
  5. --代码
  6. end if

if-else if判断

  1. --if-else if判断
  2. if 表达式 then
  3. else if 表达式 then
  4. --代码
  5. else
  6. --代码
  7. end if
  8. end if

case分支语句

  1. --1.判断是否满足表达式
  2. case
  3. when 表达式 then
  4. --代码
  5. when 表达式 then
  6. --代码
  7. else
  8. --代码
  9. end case;
  10. --2.判断是否等于某个数值
  11. case
  12. when 数值 then
  13. --代码
  14. when 数值 then
  15. --代码
  16. else
  17. --代码
  18. end case;

数值不能能为字符串类型

循环语句for while loop

loop循环

  1. --无条件循环
  2. loop
  3. --代码以及初始化相关
  4. --满足条件退出当前循环
  5. IF 条件 THEN
  6. EXIT;
  7. END IF;
  8. --或者使用 EXIT WHEN 条件
  9. end loop;

while循环

  1. --有条件循环
  2. --满足条件进入循环
  3. while 条件 LOOP
  4. --初始化数值;
  5. --代码
  6. EXIT WHEN 条件; --满足条件退出循环
  7. --代码
  8. end loop;

for循环

  1. --oracle会自动创建计数器变量,也就是我们的i
  2. --除了i,也可以起其他的名字
  3. --相当于for(i=1;i<=10;i++)
  4. for i in 1..10 loop
  5. --statement;
  6. end loop;
  7. --相当于for(i=10;i>=1;i--)
  8. for i in reverse 1..10 loop
  9. --statement;
  10. end loop;
  11. -使用变量作为for循环的范围
  12. declare
  13. v_min integer default 1;
  14. v_max integer default 20;
  15. begin
  16. for i in reverse v_min..v_max loop
  17. dbms_output.put(i||',');
  18. end loop;
  19. dbms_output.new_line;
  20. end;
  21. /

循环结构练习

  1. --遍历输出某个部门的全部员工信息
  2. declare
  3. v_deptno integer := &请输入部门号;
  4. begin
  5. for emp in (select e.* from employee e where deptno=v_deptno) loop
  6. dbms_output.put_line(||emp.empno||','||emp.ename||','||emp.job||','||emp.sal);
  7. end loop;
  8. end;
  9. /
  10. --for打印99乘法表
  11. begin
  12. --如果不在rownum,可以吗?
  13. for num1 in 1..9 loop
  14. for num2 in 1..num1 loop
  15. dbms_output.put(num2||'*'||num1||'='||num1*num2||' ');
  16. end loop;
  17. dbms_output.new_line;
  18. end loop;
  19. end;
  20. /
  21. --loop打印99乘法表
  22. declare
  23. num1 int := 1;
  24. num2 int;
  25. begin
  26. loop
  27. num2 := 1;
  28. loop
  29. dbms_output.put(num2||'*'||num1||'='||num1*num2||' ');
  30. exit when num1=num2;
  31. num2 := num2+1;
  32. end loop;
  33. dbms_output.new_line;
  34. exit when num1=9;
  35. num1 := num1+1;
  36. end loop;
  37. end;
  38. /
  39. --while打印99乘法表
  40. declare
  41. num1 int := 1;
  42. num2 int;
  43. begin
  44. while num1 <= 9 loop
  45. num2 := 1;
  46. while num2 <= num1 loop
  47. dbms_output.put(num2||'*'||num1||'='||num1*num2||' ');
  48. exit when num2=num1;
  49. num2 :=num2+1;
  50. end loop;
  51. dbms_output.new_line;
  52. exit when num1=9;
  53. num1 := num1+1;
  54. end loop;
  55. end;
  56. /

原文链接:http://www.cnblogs.com/kexing/p/10926066.html

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号