powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Как работать с CAST(MULTISET(...))
21 сообщений из 21, страница 1 из 1
Как работать с CAST(MULTISET(...))
    #32940723
Andrey.L
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Oracle 8i
Есть такой запрос
SELECT ..., CAST(MULTISET(SELECT f1,f2 FROM ...) AS TType) cm FROM ...
Можно ли его запхнуть во вьюху и нормально работать?
Как вообще к полям f1,f2 обращаться?
...
Рейтинг: 0 / 0
Как работать с CAST(MULTISET(...))
    #32940971
Belka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
CAST(MULTISET(...)) используется для преобразования данных из селекта к вложенному массиву(таблице) так что мне не совсем ясно почему вы их используете в данном случае.
Приведите запрос полностью, может тогда яснее будет
...
Рейтинг: 0 / 0
Как работать с CAST(MULTISET(...))
    #32942255
Фотография SY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Below is an example:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
SQL> DESC EMP_TYPE
 Name                                      Null?    Type
 ----------------------------------------- -------- ----------------------------
 EMPNO                                              NUMBER
 ENAME                                              VARCHAR2( 100 )

SQL> DESC EMP_TBL_TYPE;
 EMP_TBL_TYPE TABLE OF EMP_TYPE
 Name                                      Null?    Type
 ----------------------------------------- -------- ----------------------------
 EMPNO                                              NUMBER
 ENAME                                              VARCHAR2( 100 )

SQL> CREATE VIEW EVIEW
   2   AS
   3   SELECT CAST(MULTISET(SELECT EMPNO,ENAME FROM EMP) AS EMP_TBL_TYPE) E FROM DUAL;

View created.

SQL> SELECT VALUE(P) FROM TABLE(SELECT E FROM EVIEW) P;

VALUE(P)(EMPNO, ENAME)
--------------------------------------------------------------------------------
EMP_TYPE( 7369 , 'SMITH')
EMP_TYPE( 7499 , 'ALLEN')
EMP_TYPE( 7521 , 'WARD')
EMP_TYPE( 7566 , 'JONES')
EMP_TYPE( 7654 , 'MARTIN')
EMP_TYPE( 7698 , 'BLAKE')
EMP_TYPE( 7782 , 'CLARK')
EMP_TYPE( 7788 , 'SCOTT')
EMP_TYPE( 7839 , 'KING')
EMP_TYPE( 7844 , 'TURNER')
EMP_TYPE( 7876 , 'ADAMS')

VALUE(P)(EMPNO, ENAME)
--------------------------------------------------------------------------------
EMP_TYPE( 7900 , 'JAMES')
EMP_TYPE( 7902 , 'FORD')
EMP_TYPE( 7934 , 'MILLER')

 14  rows selected.

SQL> SELECT VALUE(P).ENAME FROM TABLE(SELECT E FROM EVIEW) P;

VALUE(P).ENAME
--------------------------------------------------------------------------------
SMITH
ALLEN
WARD
JONES
MARTIN
BLAKE
CLARK
SCOTT
KING
TURNER
ADAMS

VALUE(P).ENAME
--------------------------------------------------------------------------------
JAMES
FORD
MILLER

 14  rows selected.


SQL> SELECT VALUE(P).ENAME FROM TABLE(SELECT E FROM EVIEW) P where VALUE(P).EMPNO =  7369 ;

VALUE(P).ENAME
--------------------------------------------------------------------------------
SMITH

SQL> 

SY.
...
Рейтинг: 0 / 0
Как работать с CAST(MULTISET(...))
    #32952970
Andrey.L
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Спасибо за отклики.
Раньше не смог ответить грипп свалил.

Теперь к делу:
Вот эта часть не работает VALUE(P).ENAME
Ругается ORA-03001 unimplemented feature
...
Рейтинг: 0 / 0
Как работать с CAST(MULTISET(...))
    #32952998
