2013-03-01 77 views
2

目前我正在使用oracle 11g中的類型對象。在這方面,我有DB對象如下:如何在類型對象上創建索引?

  1. CREATE TABLE students 
        (rollno NUMBER(15) primary key, s_Name VARCHAR2(20), Marks type_1 
    ); 
    
  2. 類型對象規範是

    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); 
    
  3. 它的機身

    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; 
    

創建畢竟這些事情,甚至我已經成功地使用填充

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; 

/

我需要在tot列上e_result列和普通索引創建位圖索引的學生表。

我已經試過

create index id1 on students(marks.total) 

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

但我不能。我應該做些什麼?

+0

只是好奇你爲什麼要創建一個對象的嵌套表rathe而不是簡單地創建一個MARKS表並根據需要加入學生?但是,也許這只是pl/sql的練習? – tbone 2013-03-04 12:08:30

+0

@ tbone:你正好...這只是與類型的對象夥計的做法! – 2013-03-04 12:48:53

回答

4

首先,您必須將您的函數聲明爲DETERMINISTIC,以便在SQL索引中使用它們(即,您必須向給予相同輸入的Oracle斷言,它們給出相同的輸出)。

如:

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> create index id1 on students (marks.total()); 

Index created. 

SQL> create bitmap index bid1 on students(marks.e_result()); 

Index created. 

,那麼你應該看到所用的索引

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

:它是否像基於函數的索引? – 2013-03-01 10:44:19

+0

@ThiyaguATR它們是函數索引(因爲它們是在對象函數上創建的)。 – DazzaL 2013-03-01 10:48:25

+0

:雅很好謝謝你的傢伙 – 2013-03-01 11:30:22