zoukankan      html  css  js  c++  java
  • PL/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),打印信息,处理异常等。

    一、 开发窗口

    二、 输出

      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;
    
  • 相关阅读:
    分治fft
    DSU on tree
    最小矩形覆盖
    用gallery展示图片,实现中间图片稍大,两边较小的效果
    动态刷新listview中的数据
    比较两个文件是否一样
    安卓巴士Android开发神贴整理
    Failed to register input channel. Check logs for details.
    解决scrollview嵌套ImageView时,出现除顶部和底部黑块的问题
    获取系统图片,并放入ImageList
  • 原文地址:https://www.cnblogs.com/zbh355376/p/14326757.html
Copyright © 2011-2022 走看看