oracle与pl/sql基础

oracle与pl/sql基础

--if 
  declare
    old number:=&num ;
    begin
      if old<18 then
        dbms_output.put_line('未成年');
        elsif old>=18 and old <40 then
          dbms_output.put_line('成年人');
          else 
            dbms_output.put_line('老年了');
            end if;
      end;       

          --循环
    -----输出110

    -- while  loop   end loop;
   declare
   step number:=1;
   begin
     while step<=10 loop
       dbms_output.put_line(step);
       step:=step+1;
       end loop;     
     end;       


    --loop  exit when   end loop;   

   declare
   step number:=1;
   begin
      loop
      dbms_output.put_line(step);
      step:=step+1;
      exit  when step>10;
      end loop;
     end;


  ----     for  in loop end loop 

         declare
         begin
           for step in 1..10 loop
             dbms_output.put_line(step);
             end loop;
             dbms_output.put_line(step);  --这样相当于只在loop内定义了该变量;这里打印不了;
           end;
 ---游标
 declare
  cursor pc is select * from emp;         --这里只能是* ,因为pemp的类型是emp的一个行
  pemp emp%rowtype;
  begin
    open pc;
    loop
      fetch pc into pemp;
      exit when pc%notfound;
      dbms_output.put_line(pemp.empno);

      end loop;
    close pc;
    end;        
       --存储过程
     --给指定的员工涨100,并打印涨前与涨后的工资

     create or replace procedure addSall(eno in number)   --记得不能使用no,add做过程名,是它里面的关键字;
     is 
     pemp myemp%rowtype;
     begin
       select * into pemp from myemp where empno=eno;
       update myemp set sal=sal+100 where empno=eno;
       dbms_output.put_line(pemp.sal||'----'||(pemp.sal+100));
       end  addSall;

       begin 
         addsall(eno=>7902); --也可以直接这样的addsall(7902);
         commit;
         end;
   ---    存储函数
            create or replace function queryempincome(eno in number)
return number
as                        --这里可以使用is 也可以使用as
  --月薪和奖金
  psal   emp.sal%type;
  pcomm  emp.comm%type;
begin
  select sal,comm into psal,pcomm from emp where empno=eno;
  --返回年收入
  return psal*12+nvl(pcomm,0);
end;

  --调用
     begin
     dbms_output.put_line( queryempincome(7499));
      end;


 --带参数参数的存储过程
  create or replace procedure p_queryincome(eno in myemp.empno%type ,income out number)
 is  psal myemp.sal%type;
  pcomm myemp.comm%type;
  begin
    select sal,comm into psal,pcomm from myemp where empno=eno;
    income:=psal*12+nvl(pcomm,0);
    end;

 declare
  income number; 
  begin
    p_queryincome(7499,income);
    dbms_output.put_line(income);
    end;


   --返回参数为游标
   ----查出某个部门的所有员工的工资      
       create or replace procedure  proc_cur (dno in number, mycur out sys_refcursor) ---这里只能使用sys_recursor,不能用cursor
       is
       begin
       open mycur for select * from myemp where myemp.deptno=dno;
       end;

            declare 
       mycur sys_refcursor;             --系统定义的cursor不需要再开启了
       emplist myemp%rowtype; 
       begin
         proc_cur(20,mycur);

         loop
           exit when mycur%notfound;
           fetch mycur into emplist;
           dbms_output.put_line(emplist.empno||'  '||emplist.ename||'    '||emplist.sal);
           end loop;
          close mycur;
            end;



 --触发器
    --插入员工后面打印一句话"一个员工插入成功"
       create or replace trigger testTrigger
       after insert on myemp           --这里不能有分号
       declare
       begin
         dbms_output.put_line('一个员工插入成功');
         end testTrigger;


      insert into myemp (empno,ename)values(95128,'huaan');

    --不能星期四 插入员工


      create or replace trigger  validInsertEmp
      before insert on myemp
      declare
      weekend varchar2(20);
      begin
        select to_char(sysdate,'day') into weekend from dual;
        if weekend in('thursday') then
          raise_application_error(-20003,'不能在非法的时间内查入员工');----raise_application_error这个是连在一起的
          end if;
        end validInsertEmp;                                       ---这个不知道为什么会生效不了

      insert into myemp (empno,ename) values(9530,'huaan');




     --判断员工涨工资之后的工资应该高于涨工资之后  --行级触发器


     create or replace trigger tri_cheSal 
     before update of sal on myemp
     for each row
       begin
         if :old.sal>=:new.sal then
           raise_application_error(-2005,'员工涨工资之后的工资应该高于涨工资之后');
           end if;
         end tri_cheSal;


---触发器模拟自增
     create table myuser (id number(6) not null,name varchar2(8) not null,
     constraint pk_user_id primary key(id)
      )
      create or replace trigger user_trigger
      before insert on myuser
      for each row
        begin
          select myuser_seq.nextval into :new.id from sys.dual;
      end;

       create or replace trigger tri_ttuser
     before insert on tt_user
     for each row
       begin
         select sys_guid() into :new.id from dual;   ----这里  sys_guid()获得了uuid,他的位数为32位;    end;

java调用存储过程

import oracle.jdbc.OracleCallableStatement;
import oracle.jdbc.OracleTypes;
import oracle.jdbc.oracore.OracleType;
import org.junit.Test;

import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;

public class ProcedureTest {

    String driver = "oracle.jdbc.driver.OracleDriver";
    String url = "jdbc:oracle:thin:@192.168.186.186:1521:ORCL";

    String username = "scott";
    String password = "tiger";
    Connection conn;

    /**
     * java调用存储过程
     */
    @Test
    public void test1() {
        try {
            Class.forName(driver);
            Connection conn = DriverManager.getConnection(url, username, password);
            CallableStatement prepareCall = conn.prepareCall("{call p_queryincome(?,?)}");
            prepareCall.setInt(1, 7499);
            prepareCall.registerOutParameter(2, OracleTypes.NUMBER);
            prepareCall.execute();
            System.out.println(prepareCall.getObject(2));
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
     * java调用游标型的out
     */
    @Test
    public void test2() {
        try {
            Class.forName(driver);
            Connection conn = DriverManager.getConnection(url, username, password);
            CallableStatement prepareCall = conn.prepareCall("{call proc_sal2(?,?)}");
            prepareCall.setInt(1, 20);
            prepareCall.registerOutParameter(2, OracleTypes.CURSOR);
            prepareCall.execute();
            //ResultSet resultSet =(ResultSet) prepareCall.getObject(2); 也可以这样
            ResultSet resultSet = ((OracleCallableStatement) prepareCall).getCursor(2);

            while (resultSet.next()) {
                int empno = resultSet.getInt(1);
                String ename = resultSet.getString("ename");
                int sal = resultSet.getInt("sal");

                System.out.println(empno + "\t" + ename + "\t" + sal);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }

    }
}

猜你喜欢

转载自blog.csdn.net/weiqiang_java/article/details/79572492