zoukankan      html  css  js  c++  java
  • 如何编写 PL/SQL 程序

    本文的操作选用的数据库是oracle 数据库,登陆的用户是自带的scott用户,默认密码:tiger,有不懂得可以相互讨论一下,谢谢.

    首先需要了解PL/SQL块的结构,PL/SQL块由定义部门、执行部门、例外处理部分三个部分组成:

    declare 
     /**
      *定义部分---定义常量、变量、复杂数据类型、游标、例解
      *
      */
    begin 
     /**
      * 执行部分--- PL/SQL语句和SQL语句
      *
      */ 
    exception
      /**
       *例外处理部分---处理运行错误
       *
       */ 
    end;  /*结束快标记*/  

    其中定义部分以declare(大小写都可以)开始,该部分是可选的;执行部分以begin开始,该部分是必须的;例外处理部分以exception开始,该部分也是可选的;而end则是PL/SQL块的结束标记。

    下面是一个简单的例子,演示一下:

    declare 
        v_ename varchar(20);
    begin 
         select ename into v_ename 
                  from emp 
                 where empno=&no;
          dbms_output.put_line('雇员名:'||v_ename);     
          
    exception 
         when no_data_found then 
                  dbms_output.put_line('请输入正确的雇员号!');     
    end;        


    接下来我们来看看PL/SQL块的分类:

    1.匿名块 :也就是没有名称的PL/SQL块,匿名块可以内嵌到应用程序(Pro*C++)中,也可以在交互环境(例如 SQL*Plus)中直接使用。 上面的例子就是所谓的匿名块.

    2.命名块:具有特定名称标识的PL/SQL块,在PL/SQL块begin使用<<>>加以标记。当使用嵌套块时,为了区分多级嵌套层次关系,,可以使用命名块加以区分。示例如下:

    declare 
        v_deptno number(2);
        v_dname  varchar2(10); 
    begin 
    	 <<outer>>
    	  begin 
    	  	 <<inner>>
    	  select deptno into v_deptno
    	       from emp    
    	       where lower(ename) =lower('&name');
    	  end; --<<inner>>        
    	select dname into v_dname 
    	         from dept
    	         where deptno=v_deptno;
    	  dbms_output.put_line('部门名:'||v_dname);   
    end;  --<<outer>>	  

    关于命名块,本人还有很多疑问,因为有的书上不是这样写的,运行会出错。个人理解而已,呵呵。。

    3.子程序 :包括过程、函数和包.

    3.1 过程

             过程用于执行特定操作。当建立过程时,既可以指定输入参数(IN)、也可以指定输出参数(OUT)。通过在过程中使用输入参数,可以将应用环境的数据传递到执行部分;通过使用输出参数,可以将执行部分的数据传递到应用环境。

    在SQL*Plus中可以使用create procedure 命令建立过程,在开发过程中,建议使用create or replace procedure 。示例如下:

     create or replace procedure update_sal(name varchar2,newsal number)
     is
     begin
     	  update emp set sal=newsal
     	  where lower(ename)=lower(name);
     end;	

    在SQL*Plus中调用时,可以使用exec、call命令 ,不过在PL/SQL工具的SQL窗口中时,只能使用call  .

    SQL> exec update_sal('scott',1000);
     
    PL/SQL procedure successfully completed
     
    SQL> 


     

     3.2 函数

           函数用于返回特定的数据。当建立函数时,在函数头部必须包含return 字句,而在函数体内必须包含return 语句返回数据。在SQL*Plus中,可以使用create function 命令建立函数,示例如下:

    create function annual_income(name varchar2)
     return number is
          annual_salary number(7,2);
    begin 
    	  select sal*12+nvl(comm,0) into annual_salary
    	        from emp 
    	        where lower(ename)=lower(name);
    	        return annual_salary;
    end;	

    如上例所示,函数annual_income用于返回雇员的全年收入(包括工资和奖金)。下面使用SQL*Plus绑定变量存放输出结果,示例如下:

    SQL> call annual_income('scott') into :income;
     
    Method called
    income
    ---------
    24000
     
    SQL> print income
    income
    ---------
    24000
     
    SQL> 

     关于包、触发器等等以后再补充。。

    以上存储过程和函数只是简单的介绍,要深入的了解,请参考其它的博文.

  • 相关阅读:
    windows 设置nginx开机自启动
    vue js中解决二进制转图片显示问题
    oracle 各种问题
    Nginx安装及配置详解包括windows linux 环境
    AOP-切面是如何织入到目标对象中的
    AOP-通知-笔记
    AOP-方法拦截器-笔记
    JdkDynamicAopProxy-笔记
    Joinpoint继承体系-笔记
    AOP-Pointcut-笔记
  • 原文地址:https://www.cnblogs.com/wuyida/p/6300432.html
Copyright © 2011-2022 走看看