• 玩转oracle学习第六天


    

    1.上节回想
    2.PL/SQL的介绍
    3.PL/SQL的基础


    理解oracle的pl/sql概念
    掌握PL/SQL编程技术(包含编写过程,函数,触发器。包。。。

    PL/SQL是什么?
    PL/SQL(procedural language/sql)是oracle在标准的sql语言的扩展,PL/SQL不仅同意
    嵌入sql语言,


    数据库:编写存储过程。函数,触发器。使用的是PL/SQL语言。PL/SQL简化了复杂度
    添加程序的模块化,减小网络的传输的开销,提高安全性,提高程序的执行效率
    1.过程,函数,触发器是PL/SQL编写的
    2.过程,函数。触发器是在oracle中
    3.PL/SQL是很强大的数据库过程语言
    4.过程,函数能够在java程序中调用

    传统的操作数据库的方法是:
    java程序sql-》sql(数据库编译)

    程序要有灵魂,一个程序猿的成长是须要过程的,
    PL/SQL不好的地方:
    1.移植性不好,仅仅能使用单个数据库,不能用于其它数据库

    PL/SQL 用什么编写PL/SQL
    PL/SQL开发工具
     PL/SQL是oracle公司提供的一个工具
     编写存储过程。向当中插入记录
     1.创建一个简单的表
     create table mytest(name varchar2(20),passwd varchar2(30));
     
     2.创建存储过程
     create or replace procedure sp_pro1 is
     begin
     --运行部分
     insert into mytest values('何世阳','m123')
     end;
     /
     replace:表示有就会替换
     怎样查看错误信息:
     show error;
     
     怎样调用存储过程?两种方法
     (1)exec sp_pro1(參数1。參数2,。。。);
     (2)call sp_pro1(參数1,參数2,。

    。);
     
     使用PL/SQL developer工具开发PL/SQL的存储过程
     create or replace procedure sp_pro2 is
     begin
     delete from mytest where name='何世阳';
     end;
     
     存储过程如今还没有一个标准,各个数据库有自己的存储过程编写规则
     
     PL/SQL编程使用变量和逻辑控制语句,从而编写非常实用的功能模块
     
     简单分类:
               |--过程
               |--函数
     块(编程)     
               |--触发器
               |--包
               
    编写规范:
    (1)凝视
       单行凝视 --
       select * from emp where empno=7788;--取得员工信息
       多行凝视
       /*...*/来划分
    (2)表示符号的命名规范
     1)当定义变量,建议用v_作为前缀
     2)常量。c_作为前缀
     3)游标,_cursor作为后缀
     4)例外。e_作为前缀。比如e_error
     
     块的介绍:
     块(block)是PL/SQL的基本程序单元,编写PL/SQL程序实际就是编写PL/SQL块
     
     块的结构图:
     PL/SQL块由三部分构成:定义部分,运行部分。例外处理部分
     例如以下所看到的:
     declear
     /*定义部分-----定义常量,变量,游标,例外。复杂数据类型*/
     begin
     /*运行部分-----要运行的PL/SQL语句和sql语句*/
     exception
     /*例外处理部分---处理执行的各种错误*/
     end;
     
     特别说明:
     定义部分是从delete開始的
     该部分是可选的
     运行部分是从begin開始的
     该部分是必须的
     例外处理部分是从exception開始的
     该部分是可选的
     
     java程序结果
     
     public static void main(String[] args)
     {
       int a = 1;
       try
       {
          a++。
       }
       catch(Exception e)
       {
        
       }
     }
     
     最简单的块:
     set serveroutput on --打开输出过程
     begin
     dbms_output.put_line('hello world');
     end;
     
     以上是输出‘hello world’的块,说明例如以下:
     dbms_output 是oracle所提供的包(类似java的开发包),该包包括一些过程,
     put_line就是dbms_output包的一个过程
     
     declear
      v_ename varchar2(5);--定义字符串变量
      v_sal   number(7.2);
     begin
      select ename into v_ename,v_sal from emp where empno=&no;
      dbms_output.put_line('雇员名'||v_ename);
     exception
     when no_data_found then
     dbms_output.put_line('朋友,你的编号输入有误!');
     end;
     /
     &表示要接受控制台输入的參数
     
     定义部分,运行部分和例外处理部分
     
     oracle事先提前定义了一些例外。比如no_data_found
     
     过程:
        过程用于运行特定的操作,当建立过程时。既能够指定输入參数,也能够指定输出參数。通过在过程中
        使用输入參数。能够将数据传递到运行部分。
        通过使用输出參数。能够将运行部分的数据传递到应用环境。在sqlplus中能够使用create procedure命令来建立过程
        实比例如以下:
        (1)编写一个过程,能够输入雇员名。新工资,可改动雇员的工资
        (2)调用过程有两种方法:
        (3)在java程序中调用一个存储过程
     create procedure sp_pro3(spName varchar2,newSal number) is
     --定义变量部分
     begin
     --运行部分。依据username去改动工资
     update emp set sal=newSal where ename = spName;
     end;
     /
     
     调用以上存储过程:
     exec sp_pro3('scott',4789);
     
     java程序中调用一个存储过程
     //编写一个java application程序測试oracle存储过程的调用
     import java.sql.*;
     1.载入驱动
     Class.forName("oracle.jdbc.driver.OracleDriver");
     2.得到连接
     Connection ct = DriverManager.getConnection("");
     3.创建CallableStatement
     CallableStatement cs = 。

    。。
     
     ?

    怎样使用过程返回值??
     
     函数:函数和过程本身是一家。函数用于返回特定的数据,当建立函数时。在函数头部必须包括return语句
     
     函数案例:
      案例:输入雇员姓名,返回该雇员的年薪
     create function sp_fun2(spName carchar2) return
     number is yearSal number(7,2);
     begin
     --运行部分
     select sal*12+nvl(comm,0)*12 into yearSal from emp where ename=spName;
     return yearSal;
     end;
     调用
     1)在sqlpls中进行函数调用
     tome number
     call sp_fun2('scott') into:abc;
     print abc
     2)相同我们能够在java程序中调用该函数
     select annual_income('SCOTT') from dual;
     能够通过rs.getInt(1)得到返回的结果
     
     触发器:触发器是指隐含的运行的存储过程。

    当定义触发器时。必需要指定触发器的事件和触发的操作
     
     
     包:包用于在逻辑上组合过程和函数。它由包规范和包体两部分组成
     创建包(声明):
     create package sp_package is
     procedure update_sal(name varchar2,newsal number);
     function annual_income(name varchar2) return number;
     end;
     /
     
     给包实现包体:
     create or replace package sp_package is
     procedure update_sal(name varchar2,newsal number)
     is
     begin
     update emp set sal=newsal where ename=name;
     end;
     function annual_income(name varchar2)
     return number is
     annual_salary number;
     begin
     select sal*12+nvl(comm,0) into annual_salary from emp
     where ename=name;
     return annual_salary;
     end;
     end;
     /
     
     怎样调用包。调用包中的过程和函数,调用的时候,须要在过程和函数面前加入包名
     exec sp_package.update_sal('SCOTT',120);
     
     
     PL/SQL基础 定义并使用变量
     标量(scalar)-经常使用类型
     在PL/SQL中
     标量定义的案例:
     (1)定义一个变长的字符串
     v_ename varchar2(20)
     
     (2)使用一个变量
     数据赋值:    :=
     declare
     c_tax_rate number(3,2) := 0.03;
     
     v_ename varchar2(5);
     v_sal   number(7,2);
     v_tax_sal number(7,2);
     begin
     --运行
     select ename,sal into v_ename,v_sal from emp where empno = &no;
     --计算所得税
     v_tax_sal := v_sal*c_tax_rate;
     --输出
     dbms_output.put_line(姓名是:'' || v_ename ||'工资是:'||v_sal||'交税:'||v_tax_sal) ;
     end;
     
     标量(scalar)-使用%type类型:
     v_ename emp.ename%type;//表示变量v_ename定义的大小和表emp的字段enamel大小一致
     
     复合变量(composite)介绍:
     用于存放多个值的变量,主要包含:
     类似高级语言的结构体
     type emp_recode_type is recode
     (
     name emp.ename%type,
     salary emp.sal%type,
     title emp.job%type
     );
     //定义了一个PL/SQL记录类型emp_recode_type,类型包括是哪个数据name,salary,title
     sp_recode emp_recode_type;//定义了一个变量sp_recode,它的类型为emp_recode_type
     
     详细编写:
     declare
     type emp_recode_type is record(name emp.ename%type,
     salary emp.sal%type,
     title emp.job%type);
     sp_recode emp_recode_type;
     begin
     select ename,sal,job into sp_record from emp where empno=7788;
     dbms_output.put_line('员工名:' || sp_record.name || '工资是' || sp_record.salary);
     end;
     
     复合类型:
     相当于高级高级语言中的数组。可是须要注意的是在高级语言中数组的下标不能为负数。可是此处是能够为负数的
     
     PL/SQL表实例:
     declare
     --index by binary_integer表示下标是整数,正整数和负整数都能够的
     type sp_table_type is table of emp.ename%type index by binary_integer;
     sp_table sp_table_type;
     begin
     select ename into sp_table(0) from emp where empno=7788;
     dbms_output.put_line('员工名:' || sp_table(0));
     end;
     
     ?怎样返回多条数据类型??
     
     复合变量-參照变量
     參照变量是指用于存放数值指针的变量,通过使用參照变量,能够使得应用程序共享同样的对象,从而减少占用的控件。在编写
     PL/SQL程序时。能够使用游标比那辆(ref cursor)和对象类型变量(ref obj_type)两种參照变量类型
     
     參照变量-ref cursor游标变量
     使用游标时,当定义游标时不须要
     
     declare
     --定义游标类型sp_emp_cursor
     type sp_emp_cursor is ref cursor;//定义了一个游标
     --定义游标变量
     test_cursor sp_emp_cursor;
     --定义变量
     v_ename emp.ename%type;
     v_sal emp.sal%type;
     begin
     --运行
     --把test_cursor 和一个 select结合,即test_cursor指向结果集
     open test_cursor for select ename,sal from emp where deptno=&no;
    loop
     fetch test_cursor into v_ename,v_sal;
     --推断工资高低。决定是否更新
     
     --推断是否test_cursor为空
     exit when test_cursor%notfound;
     dbms_output.put_line('名字:' || v_name || '工资:' || v_sal);
    end loop;
     end;
     
     复合变量-嵌套表
     
     复合变量-复合表

  • 相关阅读:
    文档加载完后执行相关事件
    流程步骤(备用)
    浏览器常见内核
    修改!important定义的样式(2)
    样式被!important 后修改的方法
    产生BFC环境的几种方式
    当我们访问一个网址后发生了什么?
    Java并发基础--线程通信
    Java 集合学习--ArrayList
    Java并发基础--线程安全
  • 原文地址:https://www.cnblogs.com/mfmdaoyou/p/7088080.html
Copyright © 2020-2023  润新知