Oracle_day04

oracle第四天总结
(1)plsql
    1.基本结构:
        declare
          --声明变量
        begin
          --plsql体执行其他操作
        exception  --有异常捕获处理可以加上该关键字
          --异常处理
        end;

declare
  i number(3) := 1;
begin
  loop
    dbms_output.put_line(i);
    i := i + 1;
    exit when i > 100;
  end loop;
end;


    2.变量声明:(常量、普通变量、引用普通类型变量、引用行类型变量、异常类型变量、游标类型变量)
  

DECLARE
  id constant number(2) := 1; --使用constant 关键词定义常量
  name  VARCHAR2(10) := '圣元'; --定义指定类型变量
  mysal emp.sal%type; --定义引用存在表的列类型
  myrow emp%rowtype; --定义引用存在表行类型  bean   select * into v_account from xx
  no_data exception; --异常定义
  cursor c1 is
    select sal from emp; --游标定义,该c1中相当于java中集合,给
  cursor c2(dno number) is
    select sal from emp where deptno = dno; ---带参游标定义,该c2相当于java中带泛型集合
BEGIN
  raise no_data;
exception
  -- when no_data then
  -- dbms_output.put_line('没有数据');
  when others then
    dbms_output.put_line('出错了');
    --常量就不能再赋值了 id:=2 错误
    SELECT sal INTO mysal FROM emp WHERE empno = 7369;
    SELECT * INTO myrow FROM emp WHERE empno = 7369;
    dbms_output.put_line(id);
    dbms_output.put_line(name);
    dbms_output.put_line(mysal);
    dbms_output.put_line(myrow.ename || '   ' || myrow.sal);
END;


    3.plsql中条件语句
        select case when then when then else end
        select decode()
        ---------------------------------
        if xx then
        elsif  xx then  xx
        elsif xx then xx
        else xx
        end if;---注意加上分号
    4.plsql中循环语句
        第1种
            for  i in 1..100   --退出循环的是根据循环次数来定的
            loop
            end loop;
            游标使用for in格式更简单
            for 不需要定义的任意变量名称 in c1;
            loop
            end loop;
        第2种:
            while  --此处while后面声明退出循环条件
            loop
            end loop;
        第3种:
            open c1;           ---此处打开游标
            loop
            fetch c1 into xx;
            exit when c1%notfound;      --此处exit when 声明退出循环条件
            end loop;
            close c1;          --此处关闭游标
    
(2)存储函数:function
    创建存储函数:
        create or replace function myfn1(eno in emp.empno%type) return varchar2 as---实际return name 的name类型一定要和定义得return varchar2要一致
          --这里可以声明变量
          myrow emp%rowtype;
          name varchar2;
        begin
            select * into myrow from emp where empno=eno;
            name:=myrow.ename;
            return name;
        end;
    plsql调用存储函数:
        select myfn1(7369) from dual;
        或者
        declare
          name varchar2;--此处要声明一个变量用于接收返回的结果
        begin
          name:=mypro2(7369);
          dbms_output.put_line(ename);
        end;        
(3)存储过程:
    第1种创建方式:不带参数
        create or replace procedure mypro1 as
          --这里可以声明变量
        begin
        end;
    第2种创建方式:带in和out参数,参数个数不限制
        create or replace procedure mypro2(eno in emp.empno%type,name out varchar2) as
          --这里可以声明变量
          myrow emp%rowtype;
        begin
            select * into myrow from emp where empno=eno;
            name:=myrow.ename;
        end;
    plsql调用存储过程:
        execute mypro1;---对于无参数存储过程可以这样调用
        或者
        call mypro1(xxx)--对于只有in 参数可以这样调用
        或者
        declare         --存储函数和存储过程都可以这样调用
          name varchar2;
        begin
          mypro2(7369,name);---此处声明一个变量用于接收out参数输出
        end;
(4)jdk api调用存储函数和存储过程:
    oracle和mysql连接数据库写法区别:
        jdbc:oracle:thin:@ip:port/数据库
        jdbc:mysql://ip:port/数据库
    对象模型:
        DriverManager.getConncetion()---Connection---prepareCall
        CallableStatement---set in 参数直接通过设置类型setInt()---registerOutParameter--
        call.execute();
    
    CallableStatement调用存储过程和存储函数的sql语句
    {call mypro1(?,?)}  调用存储过程
    {?=call myfn1(?)}   调用存储函数
    
    SQL>@D:1.sql     --oracle执行sql语句和mysql 中source d:1.sql 差不多

(4)触发器
   create or replace trigger 触发器名
   before|after
   delete|update|insert
   on 表名
   for each row--行级触发器
   begin
   end;
   raise_application_error(-2999,'') 系统定义错误

原文地址:https://www.cnblogs.com/datapool/p/6943876.html