CREATE OR REPLACE FUNCTION layer2layerAttribute RETURN VARCHAR2 AS
/**
* Cette fonction joint correctement toutes les couches à leurs champs appropriés
*/
cursor PLACES is select * from layer l where l.layer_name like '%place%';
BEGIN
FOR place IN PLACES
LOOP
Insert all
into LAYER_JOIN_LAYER_ATTRIBUTE (ID_LAYER, ID_LAYER_ATTRIBUTE)
values (place.id_layer, select id_layer_attribute from layer_attribute where name_attribute = 'filter.street')
into LAYER_JOIN_LAYER_ATTRIBUTE (ID_LAYER, ID_LAYER_ATTRIBUTE)
values (place.id_layer, select id_layer_attribute from layer_attribute where name_attribute = 'filter.city')
into LAYER_JOIN_LAYER_ATTRIBUTE (ID_LAYER, ID_LAYER_ATTRIBUTE)
values (place.id_layer, select id_layer_attribute from layer_attribute where name_attribute = 'filter.state')
into LAYER_JOIN_LAYER_ATTRIBUTE (ID_LAYER, ID_LAYER_ATTRIBUTE)
values (place.id_layer, select id_layer_attribute from layer_attribute where name_attribute = 'filter.zip')
into LAYER_JOIN_LAYER_ATTRIBUTE (ID_LAYER, ID_LAYER_ATTRIBUTE)
values (place.id_layer, select id_layer_attribute from layer_attribute where name_attribute = 'filter.country')
select * from dual;
END LOOP;
RETURN null;
END layer2layerAttribute;
Réponse
Trop de publicités?Vous le pouvez, mais vous ne pouvez pas utiliser un select
à l'intérieur de la clause values
, ou à la place de la clause values
pour chaque into
. Vous pouvez soit utiliser des valeurs, soit une seule sous-requête. (Voir le diagramme de syntaxe). Je ne suis pas sûr non plus pourquoi vous utilisez un curseur, plutôt que d'avoir le select de layer
comme sous-requête au lieu de sélectionner de dual
.
Vous pouvez le faire avec une seule insertion cependant et passer à côté du curseur explicite en même temps; dans une procédure (plutôt qu'une fonction puisque vous n'avez pas besoin de retourner quoi que ce soit, et les fonctions ne sont généralement pas utilisées lorsque les données peuvent être mises à jour) si nécessaire:
CREATE OR REPLACE PROCEDURE layer2layerAttribute AS
BEGIN
insert into layer_join_layer_attribute (id_layer, id_layer_attribute)
select l.id_layer, la.id_layer_attribute
from layer l
cross join layer_attribute la
where l.layer_name like '%place%'
and la.name_attribute in ('filter.street', 'filter.city', 'filter.state',
'filter.zip', 'filter.country');
END layer2layerAttribute;
Bien que cela ressemble à une tâche ponctuelle pour peupler une nouvelle table, vous pourriez donc être en mesure de l'exécuter en tant que simple déclaration SQL. Si ce n'est pas ponctuel, vous obtiendrez des doublons lors de la deuxième exécution à moins de les vérifier et de les exclure.