#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) Заметьте, обращение к столбцу без алиаса.
Комментариев нет:
Отправить комментарий