Andrey.L
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот Тест:

SQL> CREATE OR REPLACE TYPE T_R_Podr_Day AS OBJECT (Podr_Id NUMBER, Date_Start DATE, Date_Finish DATE)
2 /

Type created.

SQL> CREATE OR REPLACE TYPE T_T_Podr_Day AS TABLE OF T_R_Podr_Day
2 /

Type created.

SQL> CREATE OR REPLACE VIEW test_podr AS
2 SELECT CAST(MULTISET(SELECT podr_id, date_start, date_finish FROM podr_day) AS T_T_Podr_Day) ppdd FROM dual
3 /

View created.

SQL> SELECT VALUE(p)
2 FROM TABLE(SELECT ppdd FROM test_podr) p
3 /

VALUE(P)(PODR_ID, DATE_START, DATE_FINISH)
--------------------------------------------------
T_R_PODR_DAY(1101, '01.01.95', '31.10.02')
T_R_PODR_DAY(1103, '01.01.95', '01.01.00')
T_R_PODR_DAY(1104, '01.01.95', '01.01.00')
T_R_PODR_DAY(1115, '01.01.90', '01.01.00')
T_R_PODR_DAY(1099, '01.01.95', '01.01.00')

SQL> SELECT VALUE(p).Podr_Id
2 FROM TABLE(SELECT ppdd FROM test_podr) p
3 /
SELECT VALUE(p).Podr_Id
*
ERROR at line 1:
ORA-03001: unimplemented feature
...
Рейтинг: 0 / 0
Как работать с CAST(MULTISET(...))
    #32953023
Andrey.L
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Для Belka

Весь запрос приводить не буду, очень большой.
Попробую объяснить:
Во FROM запхнуть нет возможности, т.к. запрос там иерархический для каждой строки и может возвращать больше одной строки, в WHERE - неприемлемо долго работает.
...
Рейтинг: 0 / 0
Как работать с CAST(MULTISET(...))
    #32953063
DimaR
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
не забуть

/*+ NO_MERGE(test_podr) */

):
...
Рейтинг: 0 / 0
Как работать с CAST(MULTISET(...))
    #32953121
Andrey.L
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DimaRне забуть

/*+ NO_MERGE(test_podr) */

):

Не помогло
...
Рейтинг: 0 / 0
Как работать с CAST(MULTISET(...))
    #32953287
Stax.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А так чем не походит?
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
SQL> select d.deptno,tt.ename
   2   from dept d,
   3   TABLE(CAST(MULTISET(SELECT * FROM EMP e where e.deptno=d.deptno) AS tt_emp)) tt
   4   /

   DEPTNO ENAME
--------- ----------
        20  SMITH
        30  ALLEN
        30  WARD
        20  JONES
        30  MARTIN
        30  BLAKE
        10  CLARK
        20  SCOTT
        10  KING
        30  TURNER
        20  ADAMS
        30  JAMES
        20  FORD
        10  MILLER
        40  STAX

 15  rows selected.
SQL> commit;
Commit complete.

...
Рейтинг: 0 / 0
Как работать с CAST(MULTISET(...))
    #32955022
Andrey.L
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
На самом деле часть запроса примерно такая CAST(MULTISET(SELECT ... FROM ... CONNECT BY ... START WITH ...)) и нужно это дело для каждой строки.
...
Рейтинг: 0 / 0
Как работать с CAST(MULTISET(...))
    #32955257
Stax.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Andrey.LНа самом деле часть запроса примерно такая CAST(MULTISET(SELECT ... FROM ... CONNECT BY ... START WITH ...)) и нужно это дело для каждой строки.так он (table/the) для каждой строки и выполнится,
что-то я запутался в проблеме
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
   1   select d.deptno,d.dname,tt.ename
   2     from dept d,
   3     TABLE(CAST(MULTISET(
   4                SELECT *
   5                FROM EMP e where e.deptno=d.deptno
   6                connect by prior empno = mgr
   7 *              ) AS tt_emp)) tt
