Posted By: bam-bam (bam-bam) on 'CZdatabases'
Title:     re:jak volat order function v Oracle?
Date:      Wed Sep 25 13:27:03 2002

Zdar,

Nevite nekdo jak volat order function v oracle?

Vim jak to vytvorit, ale nikde jsem nenasel jak to pouzit.

Rekneme ze mam neco jako:

Pouziju priklad, ktery maji na oracle webu:

CREATE TYPE Customer_typ AS OBJECT (  
  id   NUMBER, 
  name VARCHAR2(20), 
  addr VARCHAR2(30), 
  ORDER MEMBER FUNCTION match (c Customer_typ) RETURN INTEGER
); 

CREATE TYPE BODY Customer_typ AS 
  ORDER MEMBER FUNCTION match (c Customer_typ) RETURN INTEGER IS 
  BEGIN 
    IF id < c.id THEN
      RETURN -1;         
    ELSIF id > c.id THEN 
      RETURN 1;              
    ELSE 
      RETURN 0;
    END IF;
  END;
END;


vytvorim tabulku a vlozim nejaky data

CREATE TABLE Customers OF Customer_typ (
id PRIMARY KEY);

--load some data

ted zkousim:

select c.name, c.match(xxx)
from Customers c;

xxx - nevim co mam pouzit, myslel jsem neco jako 

select * from Customers where id = 1; apod, ale to je blbost, zkousel jsem i 
ref ale to nefunguje

nevite nekdo jak na to?

DIk Zaba 

Tak to musim trochu obsirneji.
Kdyz das funkci objektu jako member tak ta funkce je urcena jako "porovnavaci 
funkce". Proste urcuje kterej objekt je vetsi nez druhej objekt. Je to proto 
ze v objektu muze byt vice promenych a oracle samozrejme nevi podle jake se 
to ma porovnavat (muze se to porovnavat treba podle ruznych kombinaci)
Vyjdu z tech typu co jsi tady napsal
Vytvorim tabulku s timto objektem
CREATE TABLE zakaznik 
(sloupec1 varchar2(20),
sloupec2 customer_typ) 

Naplnim nejaka data
insert into zakaznik values('aa',customer_typ(1,'AA','AAA'))
insert into zakaznik values('bb',customer_typ(2,'BB','BBB'))
insert into zakaznik values('cc',customer_typ(3,'CC','CCC'))

A ted davam dotaz
SELECT sloupec1, sloupec2
  FROM zakaznik order by sloupec2
A vidim ze se mi to radi podle te funkce. Pro vyskouseni muzes v ty funkci 
jenom prehodi +1 a -1 a uvidis ze se ti to zacne radit jinak.

Muzes tak umoznit velmi slozite razeni. Treba kdyz jsou krestni jmena od A-G 
tak radit podle prijmeni a kdyz jsou od G-Z tak radit podle adresy.
A tak podobne.
V pl/sql se to pouzije i pri porovnani dvou instanci objektu a>b.
V tabulkach se to pouzije pri dotazech kde pouzijes distinct, group by nebo 
order by .

Jestli by ti to nebylo jeste jasny tak se ozvi
Mylit se je lidske,ale neco dokonale zasmodrchat je mozne jen pomoci pocitace.
                                                                 /Artur Bloch/

Search the boards