PL / SQL 프로 그래 밍 (2)

  • 앞의 첫 번 째 대중 들 은 자바 프로그램 이 저장 과정 을 호출 하 는 것 을 이야기 하고 여기에 보충 했다.저장 과정 에 반환 값 이 없 을 수 있 고 반환 값 (비 목록), 반환 결과 집합 등 몇 가지 상황 이 있 을 수 있 습 니 다. 다음 과 같은 예 를 들 어
  • --  
    drop table book;
    
    create table book(
    bookId number(10) primary key,
    bookName varchar2(50),
    publishHouse varchar2(50),
    bookClass number(3) not null);
    
    /*
       
      16-  book     ,  java    :
    */
    
    --    :in       , out      ,          
    create or replace procedure add_book(proBookId in number, proBookName in varchar2, proPublishHouse in varchar2, proBookClass in number) is
    begin
      insert into book values(proBookId, proBookName, proPublishHouse, proBookClass);
    end;
    
    /*
    --Java  
    public class TestProcedure {
    	public static void main(String[] args) {
    		Connection conn = null;
    		CallableStatement cs = null;
    		
    		try {
    			//    
    			Class.forName("oracle.jdbc.driver.OracleDriver");
    			//    
    			conn = DriverManager.getConnection("jdbc:oracle:thin:@127.0.0.1:1521:orcl", "dog", "dog");
    			cs = conn.prepareCall("{call add_book(?, ?, ?)}");
    			
    			//    
    			cs.setInt(1, 1);
    			cs.setString(2, "Thinking in Java");
    			cs.setString(3, "America Universe Publish");
          cs.setInt(4, 1);
    	
    			//  
    			cs.execute();
    		} catch (Exception e) {
    			e.printStackTrace();
    		} finally {
    			try {
    				cs.close();
    				conn.close();
    			} catch (SQLException e) {
    				e.printStackTrace();
    			}
    		}
    	}
    }
    */
    
    /*
      :         (      )
      17-      ,     、   
    */
    create or replace procedure get_book(proBookId in number, proBookName out varchar2, proPublishHouse out varchar2) is
    begin
      select bookName, publishHouse into proBookName, proPublishHouse from book where bookId = proBookId;
    end;
    
    /*
    --Java  
    public class TestProcedure {
    	public static void main(String[] args) {
    		Connection conn = null;
    		CallableStatement cs = null;
    		
    		try {
    			//    
    			Class.forName("oracle.jdbc.driver.OracleDriver");
    			//    
    			conn = DriverManager.getConnection("jdbc:oracle:thin:@127.0.0.1:1521:orcl", "dog", "dog");
    				
    			cs = conn.prepareCall("{call get_book(?, ?, ?)");
          //      
    			cs.setInt(1, 1);
    			//      
    			cs.registerOutParameter(2, oracle.jdbc.OracleTypes.VARCHAR);
    			cs.registerOutParameter(3, oracle.jdbc.OracleTypes.VARCHAR);
    			
    			//  
    			cs.execute();
    			
    			//     
    			String bookName = cs.getString(2);
    			String publishHouse = cs.getString(3);
    			System.out.println("  :" + bookName + "  ---   :" + publishHouse);
    		
    		} catch (Exception e) {
    			e.printStackTrace();
    		} finally {
    			try {
    				cs.close();
    				conn.close();
    			} catch (SQLException e) {
    				e.printStackTrace();
    			}
    		}
    	}
    }
    */
    
    /*
      :         (      (   ))
             ,       out  ,    package。
      18-      ,      
    */
    
    --  book        
    --insert into book values(1, 'Thinking in Java', 'America Universe Publish', '001');
    insert into book values(2, 'Harry Potter', 'Titan Books Ltd', '001');
    insert into book values(3, 'The Accident', 'Orion Publishing Co', '001');
    
    --   :     
    --         
    create or replace package pak_ResultSet is
      type pak_cursor_type is ref cursor;
    end;
    
    --   :      
    create or replace procedure pro_ResultSet(proBookClass in number, pak_cursor out pak_ResultSet.pak_cursor_type) is
    begin
     --    
      open pak_cursor for select * from book where bookClass = proBookClass;
    end;
    
    /*Java  
    
    public class TestProcedure {
    	public static void main(String[] args) {
    		Connection conn = null;
    		CallableStatement cs = null;
    		ResultSet rs = null;
    		
    		try {
    			//    
    			Class.forName("oracle.jdbc.driver.OracleDriver");
    			//    
    			conn = DriverManager.getConnection("jdbc:oracle:thin:@127.0.0.1:1521:orcl", "dog", "dog");	
    			
    			//            ,          
    			cs = conn.prepareCall("{call pro_ResultSet(?, ?)}");
    			cs.setInt(1, 1);
    			//       
    			cs.registerOutParameter(2, oracle.jdbc.OracleTypes.CURSOR);
    			
    			cs.execute();
    			
    			//    
    			rs = (ResultSet) cs.getObject(2);
    			
    			while (rs.next()) {
    				System.out.println("   :" + rs.getInt(1) + "  ---  :" + rs.getString(2) + "  ---   :" + rs.getString(3) + "  ---  :" + rs.getString(4));
    			}
    		
    		} catch (Exception e) {
    			e.printStackTrace();
    		} finally {
    			try {
    				cs.close();
    				conn.close();
    				rs.close();
    			} catch (SQLException e) {
    				e.printStackTrace();
    			}
    		}
    	}
    }
    */
  • PL / SQL 의 예외 처리: Oacle 은 예 외 를 미리 정 의 된 예외, 미리 정 의 된 예외 와 사용자 정의 예외 세 가지 로 나 누 었 다.앞의 두 가 지 는 Oacle 오류 와 관련 된 것 을 처리 하고 발생 하 는 Oacle 오 류 는 해당 하 는 예 외 를 포함 합 니 다.사용자 정의 예 외 는 Oacle 의 오류 와 아무런 관련 이 없 으 며, 개발 자가 특정 상황 에 대해 정의 하 는 예외 입 니 다.a. 미리 정 의 된 예외: 흔히 볼 수 있 는 Oacle 오 류 를 처리 하 는 데 사용 합 니 다.미리 정 의 된 예외 가 아 닌 예 외 를 처리 하 는 데 사 용 됩 니 다.사용자 정의 예외 처리    Oacle 오류 와 무관 한 다른 상황.    Oacle 프 리 정의 예 외 는 약 20 여 개 입 니 다. 다음은 흔히 볼 수 있 는 프 리 정의 예 외 를 소개 합 니 다.
  • /*
         : no_data_found,           ,    
    */
    
    /*
         : case_not_found
    */
    create or replace procedure pro_caseException(EmployNum number) is
      v_sal emp.sal%type;
    begin
      select sal into v_sal from emp where empno = EmployNum;
      case
        when v_sal < 1000 then
          update emp set sal = sal + 200 where empno = EmployNum;
        when v_sal < 2000 then
          update emp set sal = sal + 100 where empno = EmployNum;
          --        default  ,         case,     ,       exception
      end case;
      exception when case_not_found then
        dbms_output.put_line('case not matched');
    end;
    
    /*
         : cursor_already_open
    */
    declare
      cursor emp_cursor is select ename, sal from emp;
    begin
      open emp_cursor;
      for emp_record1 in emp_cursor loop
        dbms_output.put_line(emp_record1.ename);
      end loop;
      exception when cursor_already_open then
        dbms_output.put_line('Cursor has been opened!');
    end;
    
    /*
         : dup_val_on_index                   ,         
    */
    begin
      insert into dept values(10, '   ', 'shanghai');
      
      exception when dup_val_on_index then
        dbms_output.put_line('Duplicated Deptno!');
    end;
    
    /*
         : invalid_cursor                  ,      (                 )
    */
    declare
      cursor emp_cursor is select ename, sal from emp;
      emp_record emp_cursor%rowtype;
    begin
      --open emp_cursor;
      fetch emp_cursor into emp_record;
        dbms_output.put_line(emp_record.ename);
      close emp_cursor;
      
      exception when invalid_cursor then
        dbms_output.put_line('Cursor has been closed!');
    end;
    
    /*
         : invalid_number           ,      
    */
    begin
      update emp set sal=sal + 'abc';
      
      exception when invalid_number then
        dbms_output.put_line('Number error!');
    end;
    
    /*
         : too_many_rows     select into    ,         ,       
    */
    declare
      v_ename emp.ename%type;
    begin
      select ename into v_ename from emp;
      
      exception when too_many_rows then
        dbms_output.put_line('Return too many rows!');
    end;
    
    /*
         : zero_divide     2/0    ,       
    */
    declare
      c_num number := 2;
    begin
      c_num := c_num/0;
      
      exception when zero_divide then
        dbms_output.put_line('Zero cannot be divide!');
    end;
    
    /*
         : value_error           ,                ,       
    */
    declare
      v_ename varchar2(5);
    begin
      select ename into v_ename from emp where empno = 7654;
      
      exception when value_error then
        dbms_output.put_line('Value is too large for v_ename!');
    end;
    
    /*
           :
    login_denide ---        ,      
    not_logged_on ---          dml  ,,      
    storage_error ---               ,,      
    timeout_on_resource ---   oracle          ,,      
    */
    b. 사용자 정의 예외: Oacle 의 오류 와 아무런 관련 이 없습니다. 개발 자가 특정 상황 에 정의 하 는 예외 입 니 다.
  • /*
         :
    */
    create or replace procedure test_ModifiedException(EmployeeNo number) is
      --      
      myex exception;
    begin
      update emp set sal = sal + 1000 where empno = EmployeeNo;
      --sql%notfound     update
      --raise myex;   myex   
      if sql%notfound then
        raise myex;
      end if;
      exception when myex then
        dbms_output.put_line('Myex has been occured!');
    end;
  • 보기 (View): 보 기 는 가상 표 이 고 그 내용 은 조회 에 의 해 정의 된다.실제 표 와 마찬가지 로 보 기 는 이름 이 있 는 열 과 줄 데 이 터 를 포함 합 니 다.그러나 보 기 는 데이터베이스 에 저 장 된 데이터 값 집합 형식 으로 존재 하지 않 습 니 다.줄 과 열 데 이 터 는 사용자 정의 보기 조회 에서 인용 한 표 에서 나 오고 보 기 를 참조 할 때 동적 으로 생 성 됩 니 다.보기 와 보 기 는 공동으로 조회 할 수 있다.보기 와 표 의 차이:
  • 표 는 디스크 공간 을 차지 해 야 하고 보기 가 필요 하지 않 습 니 다
  • 보 기 는 색인 을 추가 할 수 없 기 때문에 조회 속도 가 표 보다 느 립 니 다
  • 사용 시 복잡 한 조 회 를 간소화 할 수 있 음
  • 보 기 는 안전성 을 향상 시 키 는 데 유리 하 다 (서로 다른 사용자 가 서로 다른 내용 을 조회 하 는 보기, 분리 권한)
  • 문법:
    보기 만 들 기: 보기 뷰 를 만 들 거나 대치 합 니 다. Name as select... [with read only]
    보기 삭제: drop view viewName

    좋은 웹페이지 즐겨찾기