2015-05-06 3 views
1

Есть ли конкретный случай, когда я должен использовать RETURN AS VALUE? Обычно я использую только NESTED TABLE xxx STORE AS xxxКакова цель «ВОЗВРАТ КАК ЗНАЧЕНИЕ» в НЕСТАЦИОННЫХ ТАБЛИЦЕ (Oracle 9i)

Например:

CREATE OR REPLACE TYPE address_t AS OBJECT (
    ADDID  NUMBER(10,0), 
    STREET  VARCHAR2(40), 
    ZIP  VARCHAR2(5), 
    CITY  VARCHAR2(40) 
) 
/

CREATE OR REPLACE TYPE addresses_nt AS TABLE OF address_t 
/

CREATE OR REPLACE TYPE invoicepos_t AS OBJECT (
    ARTID  NUMBER(10,0), 
    AMOUNT  NUMBER(10,0) 
) 
/

CREATE OR REPLACE TYPE invoicepos_nt AS TABLE OF invoicepos_t 
/

CREATE OR REPLACE TYPE customer_t AS OBJECT (
    CUSID  NUMBER(10,0), 
    FIRSTNAME VARCHAR2(30), 
    LASTNAME VARCHAR2(30), 
    ADDRESSES addresses_nt 
) 
/

CREATE OR REPLACE TYPE invoice_t AS OBJECT (
    INVOICEID NUMBER(10,0), 
    CUSTOMER REF customer_t, 
    ADDID  NUMBER(10,0), 
    POSITIONS invoicepos_nt 
) 
/

CREATE TABLE customer OF customer_t 
    NESTED TABLE ADDRESSES STORE AS all_adresses RETURN AS VALUE  
/

CREATE TABLE invoices OF invoice_t 
    NESTED TABLE POSITIONS STORE AS all_invoicepos RETURN AS VALUE 
/
+0

[Вы проверили документацию] (http://docs.oracle.com/cd/E11882_01/server 0,112/e41084/statements_7002.htm # SQLRF54547)? (Или [9i версия] (http://docs.oracle.com/cd/B10501_01/server.920/a96540/statements_73a.htm#2129071)). –

+0

Да, но я не знаю, когда его использовать или для чего? – wundidajah

ответ

1

Насколько я могу судить, единственное различие заключается в том, что локаторы немного быстрее, чем Values. Но это не имеет смысла, и я надеюсь, что кто-то докажет мне свою ошибку; почти нет переключателя «fast = true».


Согласно SQL Language Reference:

RETURN [AS] Specify what Oracle Database returns as the result of a query. 

    VALUE returns a copy of the nested table itself. 

    LOCATOR returns a collection locator to the copy of the nested table. 

    The locator is scoped to the session and cannot be used across sessions. Unlike a LOB locator, the collection locator cannot be used to modify the collection instance. 

Это означает, что локаторы только для чтения. Но на 11gR2 LOCATOR все еще может быть изменен.

Object Relational Developer's Guide также обсуждает LOCATOR, но не упоминает о недостатках их использования.

Пример схемы

CREATE OR REPLACE TYPE invoicepos_t AS OBJECT (
    ARTID  NUMBER(10,0), 
    AMOUNT  NUMBER(10,0) 
) 
/

CREATE OR REPLACE TYPE invoicepos_nt AS TABLE OF invoicepos_t 
/

create table invoices_val 
(
    INVOICEID NUMBER, 
    POSITIONS invoicepos_nt 
) 
    NESTED TABLE POSITIONS STORE AS all_invoicepos_val RETURN AS VALUE 
/

create table invoices_loc 
(
    INVOICEID NUMBER, 
    POSITIONS invoicepos_nt 
) 
    NESTED TABLE POSITIONS STORE AS all_invoicepos_loc RETURN AS locator 
/

insert into invoices_val values(1, invoicepos_nt(invoicepos_t(1,1))); 
insert into invoices_loc values(1, invoicepos_nt(invoicepos_t(1,1))); 
insert into invoices_def values(1, invoicepos_nt(invoicepos_t(1,1))); 
commit; 

Сравните производительность и funcionality

--Value: 1.0 seconds 
declare 
    v_positions invoicepos_nt; 
begin 
    for i in 1 .. 10000 loop 
     select positions 
     into v_positions 
     from invoices_val; 
    end loop; 

    v_positions.extend; 
    v_positions(2) := invoicepos_t(3,3); 
    update invoices_val set positions = v_positions; 
end; 
/

--Locator: 0.8 seconds 
declare 
    v_positions invoicepos_nt; 
begin 
    for i in 1 .. 10000 loop 
     select positions 
     into v_positions 
     from invoices_loc; 
    end loop; 

    v_positions.extend; 
    v_positions(2) := invoicepos_t(3,3); 
    update invoices_loc set positions = v_positions; 
end; 
/