Oracle / OWB: Spécification de la partition pour INSÉRER au moment de l'exécution
(Contexte: nous sommes en cours d'exécution d'un entrepôt de données intégré avec Oracle Warehouse Builder. Récemment, nous avons commencé à recevoir beaucoup de "ORA-02049: distribué le délai d'expiration de transaction lors de l'attente de verrou" des erreurs. La raison pour cela est que nous sommes en exécutant plusieurs ETL jobs en parallèle, et chacun de ces emplois ne un INSERT /*+APPEND PARALLEL*/
dans notre mise en scène de la table. Cette mise en scène de la table est partitionnée par la source de l'ID du système. )
Je voudrais savoir si il est possible de spécifier la clé de partition pour une INSERTION au moment de l'exécution.
Supposons que j'ai une table
create table tmp_loading_table (
etl_source_system_fk number not null enable,
object_id number not null enable,
object_name varchar2(30) not null enable
)
PARTITION BY LIST ("ETL_SOURCE_SYSTEM_FK")
(PARTITION "ESS1" VALUES (1),
PARTITION "ESS2" VALUES (2)
);
alors je peux insérer dans une partition spécifique à l'aide de
insert /*+ APPEND PARALLEL("TMP_LOADING_TABLE") */
into tmp_loading_table partition(ESS1) (
etl_source_system_fk, object_id, object_name)
(select 1 etl_source_system_fk, object_id, object_name from user_objects);
mais cela m'oblige à coder en dur le nom de la partition.
Depuis notre OWB mappages sont génériques (ils obtenir le code source du système d'ID en paramètre), j'aimerais fournir le nom de la partition lors de l'exécution, quelque chose comme
insert /*+ APPEND PARALLEL("TMP_LOADING_TABLE") */
into tmp_loading_table partition(:partition_name) (
etl_source_system_fk, object_id, object_name)
(select 1 etl_source_system_fk, object_id, object_name from user_objects);
Est-ce possible? Si non, est-il une autre méthode pour réaliser ce avec Oracle Warehouse Builder?
Vous devez vous connecter pour publier un commentaire.
La
PARTITION
et de syntaxe SQL dynamique peut vous aider.Idéalement ce serait aussi simple:
Malheureusement le code ci-dessus échoue avec
ORA-14108: illegal partition-extended table name syntax
. Ce qui est étrange, car ça me paraît évidentpour que la syntaxe.
Ajout dynamique de SQL supprime l'erreur.
Je ne suis pas familier avec Oracle Warehouse Builder et ne sais pas si cette solution fonctionne dans l'environnement. Et je suppose que, dans un entrepôt de données SQL injection n'est pas un sujet de préoccupation.
Une autre façon de spécifier le nom de la partition au moment de l'exécution est avec système de partitionnement
et DATAOBJ_TO_PARTITION .
Le grand désavantage de cette méthode est que chaque DML doit faire référence à la partition:
Je n'ai jamais entendu parler de quelqu'un à l'aide de cette fonction. Et dans mon expérience, de données Oracle cartouche est buggé. Comment SQL dynamique de chercher maintenant? 🙂