Oracle: requête contre la valeur du type défini par l'utilisateur
-
14-11-2019 - |
Question
J'ai un type défini par l'utilisateur:
create or replace type my_message_type
as object (relatedid varchar2(50), payload clob);
J'ai inséré un message programmatiquement. Le développeur SQL rend l'objet inséré comme:
SYNESSO.MY_MESSAGE_TYPE('abcdefgh','oracle.sql.CLOB@1dae16a')
Comment interroger ces données à l'aide de SQL? Par exemple, ce qui suit semble intuitif:
select count(1) from table_of_my_messages where user_data.relatedid = 'abcdefgh';
Mais cela se traduit par ORA-00904: "USER_DATA"."RELATEDID": invalid identifier
.
J'ai ensuite découvert que la syntaxe correcte consiste à construire le type de message et à utiliser la vérification de l'égalité. Mais comment construire une instance du type avec certains champs correspondant à any
?:
select * from table_of_my_messages where user_data = my_message_type('abcdefgh', *);
-- ORA-00936: missing expression
select * from table_of_my_messages where user_data = my_message_type('abcdefgh');
-- ORA-02315: incorrect number of arguments for default constructor
select * from table_of_my_messages where user_data = my_message_type('abcdefgh', ?);
-- Missing IN or OUT parameter at index:: 1
La solution
La version intuitive est presque correcte. Je n'avais besoin que d'alias la table pour que cela fonctionne ...
select count(1) from table_of_my_messages m
where m.user_data.relatedid = 'abcdefgh';
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow