zoukankan      html  css  js  c++  java
  • 9.windows-oracle实战第九课--plsql

    一、oracle的pl/sql的概念

      pl/sql是oracle在标准的sql语言上的扩展,不仅允许嵌入sql,还允许定义变量和常量,允许使用条件语句和循环语句,允许使用例外处理各种错误,这样使得它的功能更强大。

    1.过程、函数、触发器是pl/sql编写的

    2.过程、函数、触发器是在oracle中

    3.pl/sql是非常强大的数据库过程语言

    4.过程、函数可以在java程序中调用

    优点:增加程序的程序化编程、减少网络传输等、提高安全性、应用程序的运行性能

    缺点:移植性不好

    二、pl/sql的编程语言(包括函数、过程、触发器、包等)

    简单例子:编写一个存储过程,该过程可以向某表中添加记录

    create or replace  procedure sp_prol is 

    begin

    insert into mytest values('djw','m124');

    end;

    /

    show error 查看错误

    1) exec 过程名(参数值1,参数值2....)

    2)call  过程名(参数值1,参数值2....)

    1.pl/sql的编程最小的基础单位是块,用块可以编写过程、函数、触发器、包

    2.编写规范:

    定义变量为v_

    定义常量为c_

    定义游标_cursor

    定义例外e_

    3.块由3个部分构成:定义部分(declear),执行部分(begin)、例外部分(exception)

    实例:

    1.dbms_output是oracle所提供的包(类似java的开发包),该包包含一些过程,put_line就是dbms_output包的一个过程。

    set serveroutput on;
    begin
    dbms_output.put_line('hello,word');
    end;
    /

    2.写一个块如下,可以输入变量:

    declare
        v_name varchar2(5);
    begin
         select ename into v_name from emp  where empno=&no;
         dbms_output.put_line('雇员名'||v_name);
    end;
    /

    3.写一个块如下,可以输入变量且输入例外:

    declare
      v_name varchar2(5);
    begin 
       select ename into v_name from emp where empno=&no;
       dbms_output.put_line('雇员名:'||v_name);
    exception
       when no_data_found then
       dbms_output.put_line('朋友,你的编号输入有误');
    end;
    /

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

    实例:

    1)请写过程,输入雇员的名,新的工资,修改雇员的工资

    create procedure  sp_pro3(spName varchar2,newSal number) is
    begin
      update emp set sal=newSal where ename=spName;
    end;
    /

    2)如何调用过程两种方法

    exec  call

    5.函数:函数用于返回特定的数据,当建立函数时,在函数头部必须包含return子句,而在函数体内必须return语句返回的数据,我们可以使用create  function来建立函数

     6.包:包用于在逻辑上组合过程和函数,由包规范和包体组成

    ----创建包sp_package
    create package sp_package is
    procedure update_sal (name varchar2,sal number);
    function annual_income(name varchar2) return number;
    end;
    --创建具体的包体sp_package
    create package body sp_package is
    procedure update_sal(name varchar2,sal number)
      is
      begin
         update emp set sal=sal 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;

        /

    7.定义和使用变量

    标量:

    1)v_name varchar2(10); 

    2)v_sal   number(6,2);  

    3)v_sal2  number:=5.4---表示赋值,初始值

    4)v_hiredate  date

    5)  v_valid   boolean  not null  default false;

    存放最普通的变量:

    1)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;

    /

    2)declare
      c_tax_rate number(3,2):=0.03;
      v_ename  emp.ename%type;
      v_sal  emp.sal%type;
      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;

    复合变量:用于存放多个值的变量

    declare

    type emp_record_type is record(

    name  emp.ename%type,

    salary emp.sal%type,

    title emp.job%type);

    sp_record emp_record_type;

    begin

    select ename,sal,job into sp_record from emp where empno=7788;

    dbms_output.put_line('员工名'||emp_record.name);

    end;

    参照变量:

    参照变量是指用于存放数值指针的变量,通过使用参照变量,可以使得应用程序共享相同对象,从而降低占用的空间,在编写pl/sql程序时,可以使用游标变量和对象类型变量两种参照变量类型。

    1)请使用pl/sql编写一个块,可以输入部门号,并显示该部门

    set serveroutput on;

    declare 

    --定义游标

    type sp_emp_cursor is ref  cursor;

    --定义一个游标变量

    test_cursor sp_emp_cursor;

    --定义变量

    v_ename emp.ename%type;

    v_sal  emp.sal%type;

    begin

    open  test_cursor  for  select ename,sal from  emp  where deptno=&no;

    loop

        fetch test_cursor into v_ename,v_sal;

        exit  when test_cursor%notfound;

        dbms_output.put_line('名字'||v_ename||'工资:'||v_sal);

    end loop;

    end;

    if语句的用法

    create or replace  procedure sp_pro6(spName varchar2(10)) is
    v_sal emp.sal%type
    begin
      select sal into v_sal from emp where ename=spName;
    if v_sal<2000  then
      update emp set sal=sal+sal*10% where ename=spName;
    end if;
    end;

    3种循环(for循环省略)

    create or replace procedure sp_pro6(spName varchar2) is
    v_num  number:=1;
    begin
      loop
        insert into users values(v_num,spName);
        exit when v_num=10;
        v_num:=v_num+1;
      end loop;
    end;
    --
    create or replace procedure sp_pro6(spName varchar2) is
    v_num  number:=1;
    begin
    while v_num<=20 loop
        insert into users values(v_num,spName);
        v_num:=v_num+1;
      end loop;
    end;

    自定义例外:

     视图:视图是一个虚拟表,其内容由查询定义,同真实的表一样,视图包含一系列带有名称的列和行数据。但是,视图并不在数据库中以存储的数据值集形式存在。行和列数据来自由定义视图的查询所引用的表,并且在引用视图时动态生成。(视图是随表的变化而变化)

    1)视图不占磁盘空间

    2)视图有利于提高安全性,不同用户看到的视图不同

    3)视图不能增加索引

    4)视图可以简化复杂查询

    5)视图和视图也可以进行关联查询

    创建视图:

    create view 视图名 as select xxx with read only

  • 相关阅读:
    2019 SDN上机第5次作业
    SDN课程阅读作业(2)
    第05组 Alpha事后诸葛亮
    Ryu控制器编程开发——packet_in和packet_out简易交换机实现
    Ryu控制器安装部署和入门
    OpenDayLight Beryllium版本 下发流表实现hardtimeout
    Raspberry Pi 4B FTP服务器配置
    利用Wireshark抓取并分析OpenFlow协议报文
    基于OVS命令的VLAN实现
    利用Python脚本完成一个Fat-tree型的拓扑
  • 原文地址:https://www.cnblogs.com/dangjingwei/p/12141617.html
Copyright © 2011-2022 走看看