Страницы

Поиск по вопросам

воскресенье, 15 декабря 2019 г.

Приведение записи из выборки к пользовательскому типу и обращение к столбцу

#sql #oracle


Нужно привести record из select к пользовательскому типу.

Создан тип:

create or replace type test_rec is object (
   name varchar2(10),
   id number
)


Сам запрос:

select *
  from (SELECT test_rec(ID, NAME)
          FROM (select '1' as id, 'Вася' as name
                  from dual
                union all
                select '2' as id, 'Маша' as name
                  from dual))
  where id = 2


Возникает ошибка:


  ora-00904 "ID" invalid identifier. 


Без условия  where id = 2 все работает. Можно ли как-то обратится к столбцу после
приведения к типу? Желательно без алиасов.
    


Ответы

Ответ 1



Вы селектитке объектный тип, поэтому id у него - поле, а не столбец. Не очень понятно желание "без алиасов", но рабочий вариант выглядит так - select * from (SELECT test_rec(NAME, ID) as val FROM (select 'Вася' as name, 1 as id from dual union all select 'Маша' as name, 2 as id from dual)) s where s.val.id = 2

Ответ 2



Можно ли как-то обратится к столбцу после приведения к типу? Желательно без алиасов. Можно конечно, но в вопросе обращение к аттрибуту столбца, и тут без алиаса нельзя, о чём прямо сказано в кап. 2.1.8.1 When Table Aliases Are Required. You must qualify a reference to an object attribute or subprogram with a table alias rather than a table name even if the table name is itself qualified by a schema name. Кроме того, порядок аргументов в конструкторе пользовательского типа нарушен. Надо так: первое условие - по столбцу, второе - по аттрибуту столбца: with data as ( select test_rec ('Вася', 1) as rec from dual union all --select test_rec (66, 'Ой') from dual union all --ORA-01722: invalid number select test_rec ('Маша', 2) from dual ) select * from data d where rec = test_rec ('Маша', 2) and d.rec.id = 2 ; REC ---------------------------- SH.TEST_REC(Маша, 2) Заметьте, обращение к столбцу без алиаса.

Комментариев нет:

Отправить комментарий