PL/SQL过程化SQL语言

??PL/SQL是一种程序语言,叫做过程化SQL语言(Procedural Language/SQL)。PL/SQL是Oracle数据库对SQL语句的扩展,在普通SQL语句的使用上增加了编程语言的特点,所以PL/SQL把数据操作和查询语句组织在PL/SQL代码的过程性单元中,通过逻辑判断、循环等操作实现复杂的功能或者计算,MySQL不支持PL/SQL,但支持Navicat Premium。

??SQL可以编写程序PL,可以定义变量,可以使用语句流程(if、else、case、for、while),打印信息,处理异常等。

一、 开发窗口

PL/SQL过程化SQL语言

PL/SQL过程化SQL语言

二、 输出

??dbms_output是数据库定义的程序包,类似于Java中的类,put_line是输出信息,还有一个函数put也是输出,但是信息在缓存中不输出,当put_line时把缓存中的数据一起输出。

BEGIN
  dbms_output.put(1); -- 
  dbms_output.put(2); -- 
  -- 注掉此行代码程序不会输出内容
  dbms_output.put_line(3); -- 123
end;

三、 定义变量

declare 
  -- declare和begin中间是定义变量的地方,其他地方不能定义变量
  -- firstName是变量名,varchar是数据类型
  -- 定义变量赋初始值用 :=赋值
  firstName VARCHAR(2) :=‘张‘;

  -- 定义变量赋初始值用default赋值
  age INTEGER DEFAULT 18;

  -- 用表中的字段来定义变量,变量的数据类型和该字段保持一致
  -- 这样的好处是:字段数据类型改变时,变量不用修改,变量
  -- 的长度和精度随着字段来定义
  v_empno emp.empno%TYPE

  -- 用户emp表的记录作为类型定义变量
  -- 通过变量可以获取变量中的各字段信息
  v_emp%ROWTYPE
  
BEGIN
  -- 赋值不能用等号,等号用来判断,:=才是赋值
  firstName:=‘张‘;
  -- 两个内容拼接时用||
  dbms_output.put_line(firstName||‘-‘||age); -- 张-18
end;

四、 if语句

declare 
  -- Local variables here
  i integer;
begin
  -- if判断要写then和end if,某个变量是否为null不能用等号,要用is
  -- 不等于要用is not
  IF i IS NULL THEN
    dbms_output.put_line(‘i is null‘);-- i is null
  END IF;
end;

else if的使用:

declare 
  -- Local variables here
  i integer;
begin
  i:=65;
  IF i >= 90 THEN
    dbms_output.put_line(‘优秀‘);
  ELSIF i >= 80 THEN
    -- elsif是else if的缩写
    dbms_output.put_line(‘良好‘);
  ELSIF i >= 60 THEN
    dbms_output.put_line(‘及格‘);  -- 及格
  ELSE
    dbms_output.put_line(‘不及格‘);  
  END IF;  
end;

五、 for循环

例题:求100以内的质数(用到了嵌套循环)

declare 
  -- i和j是循环变量
  i integer;
  j INTEGER;
  flag INTEGER;-- 是否质数的标记
  prime CONSTANT INTEGER :=1;-- constant定义常量,表示是质数
BEGIN
  -- 质数是大于1的自然数 
  FOR i IN 2..100 LOOP
    flag:=prime;-- 初始值为prime,默认是质数
    -- 质数是除1和自身外,不能被其它数整除,排除1后,其它一但能整除就不是质数
    -- in是关键字,说明变量是在此范围内
    FOR j IN 2..sqrt(i) LOOP
      -- MOD是数学函数,求余 
      IF MOD(i,j)=0 THEN
        flag := 0;
        -- 如果取余为0,证明能整除,不是质数,exit跳出循环
        EXIT;
      END IF;
    END LOOP;
    IF flag = prime THEN
      dbms_output.put_line(i||‘是质数‘);
    END IF;
  END LOOP; 
end;

六、 while循环

declare 
  -- Local variables here
  i INTEGER DEFAULT 0;
  random_num INTEGER; 
BEGIN
  -- DBMS_RANDOM程序包可以生成随机数,这个包中的value函数
  -- 可以生成[0-1)之间的小数
  random_num:=DBMS_RANDOM.value()*10;
  -- while加循环条件
  WHILE i < random_num LOOP
    dbms_output.put_line(i);
    i:=i+1; 
  END LOOP; 
end;

七、 loop...end loop

loop…end loop格式的循环条件是在循环体中进行判断,当达到某一条件时退出循环。

declare 
  -- Local variables here
  i INTEGER DEFAULT 0;
  random_num INTEGER; 
BEGIN
  -- DBMS_RANDOM程序包可以生成随机数,这个包中的value函数
  -- 可以生成[0-1)之间的小数
  random_num:=DBMS_RANDOM.value()*10;
  LOOP
    IF i > random_num THEN
      EXIT;-- 退出循环
    END IF;
    dbms_output.put_line(i);
    i:= i +1;
  END LOOP;  
end;

八、 异常处理

declare 
  -- Local variables here
  i integer;
  myex EXCEPTION;-- 定义异常对象
   PRAGMA EXCEPTION_INIT(myex,-20000);-- 给异常对象赋值错误号标识
   myex2 EXCEPTION;
begin
 dbms_output.put_line(1);
 RAISE myex;-- 抛出异常
 -- 定义加抛出,指定错误号和错误提示信息
 --raise_application_error (-20000/*-20000——-20999*/, ‘自定义错误信息‘);
 EXCEPTION
   WHEN myex OR myex2 THEN -- 处理多个异常
      dbms_output.put_line(‘eore‘);
   --WHEN myex THEN myex只能处理一次,和上面的二选一
   --  dbms_output.put_line(2||‘-‘||SQLCODE||‘-‘||SQLERRM);
   WHEN OTHERS THEN -- 其他未处理的异常打印错误号和错误信息
       dbms_output.put_line(3||‘-‘||SQLCODE||‘-‘||SQLERRM);
end;

PL/SQL过程化SQL语言

上一篇:mysql数据库主从同步I/O问题修复


下一篇:Mysql分库分表