zoukankan      html  css  js  c++  java
  • oracle12 pl/sql

    pl/sql块介绍 
     介绍 
      块(block)是pl/sql的基本程序单元,编写pl/sql程序实际上就是编写pl/sql块,要完成相对简单的应用功能,可能只需要编写一个pl/sql块,但是如果想要实现复杂的功能,可能需要在一个pl/sql块中嵌套其它的pl/sql块。 
    
     块结构示意图 
    pl/sql块由三个部分构成:定义部分,执行部分,例外处理部分。 
    如下所示: 
    declare 
    /*定义部分——定义常量、变量、游标、例外、复杂数据类型*/ 
    begin 
    /*执行部分——要执行的pl/sql语句和sql语句*/ 
    exception 
    /*例外处理部分——处理运行的各种错误*/ 
    end; 
    定义部分是从declare开始的,该部分是可选的; 
    执行部分是从begin开始的,该部分是必须的; 
    例外处理部分是从exception开始的,该部分是可选的。 
    可以和java编程结构做一个简单的比较。 
    复制代码
    复制代码
    pl/sql块的实例(1) 
     实例1-只包括执行部分的pl/sql块 
    Sql代码 
    1.set serveroutput on --打开输出选项   
    2.begin    
    3.    dbms_output.put_line('hello');   
    4.end;  
    
    相关说明: 
    dbms_output是oracle所提供的包(类似java的开发包,put_line是函数),该包包含一些过程,put_line就是dbms_output包的一个过程(包下面就是函数或者过程了)。 
    
    pl/sql块的实例(2) 
     实例2-包含定义部分和执行部分的pl/sql块 
    Sql代码 
    1.declare  
    2.    v_ename varchar2(5); --定义字符串变量   
    3.begin  
    4.    select ename into v_ename from emp where empno=&aa;   
    5.    dbms_output.put_line('雇员名:'||v_ename);   
    6.end;   
    7./  
    复制代码
    复制代码
      如果要把薪水也显示出来,那么执行部分就应该这么写: 
    Sql代码 
    declare  
    v_ename varchar2(5);
    v_sal number(7,2)
    select ename,sal into v_ename,v_sal from emp where empno=&aa;
    
    相关说明: 
    & 表示要接收从控制台输入的变量。看图: 
    复制代码
    复制代码
    pl/sql块的实例(3) 
     实例3-包含定义部分,执行部分和例外处理部分 
      为了避免pl/sql程序的运行错误,提高pl/sql的健壮性,应该对可能的错误进行处理,这个很有必要。 
    1.比如在实例2中,如果输入了不存在的雇员号,应当做例外处理。 
    2.有时出现异常,希望用另外的逻辑处理,[网示] 
    我们看看如何完成1的要求。 
    相关说明: 
    oracle事先预定义了一些例外,no_data_found就是找不到数据的例外。 
    Sql代码 
    1.declare  
    2.    --定义变量   
    3.    v_ename varchar2(5);   
    4.    v_sal  number(7,2);   
    5.begin  
    6.    --执行部分   
    7.    select ename,sal into v_ename,v_sal from emp where empno=&aa;   
    8.    --在控制台显示用户名   
    9.dbms_output.put_line('用户名是:'||v_ename||' 工资:'||v_sal);   
    10.    --异常处理   
    11.exception   
    12.when no_data_found then  
    13.    dbms_output.put_line('朋友,你的编号输入有误!');   
    14.end;   
    15./  
    复制代码
    复制代码
    十七:pl/sql分类 -- 过程,函数,包,触发器
    过程 
    过程用于执行特定的操作,当建立过程时,既可以指定输入参数(in),也可以指定输出参数(out), 通过在过程中使用输入参数,可以将数据传递到执行部分;通过使用输出参数,可以将执行部分的数据传递到应用环境(java程序)。在sqlplus中可以使用create procedure命令来建立过程。 
    实例如下: 
    1.请考虑编写一个过程,可以输入雇员名,新工资,可修改雇员的工资 
    2.如何调用过程有两种方法; exec  call 
    3.如何在java程序中调用一个存储过程 
    问题:如何使用过程返回值? 
    特别说明: 
    对于过程我们会在以后给大家详细具体的介绍,现在请大家先有一个概念。 
    
    1.编写一个过程:
    create procedure sp_pro3(spName varchar2, newSal number) is 
    --不要写成number(3,2),表明类型就可以了,不需要大小。就好像Java写方法时的参数一样 
    Sql代码 
    1.begin  
    2.  --执行部分,根据用户名去修改工资   
    3.update emp set sal=newSal where ename=spName;   
    4.end;   
    5./  
    
    2.调用过程:exec sp_pro3(‘scoot’4678);
    复制代码
    复制代码
    3.java程序中调用一个存储过程 
    //演示java程序去调用oracle的存储过程案例 
    Java代码 
    1.import java.sql.*;   
    2.public class TestOraclePro{   
    3.    public static void main(String[] args){   5.        try{   
    6.            //1.加载驱动   
    7.            Class.forName("oracle.jdbc.driver.OracleDriver");   
    8.            //2.得到连接   
    9.            Connection ct = DriverManager.getConnection("jdbc:oracle:thin@127.0.0.1:1521:MYORA1","scott","m123");   11.            //3.创建CallableStatement   
    12.            CallableStatement cs = ct.prepareCall("{call sp_pro3(?,?)}");   
    13.            //4.给?赋值   
    14.            cs.setString(1,"SMITH");   
    15.            cs.setInt(2,10);   
    16.            //5.执行   
    17.            cs.execute();   
    18.            //关闭   
    19.            cs.close();   
    20.            ct.close();   
    21.        } catch(Exception e){   
    22.            e.printStackTrace();   
    23.        }   
    24.    }   
    } 
    复制代码
    复制代码
    函数 
      函数和存储过程差不多,但是函数只能返回一个值,函数用于返回特定的数据,当建立函数时,在函数头部必须包含return子句。而在函数体内必须包含return语句返回的数据。我们可以使用create function来建立函数,实际案例: 
    Sql代码 
    1.--输入雇员的姓名,返回该雇员的年薪   
    2.create function annual_incomec(name varchar2)   
    3.return number is  
    4.annual_salazy number(7,2);   
    5.begin  
    6.    --执行部分   
    7.    select sal*12+nvl(comm, 0) into annual_salazy from emp where ename=name;   
    8.    return annual_salazy;   
    9.end;   
    10./  
    
    如果函数创建过程有编译错误,可以使用show error;命令显示错误 
    在sqlplus中调用函数 
    Sql代码 
    1.SQL> var income number   
    2.SQL> call annual_incomec('scott') into: income;   
    3.SQL> print income  
    
    同样我们可以在java程序中调用该函数 select annual_income('SCOTT') from dual; 这样可以通过rs.getInt(l)得到返回的结果。
    复制代码
    复制代码
    包用于在逻辑上组合过程和函数,它由包规范和包体两部分组成。 
    1.我们可以使用create package命令来创建包。 
    实例: 
    --创建一个包sp_package 
    --声明该包有一个过程update_sal 
    --声明该包有一个函数annual_income 
    Sql代码 
    1.create package sp_package is(包里面是过程的声明和函数的声明)
    2.  procedure update_sal(name varchar2, newsal number);   
    3.  function annual_income(name varchar2) return number;   
    4.end;  
    
    包的规范只包含了过程和函数的说明,但是没有过程和函数的实现代码。包体用于实现包规范中的过程和函数。 
    2.建立包体可以使用create package body命令 
    --给包sp_package实现包体 
    Sql代码 
    1.create or replace package body sp_package is  
    2.  procedure update_sal(name varchar2, newsal number)    
    3.  is  
    4.  begin    
    5.    update emp set sal = newsal where ename = name;   
    6.  end;   
    7.  function annual_income(name varchar2) return number is  
    8.    annual_salary number;   
    9.  begin  
    10.    select sal * 12 + nvl(comm, 0) into annual_salary from emp   
    11.     where ename = name;   
    12.    return annual_salary;   
    13.  end;   
    14.end;   
    15./  
    复制代码
    3.如何调用包的过程或是函数 
    当调用包的过程或是函数时,在过程和函数前需要带有包名,如果要访问其它方案的包,还需要在包名前加方案名。 
    如: 
    SQL> call sp_package.update_sal('SCOTT', 1500); 
    特别说明: 
    包是pl/sql中非常重要的部分,我们在使用过程分页时,将会再次体验它的威力呵呵。 
  • 相关阅读:
    Android 主题theme说明 摘记
    Android开发 去掉标题栏方法 摘记
    安卓项目五子棋代码详解(二)
    关于 ake sure class name exists, is public, and has an empty constructor that is public
    百度地图3.0实现图文并茂的覆盖物
    android onSaveInstanceState()及其配对方法。
    关于集成科大讯飞语音识别的 一个问题总结
    android 关于 webview 控制其它view的显示 以及更改view数据失败的问题总结
    C# 解析 json Newtonsoft果然强大,代码写的真好
    c#数据类型 与sql的对应关系 以及 取值范围
  • 原文地址:https://www.cnblogs.com/wanghuaijun/p/8244607.html
Copyright © 2011-2022 走看看