OracleOracle笔记四-pl/sql-分支/循环/游标/分外/存款和储蓄/调用/触发器

–带参数的游标
DECLARE
   CURSOR c_emp(v_no1 NUMBER, v_no2 NUMBER) IS SELECT * FROM emp
WHERE deptno = v_no1 OR deptno = v_no2;
   v_row emp%ROWTYPE;
BEGIN
  OPEN c_emp(十,20);–传入部门编号deptno
  LOOP
   FETCH c_emp INTO v_row;
   EXIT WHEN c_emp%NOTFOUND;
   dbms_output.put_line(v_row.ename||’==’||v_row.job);
  END LOOP;
  CLOSE c_emp;
END;

2.变量和常量
宣称普通变量:
     v_name varchar贰(30) := ‘tom’; 
(:=为赋值符号;=为比较符号,也就是java中的==);
宣示引用型变量:
     v_sal emp.sal%type := 100;   
声明的v_sal变量与emp表中sal字段的类型一致;
宣称记录型变量:
     v_row emp%rowtype;
记录型变量相当于java中的resultset,用来储存整张表中的数据;
宣示常量:
     v_gender constant number(1) number(1) := 1;   

四.循环语句
语法一:loop—exit when—-end loop;
举例:
–输出1–100的数
declare
  v_num number(8) := 1;
begin
  loop
   exit when v_num > 100;
   dbms_output.put_line(v_num);
   v_num := v_num + 1;
  end loop;
end;

5.游标(cursor)
功用:用来接受多条数据结果,也正是java中的ResultSet
语法:cursor 游标名称 is sql 查询语句;
使用:
     open 游标名称
     loop
         fetch 游标名称 into 记录型变理
         exit when 游标名称%notfound;
             逻辑处理
     end loop;
     close 游标名称;
举例:
–打字与印刷emp表的拥有音信
DECLARE
  CURSOR c_emp IS SELECT * FROM emp;
  v_row emp%ROWTYPE;
BEGIN
  OPEN c_emp;
  LOOP
    FETCH c_emp INTO v_row;
          EXIT WHEN c_emp%NOTFOUND;
          dbms_output.put_line(v_row.ename||’–‘||v_row.job);
   END LOOP;
   CLOSE c_emp;
END;

事例2:带out参数的贮存进度
CREATE OR REPLACE PROCEDURE pro_emp_sal2(v_no NUMBER, v_yearsal OUT
NUMBER) IS
BEGIN
  SELECT sal*12 + NVL(comm,0) INTO v_yearsal FROM emp WHERE empno =
v_no;
END;
–只好使用办法二调用
DECLARE
  v_sal NUMBER(8,2);
  BEGIN
   pro_emp_sal2(7788,v_sal);
   dbms_output.put_line(v_sal);
  END;

三.存款和储蓄函数
–存款和储蓄函数
CREATE OR REPLACE FUNCTION fun_emp_sal(v_no NUMBER)
RETURN NUMBER
IS
v_sal NUMBER(8,2);
BEGIN
  SELECT sal*12+NVL(comm,0) INTO v_sal FROM emp WHERE empno = v_no;
  RETURN v_sal;
  END;
  –使用存款和储蓄函数
  BEGIN
   dbms_output.put_line(fun_emp_sal(7788));
   END;

二.–系统时间引发的触发器
CREATE OR REPLACE TRIGGER tri_emp
BEFORE
DELETE OR UPDATE OR INSERT
ON emp
FOR EACH ROW

6.异常
exception—when—-then
–预订义相当
DECLARE
  v_num NUMBER(3);
  BEGIN
   v_num := 10000;
   EXCEPTION
    WHEN value_error THEN
     v_num := 999;
     dbms_output.put_line(v_num);
  END;

–自定义优异
   DECLARE
   V_AGE NUMBER(8) := #
   EXC_AGE EXCEPTION; –注脚相当
  BEGIN
   IF V_AGE > 150 THEN
    RAISE EXC_AGE;
   END IF;
  EXCEPTION
   WHEN EXC_AGE THEN
    RAISE_APPLICATION_ERROR(-20001, ‘illegal age’);
  END;

–扩展一条数据,看是或不是会接触
INSERT INTO emp(empno,ename,deptno) VALUES(1,’tom’,10);

三.分支语句
语法一:if —then—end if;
语法二:if —then—else—end if;
语法三:if —then—elsif—then—-else—-end if;
举例:
–年龄小于1八,呈现未成年人,18-60,展现成年人,60之上呈现老人
declare
     v_age number(8) :=#
begin
     if v_age < 18 then
         dbms_output.put_line(‘未成年人’);
     elsif v_age >= 18 and v_age <= 60 then
         dbms_output.put_line(‘成年人’);
     else
         dbms_output.put_line(‘老年人’);
     end if;
end;

BEGIN
  dbms_output.put_line(‘扩张了一条数据’);
END;

