Problème Oracle sur la taille des alias de table

Problème Oracle sur la taille des alias de table
0
Tags: #<Tag:0x00007fed44591918>

Bonjour,

Simplicité version4.0 patch level P24Built on2020-01-20 23:41 (revision 7fc0ce9f82f6702bc7c2fcf1eec5d421023eb068

Il y a eu une mise à jour cette nuit et nous avons constaté des erreurs dans les logs sur nos instances avec base de données oracle…
Pour vérifier, nous venons de créer une instance vierge 4.0r sur une base Oracle.

Voilà l’erreur rencontrée:

jdbc/simplicite: select t.row_id, t.pcf_process_id, t_pcf_process_id.pcs_name, t.pcf_serial, t.pcf_start_dt, t.pcf_end_dt, t.pcf_duration, t.pcf_status, t.pcf_deadline_dt, t.pcf_object, t.pcf_acf_id, t_pcf_acf_id.acf_pcf_id, t_acf_pcf_id.pcf_serial, t_pcf_acf_id.acf_serial, t_acf_pcf_id.pcf_process_id, t_pcf_acf_id_acf_pcf_id_pcf_process_id.pcs_name, t.pcf_owner_id, t_pcf_owner_id.usr_login, t_pcf_owner_id.usr_last_name, t_pcf_owner_id.usr_first_name, t_pcf_owner_id.usr_email, t_pcf_owner_id.usr_work_num, t.created_dt, t.created_by, t.updated_dt, t.updated_by from bpm_process_file t inner join bpm_process t_pcf_process_id on (t.pcf_process_id=t_pcf_process_id.row_id) left outer join bpm_activity_file t_pcf_acf_id on (t.pcf_acf_id=t_pcf_acf_id.row_id) left outer join bpm_process_file t_acf_pcf_id on (t_pcf_acf_id.acf_pcf_id=t_acf_pcf_id.row_id) left outer join bpm_process t_pcf_acf_id_acf_pcf_id_pcf_process_id on (t_acf_pcf_id.pcf_process_id=t_pcf_acf_id_acf_pcf_id_pcf_process_id.row_id) left outer join m_user t_pcf_owner_id on (t.pcf_owner_id=t_pcf_owner_id.row_id) where (t.pcf_object like ?) order by t_pcf_process_id.pcs_name asc, t.pcf_serial asc, t.row_id asc
java.sql.SQLSyntaxErrorException: ORA-00972: identifier is too long

Caused by: Error : 972, Position : 287, Sql = select t.row_id, t.pcf_process_id, t_pcf_process_id.pcs_name, t.pcf_serial, t.pcf_start_dt, t.pcf_end_dt, t.pcf_duration, t.pcf_status, t.pcf_deadline_dt, t.pcf_object, t.pcf_acf_id, t_pcf_acf_id.acf_pcf_id, t_acf_pcf_id.pcf_serial, t_pcf_acf_id.acf_serial, t_acf_pcf_id.pcf_process_id, t_pcf_acf_id_acf_pcf_id_pcf_process_id.pcs_name, t.pcf_owner_id, t_pcf_owner_id.usr_login, t_pcf_owner_id.usr_last_name, t_pcf_owner_id.usr_first_name, t_pcf_owner_id.usr_email, t_pcf_owner_id.usr_work_num, t.created_dt, t.created_by, t.updated_dt, t.updated_by from bpm_process_file t inner join bpm_process t_pcf_process_id on (t.pcf_process_id=t_pcf_process_id.row_id) left outer join bpm_activity_file t_pcf_acf_id on (t.pcf_acf_id=t_pcf_acf_id.row_id) left outer join bpm_process_file t_acf_pcf_id on (t_pcf_acf_id.acf_pcf_id=t_acf_pcf_id.row_id) left outer join bpm_process t_pcf_acf_id_acf_pcf_id_pcf_process_id on (t_acf_pcf_id.pcf_process_id=t_pcf_acf_id_acf_pcf_id_pcf_process_id.row_id) left outer join m_user t_pcf_owner_id on (t.pcf_owner_id=t_pcf_owner_id.row_id) where (t.pcf_object like :1 ) order by t_pcf_process_id.pcs_name asc, t.pcf_serial asc, t.row_id asc, OriginalSql = select t.row_id, t.pcf_process_id, t_pcf_process_id.pcs_name, t.pcf_serial, t.pcf_start_dt, t.pcf_end_dt, t.pcf_duration, t.pcf_status, t.pcf_deadline_dt, t.pcf_object, t.pcf_acf_id, t_pcf_acf_id.acf_pcf_id, t_acf_pcf_id.pcf_serial, t_pcf_acf_id.acf_serial, t_acf_pcf_id.pcf_process_id, t_pcf_acf_id_acf_pcf_id_pcf_process_id.pcs_name, t.pcf_owner_id, t_pcf_owner_id.usr_login, t_pcf_owner_id.usr_last_name, t_pcf_owner_id.usr_first_name, t_pcf_owner_id.usr_email, t_pcf_owner_id.usr_work_num, t.created_dt, t.created_by, t.updated_dt, t.updated_by from bpm_process_file t inner join bpm_process t_pcf_process_id on (t.pcf_process_id=t_pcf_process_id.row_id) left outer join bpm_activity_file t_pcf_acf_id on (t.pcf_acf_id=t_pcf_acf_id.row_id) left outer join bpm_process_file t_acf_pcf_id on (t_pcf_acf_id.acf_pcf_id=t_acf_pcf_id.row_id) left outer join bpm_process t_pcf_acf_id_acf_pcf_id_pcf_process_id on (t_acf_pcf_id.pcf_process_id=t_pcf_acf_id_acf_pcf_id_pcf_process_id.row_id) left outer join m_user t_pcf_owner_id on (t.pcf_owner_id=t_pcf_owner_id.row_id) where (t.pcf_object like ?) order by t_pcf_process_id.pcs_name asc, t.pcf_serial asc, t.row_id asc, Error Msg = ORA-00972: identifier is too long

 at oracle.jdb

Merci d’avance de votre traitement.

un alias de table dépasse la taille possible pour votre oracle.
t_pcf_acf_id_acf_pcf_id_pcf_process_id.row_id

Quelle est la valeur de votre paramètre système ORACLE_ALIAS_LENGTH ?
il faut l’aligner avec la capacité de votre base oracle (30 ?).

Sinon ORACLE_ALIAS_LENGTH vaut 128 par défaut.

(en 2020 choisir Oracle reste une mauvaise idée due à ces limitations du 20e siècle)

Quelle est la version d’Oracle que vous utilisez ?

Pour la 4.0 la compliance est sur la 12c+ Cf. https://docs.simplicite.io/documentation/compliance.md#databases d’où la valeur par défaut de ORACLE_ALIAS_LENGTH désormais à 128

Mon instance vierge est sur l’instance manager (recosc). Les autres sur lesquelles on a constaté le problème sont aussi sur l’instance manager.

DatabaseOracle Oracle Database 11g Express Edition Release 11.2.0.2.0 - 64bit Production using BLOBs

OK la version 11g express doit avoir besoin de 30 et pas de 128.
Il faut vérifier dans la doc Oracle…

NB: Sans licence Oracle c’est la seule qu’on pouvait vous installer sur le SIM à l’époque

Bonjour,
Il semble en effet que la limitation à 30 caractères soit valable jusqu’à la version oracle 12.1.

Du coup nous sommes bloqué sur 2 instances. Qu’est-il possible de faire pour nous débloquer?

Avez-vous la possibilité de faire revenir une instance à une version avant la dernière mise à jour?

Comme l’a dit @francois il faut avoir le param système ORACLE_ALIAS_LENGTH avec 30 comme valeur. Celui-ci n’est pas livré par défaut donc c’est la valeur par défaut (128) qui s’applique.

Sinon il existe désormais une version express 18c, il est donc possible de désinstaller la 11g express actuelle et d’installer cette version plus moderne. Par contre je ne sais pas si un dump 11g sera chargeable sur une 18c, il faudrait consulter la doc Oracle à ce sujet et/ou faire des tests avant d’envisager l’install de cette nouvelle version

A voir aussi quelle est la cible chez votre client et si ce que vous feriez sur une 18c serait compatible avec cette cible.

En fait quand on travaille sur Oracle l’idéal c’est que le client vous fournisse les bases de données conforme à ce qu’il a chez lui. Le monde Oracle est un monde très compliqué où l’usage des bases “entreprise” est soumise à licencing, où son installation est compliquée, etc.

Seules les versions express sont compatibles avec une installation sur un serveur SIM et, de toute façon, ça sort clairement de nos domaines d’expertise.

PS:

Pouvez vous m’envoyer le /health d’une de vos instances Oracle pour voir dans quelle mesure on pourrais “détecter” qu’il s’agit d’une 11g et mettre 30 plutôt que 128 comme valeur par défaut.

Voici la partie Database du health

[Database]
Vendor=4
ProductName=Oracle
ProductVersion=Oracle Database 11g Express Edition Release 11.2.0.2.0 - 64bit Production
DriverName=Oracle JDBC driver
DriverVersion=19.3.0.0.0
DBDate=2020-01-23 16:45:28
DBDateOffset=0
DBPatchLevel=P24;268698a7db6f6481040d0fc8bdd6cb959ec747a3
UsingBLOBs=true

Mouais comme je m’en doutais il ne sera pas vraiment possible de parser avec fiabilité la chaîne de caractères de la version pour toutes les versions possibles imaginables de Oracle

Par exemple en 18c cette chaîne est au simple format “18.x.y.z.k”, pour les autres versions je ne peux pas savoir je n’ai pas de bases pour tester…

Je regarde quand même pour voir si on peut faire quelque chose en mode “best effort”, je passe le post en “feature request”

En fait on a aussi le major/minor version puis-je avoir le /health?full=true ?
Merci

Je ne comprends pas vous pouvez positionner le paramètre ORACLE_ALIAS_LENGTH=30 qui sert à tronquer l’alias au choix du designer, s’il est absent Simplicité peut essayer de le déduire mais il faut que ce soit uniquement si ce paramètre est absent.

Je ne comprend. Qu’est-ce que je dois faire?
Me connecter en console et modifier ce paramètre dans ma base?

Ci-joint les informations
health.txt (2.3 KB)

Paramètre système dans simplicité?

Oui c’est un param système simplicité, mettez 30, clearez le cache et ce sera bon

1 Like

PS: Si la UI n’est pas utilisable, il est possible de créer ce param système via I/O :

curl -u designer:<designer's password> --form service=xmlimport --form file=@file.xml <base URL>/io

file.xml est:

<?xml version="1.0" encoding="UTF-8"?>
<simplicite xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.simplicite.fr/base" xsi:schemaLocation="http://www.simplicite.fr/base https://www.simplicite.io/resources/schemas/base.xsd">
<object>
	<name>SystemParam</name>
	<action>upsert</action>
	<data>
		<sys_code>ORACLE_ALIAS_LENGTH</sys_code>
		<sys_value>30</sys_value>
		<sys_type>PRV</sys_type>
		<row_module_id.mdl_name>System</row_module_id.mdl_name>
	</data>
</object>
</simplicite>

Bonjour,

Merci. En mettant ce paramètre système cela règle le problème.