zoukankan      html  css  js  c++  java
  • 【PL/SQL编程基础】

    【PL/SQL编程基础】
    语法:
    declare
    声明部分,例如定义变量、常量、游标
    begin
    程序编写,SQL语句
    exception
    处理异常
    end;
    / 正斜杠表示执行程序快
    范例
    -- Created on 2016/8/22 by VITAS
    declare 定义变量
    v_num number;
    v_eno number;
    v_ename varchar2(10);
    begin
    v_num:=234;
    v_eno:=&empno; 接收输入变量
    select ename into v_ename from emp where empno=v_eno;
    DBMS_OUTPUT.put_line(v_ename);
    end;
    /

    变量的声明和使用


    PLSQL是一种强类型的编程语言,变量名前加v表示变量
    语法:
    所有的变量都要求在declare部分之中进行,可以在定义的时候赋默认值,变量声明语法如下:
    变量名[constant] 类型 [not null][:=value]
    declare
    v_resultA number;
    v_resultB number :=100;
    v_resultC constant number:=14;
    begin
    v_resultA:=10;
    dbms_output.put_line('result 的值是:'||(v_resultB+v_resultA+v_resultC));

    end;
    /
    使用%type定义变量
    使用%rowtype声明变量,可以定义表中一行记录的类型
    运算符:
    掌握变量的声明和使用
    掌握%type和%rowtype的使用

    PL/SQL分支语句
    if/else
    循环:
    loop:
    语法:
    loop
    exit when 循环结束条件
    end loop
    while() loop

    end loop;
    for:
    for 循环索引 in 循环区域下线..循环区域上线 loop
    end loop;
    goto语句:
    goto endpoint
    <<endpoint>>


    异常处理:
    1、编译时异常,无法处理
    2、运行时异常:用户可以处理的只有运行时异常
    异常处理要使用EXCEPTION子句处理,通过when子句对异常处理
    when 异常类型|用户自定义异常|异常代码|other then
    异常处理
    产生异常后继续执行其他代码


    记录类型:
    定义记录类型语法:
    type 类型名 is record(
    成员名 数据类型 [[not null][:=默认值] 表达式],
    ......
    成员名 数据类型 [[not null][:=默认值] 表达式]


    嵌套记录类型
    雇员中包含部门信息
    插入复合数据类型
    insert into dept values v_dept

    更新复合数据类型
    update dept set ROW=v_dept where deptno=v_dept_deptno;

    索引表的概念(数组)
    索引表类似于程序语言中的数组,可以保存多个数据
    区别:不需要初始化
    索引:数字或者字符串,下标可以设置为负数
    语法:
    type 类型名称 is table of 数据类型【not null】
    index by [pls_integer|binary_interger|varchar2]
    访问没有定义的索引,会出现数据找不到的异常,但是索引的下标不是顺序的,所以索引值可能不存在,一次提供exists(index)判断是否存在
    范例:使用字符串作为字符索引
    范例:使用rowtype数组
    范例:使用记录类型数组
    嵌套表:(跳过)start
    1、定义简单类型的嵌套表
    CREATE [OR REPLACE] TYPE 类型名称 AS|IS TABLE OF 数据类型 [not null];/
    create or replace type project as table of varchar2(20);
    集合运算符:

    集合函数:count、first last
    集合异常处理:
    跳过 end
    使用forall批量处理:
    使用for in:(更新n次)
    for xx in 集合 first..last loop
    end loop
    2、使用forall:(批处理更新数据)
    语法:
    forall x in 集合 first..last
    update.....

    批量接收数据:
    bulk collect into

    子程序:

    目标
    1、掌握子程序的分类
    包含存储过程和函数
    定义过程:
    专门定义一组sql语句集
    语法:
    过程=声明+plsql快
    CREATE [OR REPLACE] PROCEDURE 过程名 (参数名[模式in/out/in out] nocopy 数据类型,....)
    as|is
    [pragma autonomous_transaction]
    声明部分:
    begin
    exception when others then
    rollback
    end 过程名

    过程没有返回值
    create or replace procedure ChangePassword(userName in out varchar2,
    password in out varchar2) is
    pragma autonomous_transaction;
    v_result boolean;
    begin

    v_result := login(userName, password);
    end ChangePassword;

    范例:定义一个过程
    过程定义完之后要通过exec 过程名 执行过程
    范例:
    定义过程根据雇员编号找到姓名和工资

    函数:
    用户定义的sql语句或者plssql直接调用,函数和过程的最大区别在于函数可以返回值,而过程智能通过in和out来返回数据,
    语法如下:类型为numnber或者varchar时不需要定义长度否则编译不能通过
    CREATE [OR REPLACE] FUNCTION 过程名 (参数名[模式] nocopy 数据类型,....)

    return 返回值类型
    as|is
    [pragma autonomous_transaction]
    声明部分
    begin
    return 返回值;
    exception when others then
    rollback
    end 函数名
    create or replace function LOGIN(userName in out varchar2,
    password in varchar2) return boolean is
    v_isLogin boolean;
    --定义rowtype
    userrow T_USER%ROWTYPE;
    --定义元素为rowtype类型的集合
    type UserInfo is table of T_USER%ROWTYPE index by binary_integer;
    --定义类型后需要对定义类型变量
    users UserInfo;
    --定义记录类型
    type userRecord is record(
    id number(10),
    userName varchar2(32),
    password varchar2(32),
    roleId number(10));
    userR userRecord;
    --定义自定义事务,此事务的rollback和commit不会影响到主事务
    pragma autonomous_transaction;
    begin

    --使用bulk collect into批量查询赋值
    select * into userR from T_USER where userName = 'YWP';
    userR.userName := 'zp';
    insert into T_USER VALUES userR;
    commit;
    select *
    BULK COLLECT
    INTO users
    from T_USER
    where username = userName
    and password = password;
    if users.count != 0 then
    dbms_output.put_line('welcome login my system!');
    else
    dbms_output.put_line('用户名或密码错误');
    end if;
    exception
    when others then
    dbms_output.put_line('313');
    /* --使用for in遍历集合
    for i in users.first .. users.last loop
    --输出变量时先判断下标是否存在
    if users.exists(i) then
    dbms_output.put_line('welcome login my system!');
    end if;
    end loop;*/
    userName := 'ywp';
    return(v_isLogin);
    end LOGIN;

    2、掌握子程序的定义和区别
    子程序的参数模式
    形参定义有三种
    in:(默认值),子程序中所做的修改不会影响原始参数(基本数据类型的传递)

    out:不带任何数值的子程序中,子程序可以通过此变量将数值传到调用处(引用数据类型的传递)
    inout,可以将值传到子程序中,兵将子程序对变量的修改返回到调用处

    nocopy子选项:将参数变为引用传递,in和out为复制传递参数
    自治事务:
    在oracle中每个session都有独立的事务,
    启动子事务
    利用java调用子程序

  • 相关阅读:
    JAVA 遍历UFT-8所有中文
    用友U8 | 【固定资产】固定资产常见问题
    用友U8 | 【出纳管理】当前凭证不是出纳管理凭证,不能修改
    用友U8 | 【出纳管理】选中的日记账包含了已制单但没有回写凭证号的日记账,无法制单!
    用友U8 | 【生产订单】工作日历未设定或超出工作日历范围
    用友U8 | 【出纳管理】当前选择的日记账已经制单,上次制单包含其他账户的日记账,请在日记账查询中修改
    用友U8 | 【U8年结】开账结转如何操作?
    用友U8 | 【出纳管理】收支操作生单提示:集合中的143272已经加锁了,不能对集合中的数据进行加锁
    用友U8 | 【出纳管理】银行记账提示:未设置对象变量或with block 变量(91)
    MySQL经典45题(二)
  • 原文地址:https://www.cnblogs.com/vitasyuan/p/5808841.html
Copyright © 2011-2022 走看看