2.存款和储蓄进度
概念:一段被命名的plsql,预编写翻译到了数据库中
语法:
     create or replace procedure 存款和储蓄进度名字(参数一 [in]/out
数据类型)
         as | is
         begin

②.ProcedureDao用来调用存款和储蓄进程
public class ProcedureDao {
     public static Long  getSal(Long v_no){
         Connection conn = null;
         CallableStatement stmt=null;
         Long yearsal=0l;

叁.TestDao用于测试
public class TestDao {
     public static void main(String[] args) {
         CursorDao.getEmp(10l);
     }
}

1.pl/sql(Procedure Language/SQL)编制程序语言
1.概念
PL/SQL是Oracle数据库对SQL语句的扩展。在日常SQL语句的行使上扩展了编制程序语言的特点,所以PL/SQL把多少操作和查询语句协会在PL/SQL代码的进程性单元中,通过逻辑判断、循环等操作完结复杂的功能照旧计算。PL/SQL
唯有 Oracle 数据库有。 MySQL 方今不协助 PL/SQL 的。

        try {
             conn=BaseDao.getConn();
             stmt = conn.prepareCall(“call
pro_emp_sal2(?,?)”);//调用存款和储蓄进度
             stmt.setLong(1, v_no);
             stmt.registerOutParameter(二, OracleTypes.NUMBEPRADO);   
//钦命参数的数据类型
             stmt.execute();
             yearsal = stmt.getLong(2);
         } catch (SQLException e) {
             e.printStackTrace();
         }
         return yearsal;
     }
}

4.行使jdbc调用存储进程和仓库储存函数
1.BaseDao用于加载驱动和取得连接
2.ProcedureDao用以调用存款和储蓄进程
三.TestDao用来测试

举例:
1.BaseDao用于加载驱动和得到连接
public class BaseDao {
      //加载驱动
     static{
         try {
             Class.forName(“oracle.jdbc.OracleDriver”);
         } catch (ClassNotFoundException e) {
             e.printStackTrace();
         }
     }
    
     //获取连接
     public static Connection getConn() throws SQLException{
         String url=”jdbc:oracle:thin:@192.168.92.8:1521:orcl”;
         String user=”qin”;
         String password=”qin”;
         return DriverManager.getConnection(url, user, password);
     }
    
     public static void closeAll(ResultSet rs,Statement stmt,Connection
conn){
         if(rs!=null){
             try {
                 rs.close();
             } catch (SQLException e) {
                 e.printStackTrace();
             }
         }
         if(stmt!=null){
             try {
                 stmt.close();
             } catch (SQLException e) {
                 e.printStackTrace();
             }
         }
Oracle,         if(conn!=null){
             try {
                 conn.close();
             } catch (SQLException e) {
                 e.printStackTrace();
             }
         }
     }
}

DECLARE
  v_dateStr VARCHAR2(20);
BEGIN
  SELECT to_char(SYSDATE,’yyyy-mm-dd’) INTO v_dateStr FROM dual;
  IF v_dateStr = ‘2017-09-20’ THEN
   raise_application_error(-贰仟二,’后日系统维护’);
   END IF;
  END;
 
  –测试是还是不是能吸引触发器
  INSERT INTO emp(empno,ename,deptno) VALUES (3,’jerry’,10);

五.触发器
1.–创制添加多少引发操作的触发器
CREATE OR REPLACE TRIGGER tri_add_emp
AFTER
INSERT ON emp

语法二:while—loop—-end loop;
declare
  v_num number(8) := 1;
begin
  while v_num <= 100 loop
   dbms_output.put_line(v_num);
   v_num := v_num + 1;
  end loop;
end;

注:存款和储蓄进程和存款和储蓄函数的不同
1、语法不相同
二、使用景况:1般存款和储蓄函数多被积存进程选取,存款和储蓄进程一般选拔在类型和品种里面包车型地铁多少交互
三、存款和储蓄函数能够直接在sql中使用,而存款和储蓄进度无法
select ename,sal,func_emp_sal(empno)  from emp;

语法三:for—in 起始值..终止值—loop—end loop;
declare
  v_num number(8) := 1;
begin
  for v_num in 1 .. 100 loop
   dbms_output.put_line(v_num);
  end loop;
end;

        end;
例子1:
  –存款和储蓄进度,打字与印刷钦定职员和工人的年薪
  create or replace procedure pro_emp_sal(v_no number) is
  v_sal number(8, 2);
begin
  select sal * 12 + nvl(comm, 0) into v_sal from emp where empno =
v_no;
  dbms_output.put_line(v_sal);
end;
–方法一调用存款和储蓄进程
  call pro_emp_sal(7788);
–方法二调用存款和储蓄进度
begin
  pro_emp_sal(7788);
end;   

6.误删除数据恢复生机语句
create table tableName_bak
as
select * from tableName as of TIMESTAMP to_timestamp(‘20081126
103435′,’yyyymmdd hh24miss’);

相关文章