2009-09-25 14 views

Odpowiedz

12

myślę odpowiednikiem punktu stosuje w Oracle nazywa przyłączyć się boczne. Połączenie boczne w Oracle występuje po dołączeniu do tabeli A z funkcją F, która wyprowadza wiersze, a ta funkcja ma kolumny A jako parametry.

Zbudujmy mały przykład z tej konfiguracji:

SQL> CREATE OR REPLACE TYPE emp_row AS OBJECT (
    2  empno NUMBER(4), 
    3  ename VARCHAR(10), 
    4  job VARCHAR(9), 
    5  deptno NUMBER(2) 
    6 ); 
    7/

Type created 
SQL> CREATE OR REPLACE TYPE emp_tab AS TABLE OF emp_row; 
    2/

Type created 
SQL> CREATE OR REPLACE FUNCTION get_emp_dept(p_deptno NUMBER) RETURN emp_tab IS 
    2  l_result emp_tab; 
    3 BEGIN 
    4  SELECT emp_row(empno, ename, job, deptno) 
    5  BULK COLLECT INTO l_result 
    6  FROM emp 
    7  WHERE deptno = p_deptno; 
    8  RETURN l_result; 
    9 END get_emp_dept; 
10/

Function created 

boczny przyłączenia jest automatyczne w Oracle, nie ma specjalnego słowa kluczowego:

SQL> SELECT dept.dname, emp.empno, emp.ename, emp.job 
    2 FROM dept 
    3 CROSS JOIN TABLE(get_emp_dept(dept.deptno)) emp; 

DNAME   EMPNO ENAME  JOB 
-------------- ----- ---------- --------- 
ACCOUNTING  7782 CLARK  MANAGER 
ACCOUNTING  7839 KING  PRESIDENT 
ACCOUNTING  7934 MILLER  CLERK 
RESEARCH  7369 SMITH  CLERK 
RESEARCH  7566 JONES  MANAGER 
RESEARCH  7788 SCOTT  ANALYST 
RESEARCH  7876 ADAMS  CLERK 
RESEARCH  7902 FORD  ANALYST 
SALES   7499 ALLEN  SALESMAN 
SALES   7521 WARD  SALESMAN 
SALES   7654 MARTIN  SALESMAN 
SALES   7698 BLAKE  MANAGER 
SALES   7844 TURNER  SALESMAN 
SALES   7900 JAMES  CLERK 

14 rows selected 
+0

Czy nie lepiej używać varchar2() zamiast varchar() w definicji typu? – tuinstoel

+0

@tuinstoel: masz rację, dobrze jest używać VARCHAR2 w Oracle. –

+0

Pytanie jest nieco zbyt abstrakcyjne. Są przypadki, w których takie podejście w ogóle nie pomaga, np. http://stackoverflow.com/questions/19009476/konwersja-a-prywatna-tablica-na-niebieskim-sql –

7

W Oracle możemy użyć funkcji potokowej w klauzuli FROM za pomocą funkcji TABLE().

SQL> select * from table(get_dept_emps (10)) 
    2/

ENAME         SAL MGR 
------------------------------ ---------- --------------------- 
BOEHMER        2450 SCHNEIDER 
SCHNEIDER       5000 
KISHORE        1300 BOEHMER 

SQL> 

ten może być traktowany jak inne tabele, na przykład, przez łączenie z nim:

SQL> select t.* 
    2   , e.empno 
    3 from 
    4  table(get_dept_emps (10)) t 
    5    join emp e 
    6    on e.ename = t.ename 
    7/

ENAME    SAL MGR    EMPNO 
---------- ---------- ---------- ---------- 
BOEHMER   2450 SCHNEIDER  7782 
SCHNEIDER  5000     7839 
KISHORE   1300 BOEHMER   7934 

SQL> 
+0

dziękuję za pakiet APC .. to jest to czego oczekiwałem ... – oscar

Powiązane problemy