2009-09-25 3 views

ответ

12

Я думаю, что эквивалент СОХРАНИТЬ пункта в Oracle называется боковой JOIN. Боковое соединение в Oracle - это когда вы присоединяетесь к таблице A с функцией F, которая выводит строки, и эта функция имеет столбцы из A в качестве параметров.

Давайте создадим небольшой пример с этой установкой:

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 

Боковое соединение является автоматическим в Oracle, не существует никакого специального ключевого слова:

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

Не лучше ли использовать varchar2() вместо этого varchar() в определении типа? – tuinstoel

+0

@tuinstoel: вы правы, это хорошая привычка использовать VARCHAR2 в Oracle. –

+0

Вопрос слишком абстрактный. Бывают случаи, когда такой подход вообще не помогает, например. http://stackoverflow.com/questions/19009476/converting-a-pivot-table-to-flat-table-in-oracle-sql –

7

В Oracle мы можем использовать конвейерную функцию в предложении FROM с помощью функции TABLE().

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

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

SQL> 

Это может рассматриваться как любой другой таблицы, например, путем присоединения к нему:

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

благодарит кучу APC .. это то, что я ожидал .... – oscar

Смежные вопросы