SQL> /

   DEPTNO DNAME          ENAME
--------- -------------- ----------
        10  ACCOUNTING     CLARK
        10  ACCOUNTING     MILLER
        10  ACCOUNTING     KING
        10  ACCOUNTING     CLARK
        10  ACCOUNTING     MILLER
        10  ACCOUNTING     MILLER
        20  RESEARCH       SMITH
        20  RESEARCH       JONES
        20  RESEARCH       SCOTT
        20  RESEARCH       ADAMS
        20  RESEARCH       FORD
        20  RESEARCH       SMITH
        20  RESEARCH       SCOTT
        20  RESEARCH       ADAMS
        20  RESEARCH       JONES
        20  RESEARCH       SCOTT
        20  RESEARCH       ADAMS
        20  RESEARCH       FORD
        20  RESEARCH       SMITH
        20  RESEARCH       ADAMS
        20  RESEARCH       FORD
        20  RESEARCH       SMITH
        30  SALES          ALLEN
        30  SALES          WARD
        30  SALES          MARTIN
        30  SALES          BLAKE
        30  SALES          ALLEN
        30  SALES          WARD
        30  SALES          MARTIN
        30  SALES          TURNER
        30  SALES          JAMES
        30  SALES          BLAKE
        30  SALES          ALLEN
        30  SALES          WARD
        30  SALES          MARTIN
        30  SALES          TURNER
        30  SALES          JAMES
        30  SALES          TURNER
        30  SALES          JAMES
        40  OPERATIONS     STAX

 40  rows selected.

...
Рейтинг: 0 / 0
Как работать с CAST(MULTISET(...))
    #32958443
