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
Était-ce utile?

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
scroll top