2013-03-01 2 views
2

현재 oracle 11g에 type 객체가 있습니다.유형 객체에 색인을 만드는 방법은 무엇입니까?

  1. 테이블

    CREATE TABLE students 
        (rollno NUMBER(15) primary key, s_Name VARCHAR2(20), Marks type_1 
    ); 
    
  2. 유형의 객체 사양 그것은 몸

    CREATE OR REPLACE type body type_1 
    AS 
        member FUNCTION total 
        RETURN NUMBER 
    IS 
    BEGIN 
        RETURN (sub_1+sub_2+sub_3); 
    END; 
    member FUNCTION e_result 
        RETURN VARCHAR2 
    IS 
        DECLARE 
        temp NUMBER; 
        BEGIN 
        temp :=sub_1+sub_2+sub_3; 
        IF(temp>50) THEN 
         RETURN ('pass'); 
        ELSE 
         RETURN ('fail'); 
        END IF; 
        END; 
    END; 
    
,536,913,632에게의

CREATE OR REPLACE type type_1 
AS 
    object 
    (
    sub_1 NUMBER, 
    sub_2 NUMBER, 
    sub_3 NUMBER, 
    member FUNCTION total 
    RETURN NUMBER, 
    member FUNCTION e_result 
    RETURN VARCHAR2); 
  • 입니다 : 다음과 같이에서 난 DB 개체가 10

    은 후 나는 성공적으로 내가 tote_result 열 및 일반 인덱스 비트 맵 인덱스를 만들 필요가

    BEGIN 
    FOR i IN 1..800 LOOP 
         FOR j IN 1..400 LOOP 
    INSERT INTO students 
    VALUES  (sequence1.NEXTVAL, 
          dbms_random.String('A', 5), 
          Type_1(Round(dbms_random.Value(10, 100)), Round(
          dbms_random.Value(10, 100)), Round(dbms_random.Value(10, 100)))); 
    END LOOP; 
    END LOOP; 
    
    dbms_output.Put_line('completed'); 
    
    COMMIT; 
    END; 
    
    /
    

    사용하여 학생 테이블을 채워 한 경우에도 모든 일을 만들 수 있습니다.

    나는

    create index id1 on students(marks.total) 
    

    create bitmap index bid1 on students(marks.e-result) 
    

    을 시도하지만 수 없습니다. 내가 뭘해야하니?

  • +0

    궁금한 점은 왜 객체의 중첩 테이블을 만들겠습니까? 단순히 MARKS 테이블을 만들고 필요에 따라 학생과 합류하는 것보다? 하지만 이것은 pl/sql에서의 연습 일뿐일까요? – tbone

    +0

    @ tbone : ya ya ya 정확하게 ... 이것은 유형의 객체 야! –

    답변

    4

    먼저 SQL 인덱스에 사용하기 위해 함수를 DETERMINISTIC으로 선언해야합니다. 즉 동일한 입력을 제공하면 동일한 출력을 제공한다는 것을 Oracle에 주장해야합니다.

    예 :

    SQL> create index id1 on students (marks.total()); 
    
    Index created. 
    
    SQL> create bitmap index bid1 on students(marks.e_result()); 
    
    Index created. 
    

    는 다음 인덱스가 사용 표시되어야합니다 :

    SQL> CREATE OR REPLACE type type_1 
        2 AS 
        3 object 
        4 (
        5  sub_1 NUMBER, 
        6  sub_2 NUMBER, 
        7  sub_3 NUMBER, 
        8  member FUNCTION total 
        9  RETURN NUMBER deterministic, 
    10  member FUNCTION e_result 
    11  RETURN VARCHAR2 deterministic 
    12 ); 
    13/
    
    Type created. 
    
    SQL> CREATE OR REPLACE type body type_1 
        2 AS 
        3 member FUNCTION total 
        4 RETURN NUMBER deterministic 
        5 IS 
        6 BEGIN 
        7 RETURN (sub_1+sub_2+sub_3); 
        8 END; 
        9 member FUNCTION e_result 
    10 RETURN VARCHAR2 deterministic 
    11 IS 
    12  temp NUMBER; 
    13 BEGIN 
    14  temp :=sub_1+sub_2+sub_3; 
    15  IF(temp>50) THEN 
    16  RETURN ('pass'); 
    17  ELSE 
    18  RETURN ('fail'); 
    19  END IF; 
    20 END; 
    21 END; 
    22/
    

    은 둘째로 당신은 그렇지 않으면 그것을 total라는 이름의 열을 가정 할 함수를 호출 할 때 ()을 사용해야합니다

    SQL> exec dbms_stats.gather_table_stats(user, 'STUDENTS', method_opt=>'for all indexed columns size skewonly') 
    
    PL/SQL procedure successfully completed. 
    
    SQL> explain plan for select * from students s where s.marks.e_result() = 'fail'; 
    
    Explained. 
    
    SQL> @explain "" 
    
    Plan hash value: 1595221732 
    
    ----------------------------------------------------------------------------------------- 
    | Id | Operation     | Name  | Rows | Bytes | Cost (%CPU)| Time  | 
    ----------------------------------------------------------------------------------------- 
    | 0 | SELECT STATEMENT    |   | 635 | 17780 | 109 (0)| 00:00:02 | 
    | 1 | TABLE ACCESS BY INDEX ROWID | STUDENTS | 635 | 17780 | 109 (0)| 00:00:02 | 
    | 2 | BITMAP CONVERSION TO ROWIDS|   |  |  |   |   | 
    |* 3 | BITMAP INDEX SINGLE VALUE | BID1  |  |  |   |   | 
    ----------------------------------------------------------------------------------------- 
    
    +0

    : 함수 기반 인덱스와 비슷합니까? –

    +0

    @ThiyaguATR 이들은 함수 색인입니다 (객체 함수에서 만들어 짐). – DazzaL

    +0

    : 나중에 감사합니다. 젠체하는 사람. –

    관련 문제