Bonjour,
Après de longues années sans toucher à Oracle, je renoue avec difficulté.
Je travaille sur des requêtes de reprises de données pour une migration.
J'ai une table de tiers (TIE) donc la clé, pour faire simple est "SIGTIE".
Cette clé est un VARCHAR2(12) et je doit l'exporter dans un format F + 8 caractères.
Pour effectuer cette codification, sur laquelle le client peut prendre la main (forcer le code de certaines lignes), je souhaite donc alimenter une colonne (CODZN10).
Un grand nombre de lignes a déjà pour code un numéro sur 8 chiffres. Pour ceux là, je souhaite simplement ajouter le préfixe "F".
Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 update tie set codzn10 = 'F' || sigtie where codsoc = 1 and typtie = 'FOU' and length(sigtie) = 8 and REGEXP_LIKE(sigtie,'^(\d*)$','i');
Pour les autres, l'idée est :
1 : récupérer la plus grande valeur numérique déjà stockée dans CODZN10 (en supprimant le préfixe)
2 : attribuer un numéro à arbitraire à toutes les lignes de TIE qui n'en ont pas déjà un
3 : mettre à jour CODZN10 de toutes ces lignes trouvées avec le résultat du 1 + le numéro d'ordre du 2
Ce qui donnait dans ma tête :
Sauf que j'ai une erreur de syntaxe sur le "MERGE", avec "SELECT attendu".
Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31 with lastnum (num) as ( select case max(codzn10) when ' ' then 0 else to_number(substr(max(codzn10), 2)) end from tie where codsoc = 1 and typtie = 'FOU' and (length(sigtie) <> 8 or not(REGEXP_LIKE(sigtie,'^(\d*)$','i'))) and codzn10 = ' ' ), numord (sigtie, num) as ( select tie.sigtie, lastnum.num + rownum from tie cross join lastnum where tie.codsoc = 1 and tie.typtie = 'FOU' and (length(sigtie) <> 8 or not(REGEXP_LIKE(sigtie,'^(\d*)$','i'))) and codzn10 = ' ' ) merge into tie using numord on (tie.sigtie = numord.sigtie) when matched then update set tie.codzn10 = numord.num where tie.codsoc = 1 and tie.typtie = 'FOU' and (length(sigtie) <> 8 or not(REGEXP_LIKE(sigtie,'^(\d*)$','i'))) and codzn10 = ' ';
MERGE n'est pas compatible avec les CTE ?
Il y a une syntaxe particulière ?
Version d'oracle :
Oracle Database 11g Release 11.2.0.2.0 - 64bit Production
PL/SQL Release 11.2.0.2.0 - Production
"CORE 11.2.0.2.0 Production"
TNS for Linux: Version 11.2.0.2.0 - Production
NLSRTL Version 11.2.0.2.0 - Production
Partager