zoukankan      html  css  js  c++  java
  • Oracle基础(四)pl/sql

           PL/SQL也是一种程序语言,叫做过程化SQL语言(Procedural Language/SQL)。

    PL/SQL是Oracle数据库对SQL语句的扩展。在普通SQL语句的使用上添加了编程语言的特点,所以PL/SQL就是把数据操作和查询语句组织在PL/SQL代码的过程性单元中,通过逻辑推断、循环等操作实现复杂的功能或者计算的程序语言。

            总结下来就是sql语言的扩展,sql语句+变量和常量+条件语句+循环语句+例外处理各种错误!

            PL/SQL的作用

          使用PL/SQL能够编写具有非常多高级功能的程序。尽管通过多个SQL语句可能也能实现相同的功能,可是相比而言,PL/SQL具有更为明显的一些长处:

           ⒈可以使一组SQL语句的功能更具模块化程序特点。

           ⒉採用了过程性语言控制程序的结构。

           ⒊可以对程序中的错误进行自己主动处理,使程序可以在遇到错误的时候不会被中断。

           ⒋具有较好的可移植性。能够移植到还有一个Oracle数据库中;

           ⒌集成在数据库中,调用更快;

           ⒍降低了网络的交互。有助于提高程序性能。

            通过多条SQL语句实现功能时。每条语句都须要在client和服务端传递,并且每条语句的运行结果也须要在网络中进行交互。占用了大量的网络带宽。消耗了大量网络传递的时间,而在网络中传输的那些结果,往往都是中间结果。而不是我们所关心的。

           而使用PL/SQL程序是由于程序代码存储在数据库中,程序的分析和运行全然在数据库内部进行,用户所须要做的就是在client发出调用PL/SQL的运行命令,数据库接收到运行命令后。在数据库内部完毕整个PL/SQL程序的运行,并将终于的运行结果返馈给用户。在整个过程中网络里仅仅传输了非常少的数据,降低了网络传输占用的时间,所以总体程序的运行性能会有明显的提高。

    pl /sql基础

        接下来主要介绍下用pl/sql编写的在块的基础上编写过程,函数,包以及pl/sql进阶的三大控制语句下篇介绍 分页的存储过程。

        块结构示意图

             Pl/sql块由定义,运行。例外处理部分组成

             Declear 定义常量,变。游标,例外。复杂数据类型

             Begin 运行

             Exception 例外处理

             End;

              比如:

            Declare

         V_ename varchar2(5);定义字符串变量

         V_sal number(7,2);

         Begin

    Select ename ,sal into v_ename ,v_sal from emp where empno=&no;

             Dbms_output.put_line(‘雇员名:’||v_ename ||’工资:’|| v_sal);

        --异常处理

          Exception

           When no_date_found thendbms_output.put_line(‘朋友,输入错误’)

           End

             使用Sqlplus开发工具:Pl/sql develper独立工具

    (一)1、创建一个简单的表

         Createtable mytest(name varchar2(30),passwd varchar2(30));

    2、创建过程

        Create or replace procedure sp_prolis

        Begin

            --运行部分

        Insert into mytest values(韩顺平’,‘m1234);

        End;

    3、调用

        Exec过程名(參数)

        Call过程名(參数)


        无返回值的存储过程

        Create procedure sp_pro3spnamevarchar2,newSal numberis

        Begin

         --运行部分,依据username去改动工资

        Updateemp set sal= newsal where ename=spName;

        End;

    (二)  函数

            Createfunction sp_fun2(spName varchar2) return

            Number isyearSal number(7,2);

             Begin

            --运行部分

              Selectsal*12+nvl(comm,0)*12 into yearSal from emp where ename =spName;

             ReturnyearSal;

             End;

        调用函数

             Sql varincome number

             call annual_income(scott) from into:income;

             Sql>printincome

              Java程序中通过rs.getInt1)得到返回的结果

               Sql>showerorr--显示错误

    (三)包

             --创建包

             --创建一个包sp_package

              __声明了该包里有一个过程update_sal

               ---声明一个函数

              Createpackage sp_packge is

              procedureupdate_sal(name varchar2,newsal number);

              Functionannual_income(name varchar2) reture number;

              End ;

              创建包体

              Createpackage body sp_package is

                      Procedure

                     Function

                     Begin

            Select

             Return

                     End

              End

       调用

            Sql>call sp_package.functionprocedule

    Pl/sql进阶

       三种条件分支

           If then

            Create or replace procedure  sp_pro6(spName varchar2) is

            --定义

            v_sal smp.sal%type;

            Begin

            --运行

                    Select sal into v_sal from empwhere ename=spName;

        --推断

                    If v_sal<2000 then

           Update empset sal=sal-sal*10% where ename =spName;

           End if;

        End;

        调用

              Sql> execsp_pro6('scott') scott为username

     二重条件分支 if- then -else

             Create or replace proceduresp_pro6(spName varchar2) is

              -   -定义

             v_sal smp.sal%type;

            Begin

             --运行

                 Select sal into v_sal from empwhere ename=spName;

        --推断

                   If v_com<>0 then

              Update empset comm=comm+100 where ename =spName;

           Else

              Update empset comm=comm+200 where ename=spName;

          End if;

        End;

        调用

              Sql> execsp_pro6('scott') scott为username

      多重条件分支 if-then-elseif --else

        假设该员工的职位是president,就给他的工资添加1000,假设该员工的职位是manager就给他的工资添加500,其它职位的员工添加200

       Create orreplace procedure sp_pro6(spNo number) is

        --定义

          v_job emp.job%type;

      Begin

      --运行

              Selectjob into v_job from emp where empno=spNo;

             If  v_job='president' then

                     Update emp set sal=sal + 1000 where empno=spNo;

        Elseif  v_job='manager ' then

           Update empset sal=sal+500 where empno-spNo;

        Else

           Update empset sal =sal+200 where empno=spNo;

        End if ;

        End;

         调用  sql>Execsp_pro6(7839)

        循环语句

      Loop End loop至少运行一次。先循环再推断

           create or replace proceduresp_pro6 (spName varchar2) is

          --定义      表示赋值

          v_num number:=1;

         Begin

          Loop

              insert  into users values (v_numspName);

             --推断是否要退出循环

              exit when v_num=10;

        --自增

              v_num :=v_num+1

          End loop;

       End;

      循环语句  while循环

        先推断后循环

            create or replace proceduresp_pro6 (spName varchar2) is

            --定义      表示赋值

           v_num number:=11;

           Begin

           While v_num <=20 loop

       --运行

              insert  into users values (v_numspName);

        --自增

              v_num :=v_num+1

            End loop;

        End;

         for循环

        Begin

    For I inreverse 1….10  loop

      Insert into users values(I,'顺平');

    End loop;

     End;不建议使用

    顺序控制语句

         Goto建议不用 循环嵌套不要超过三层

       用于跳转到特定标号去运行  语句,注意用于使用go to添加复杂性,可读性差

         Declare

        i int :=1;

    Begin

    Loop

              dbms_output.put_line('输出i='   || i);

               if I =10 then

               got end_loop;

               end if;

               i:=i+1;

               end loop;

        <<end_loop>>

        --<<>>goto标号

        Dbms_output.put_line('循环结束')

      End;

      Null

        不会运行不论什么操作,将控制传递下一句

        提高可读性

           Declare

          v_salemp.sal%type;

          v_enameemp.ename%type;

      Begin

          Select ename,sal into v_ename,v_val

          From empwhere empno=%no;

          If  v_sal<3000 then

                Update empsel comm =sal*0.1 where ename=v_ename;

          Else

          Null;

          End if ;

     End;

     pl/sql出于sql,所以非常大一部分沿袭了sql,之前sql server的学习中没有这么深入的接触。这次在pl/sql里面学到的东西很多其它。学习就这样从不同的角度看问题,然后全面了解它。

  • 相关阅读:
    Add Binary
    Unique Paths II
    APIcloud  SuperWebView
    微信小程序----checkbox组件
    PHP 使用redis  实现队列
    让PHP程序永远在后台运行
    微信小程序----switch组件(开关选择器)
    微信小程序----slider组件
    微信小程序----progress组件
    linux新的数据盘  分区,格式化后  挂载到目录
  • 原文地址:https://www.cnblogs.com/zhchoutai/p/6898402.html
Copyright © 2011-2022 走看看