Andrey.L
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Большое спасибо, помогло.
Не думал, что конструкция
Код: plaintext
1.
2.
3.
4.
5.
6.
...
FROM dept d,
        TABLE(CAST(MULTISET(
               SELECT *
                  FROM EMP e 
                  WHERE e.deptno=d.deptno
...
работает.
...
Рейтинг: 0 / 0
Как работать с CAST(MULTISET(...))
    #32958514
erny
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Всем привет, решил разобраться с CAST(MULTISET(...)), и зашол в тупик, если незатруднит, подскажите выход
Подскажите в использование cast(multiset(SELECT............
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
Как работать с CAST(MULTISET(...))
    #39380110
igrsql
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Stax.,
А это нормально, что в этом примере иерархический запрос цепляет к крайнему SMITH-у (не имеющему подчиненых) всех, начиная с JONES-а?
Испытал на версии 12.1 - до сих пор это происходит (строки с 11 по 16). Это баг или фича?
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
SELECT level,e.ename
  FROM scott.EMP e where e.deptno=20
connect by prior empno = mgr

   	LEVEL	ENAME
1	1	SCOTT
2	2	ADAMS
3	1	FORD
4	2	SMITH
5	1	ADAMS
6	1	JONES
7	2	SCOTT
8	3	ADAMS
9	2	FORD
10	3	SMITH
11	1	SMITH
12	2	JONES
13	3	SCOTT
14	4	ADAMS
15	3	FORD
16	4	SMITH

;
...
Рейтинг: 0 / 0
Как работать с CAST(MULTISET(...))
    #39380114
igrsql
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
В версии с рекурсивным WITH все соединяется корректно
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
WITH
  empdep (lvl, ename, empno, mgr) AS
  (
     SELECT 1 as lvl, ename, empno, mgr
     FROM scott.emp e
     WHERE e.deptno = 20
   UNION ALL
     SELECT lvl+1, e.ename, e.empno, e.mgr
     FROM empdep ed, scott.emp e
     WHERE ed.empno = e.mgr
  )
  SEARCH DEPTH FIRST BY ename SET order1
SELECT lvl, ename
FROM empdep
order by order1
;

1	1	ADAMS
2	1	FORD
3	2	SMITH
4	1	JONES
5	2	FORD
6	3	SMITH
7	2	SCOTT
8	3	ADAMS
9	1	SCOTT
10	2	ADAMS
11	1	SMITH



но эту конструкцию не удается в лоб обернуть в MULTISET

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
select d.deptno,d.dname,tt.*
  from scott.dept d,
  TABLE(CAST(MULTISET(
WITH
  empdep (lvl, ename, empno, mgr) AS
  (
     SELECT 1 as lvl, ename, empno, mgr
     FROM scott.emp e
     WHERE e.deptno = d.deptno
   UNION ALL
     SELECT lvl+1, e.ename, e.empno, e.mgr
     FROM empdep ed, scott.emp e
     WHERE ed.empno = e.mgr
  )
  SEARCH DEPTH FIRST BY ename SET order1
SELECT ename
FROM empdep
order by order1
              )as sys.odciVarchar2list)) tt
;              



d.deptno внутрь не передается. А есть такая возможность?
...
Рейтинг: 0 / 0
Как работать с CAST(MULTISET(...))
    #39380132
stax..
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
igrsql,
імхо, вхере после коннест

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
SQL> SELECT level,lpad(' ',2*level)||e.ename ename,prior ename p_ename
  2    FROM EMP e where e.deptno=20
  3  connect by prior empno = mgr
  4  /

     LEVEL ENAME                          P_ENAME
---------- ------------------------------ ----------
         1   SCOTT
         2     ADAMS                      SCOTT
         1   FORD
         2     SMITH                      FORD
         1   ADAMS
         1   JONES
         2     SCOTT                      JONES
         3       ADAMS                    SCOTT
         2     FORD                       JONES
         3       SMITH                    FORD
         1   SMITH
         2     JONES                      KING
         3       SCOTT                    JONES
         4         ADAMS                  SCOTT
         3       FORD                     JONES
         4         SMITH                  FORD

16 rows selected.


Execution Plan
----------------------------------------------------------
Plan hash value: 1049058573

--------------------------------------------------------------------------------------
| Id  | Operation                     | Name | Rows  | Bytes | Cost (%CPU)| Time     |
--------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT              |      |    14 |   238 |     5   (0)| 00:00:01 |
|*  1 |  FILTER                       |      |       |       |            |          |
|*  2 |   CONNECT BY WITHOUT FILTERING|      |       |       |            |          |
|   3 |    TABLE ACCESS FULL          | EMP  |    14 |   238 |     5   (0)| 00:00:01 |
--------------------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

   1 - filter("E"."DEPTNO"=20)
   2 - access("MGR"=PRIOR "EMPNO")


  1  SELECT level,lpad(' ',2*level)||e.ename ename,prior ename p_ename
  2  from (select * from EMP e where e.deptno=20 and rownum<19620105) e
  3* connect by prior empno = mgr
SQL> /

     LEVEL ENAME                          P_ENAME
---------- ------------------------------ ----------
         1   SCOTT
         2     ADAMS                      SCOTT
         1   FORD
         2     SMITH                      FORD
         1   ADAMS
         1   JONES
         2     SCOTT                      JONES
         3       ADAMS                    SCOTT
         2     FORD                       JONES
         3       SMITH                    FORD
         1   SMITH

11 rows selected.


Execution Plan
----------------------------------------------------------
Plan hash value: 2279976590

-----------------------------------------------------------------------------------------------
| Id  | Operation                      | Name         | Rows  | Bytes | Cost (%CPU)| Time     |
-----------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT               |              |     5 |   165 |     1   (0)| 00:00:01 |
|*  1 |  CONNECT BY WITHOUT FILTERING  |              |       |       |            |          |
|   2 |   VIEW                         |              |     5 |   165 |     1   (0)| 00:00:01 |
|*  3 |    COUNT STOPKEY               |              |       |       |            |          |
|   4 |     TABLE ACCESS BY INDEX ROWID| EMP          |     5 |    85 |     1   (0)| 00:00:01 |
|*  5 |      INDEX RANGE SCAN          | I$EMP$DEPTNO |     5 |       |     1   (0)| 00:00:01 |
-----------------------------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

   1 - access("MGR"=PRIOR "EMPNO")
   3 - filter(ROWNUM<19620105)
   5 - access("E"."DEPTNO"=20)



......
stax
...
Рейтинг: 0 / 0
Как работать с CAST(MULTISET(...))
    #39380133
Фотография suPPLer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
igrsqlЭто баг или фича?

это отсутствие START WITH и ORDER SIBLINGS BY. Вы ошибаетесь, когда думаете, что задаёте стартовый набор при помощи WHERE e.deptno = 20. RTFM Hierarchical queries .
...
Рейтинг: 0 / 0
Как работать с CAST(MULTISET(...))
    #39380137
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
igrsqlА это нормально, что в этом примере иерархический запрос цепляет к крайнему SMITH-у (не имеющему подчиненых) всех, начиная с JONES-а?Тебе это только показалось из-за крайне неудачного select-list-а.
igrsqlЭто баг или фича?Такое всегда происходит, когда все у корен яются руководить.
...
Рейтинг: 0 / 0
Как работать с CAST(MULTISET(...))
    #39380142
stax..
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
igrsql,

не все скопировал
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
  1  SELECT level,lpad(' ',2*level)||e.ename ename,prior ename p_ename
  2    FROM EMP e --where e.deptno=20
  3  connect by prior empno = mgr
  4* start with  e.deptno=20
SQL> /

     LEVEL ENAME                          P_ENAME
---------- ------------------------------ ----------
         1   SCOTT
         2     ADAMS                      SCOTT
         1   FORD
         2     SMITH                      FORD
         1   ADAMS
         1   JONES
         2     SCOTT                      JONES
         3       ADAMS                    SCOTT
         2     FORD                       JONES
         3       SMITH                    FORD
         1   SMITH

11 rows selected.


....
stax
...
Рейтинг: 0 / 0
Как работать с CAST(MULTISET(...))
    #39380155
igrsql
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
stax..,
И в самом деле, все по перечитанной документации:
-The CONNECT BY condition is evaluated.
-Any remaining WHERE clause predicates are evaluated.

сначала строится полная иерархия (кусок её ниже)
Код: plsql
1.
2.
3.
4.
5.
6.
7.
1	SMITH	20
1	KING	10
2	JONES	20
3	SCOTT	20
4	ADAMS	20
3	FORD	20
4	SMITH	20


затем отфильтровывается строка KING-а и оп-па - SMITH "склеился" с деревом KING-а.
Спасибо.

Остался второй вопрос: "multiset" и "with subquery factoring", дружат?
...
Рейтинг: 0 / 0
Как работать с CAST(MULTISET(...))
    #39380228
Фотография suPPLer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
igrsqlОстался второй вопрос: "multiset" и "with subquery factoring", дружат?

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
select * 
  from table(
         cast(
           multiset(
             with t(n) as (
               select 1 from dual
                union all
               select t.n + 1
                 from t
                where t.n < 10 
             )
             select * from t
           ) as sys.odcinumberlist
         ) 
       )



Проблема в том, что Вы пытаетесь скоррелировать этот самый subquery factoring с полем внешнего запроса. И даже если Вы перепишете запрос с использованием LATERAL, похоже, что подобная корреляция в subquery factoring не поддерживается:
авторYou can specify this left correlation anywhere within subquery (such as the SELECT, FROM, and WHERE clauses) and at any nesting level.
...
Рейтинг: 0 / 0
21 сообщений из 21, страница 1 из 1
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Как работать с CAST(MULTISET(...))
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]