2010-08-03 13 views
2

J'ai une base de données dans laquelle la valeur de nls_length_semantics a été modifiée de byte à char. Est-il nécessaire de recompiler tous les paquets qui ont des types de données basés sur varchar2 accessibles en externe (par exemple dbms_sql)?Recompilation du package après modification de nls_length_semantics

+3

De plus, 'DBA_PLSQL_OBJECT_SETTINGS' inclut une colonne indiquant la sémantique en place lors de la compilation du paquet, mais je ne sais pas si elle l'utilise lors de l'exécution, ce qui pourrait rendre le changement invalide mais signifie que le paquet traite toujours les données passées en octets –

+1

Cela semble être une information très utile. la modification du paramètre n'invalide aucun objet, mais conserve le paramètre "bytes". Comme le paquet n'est pas invalide, le DBA n'était pas désireux de le recompiler sans raison, mais si je peux trouver l'entrée dans cette table, alors je peux montrer qu'il a besoin d'être recompilé. –

Répondre

0

Réponse courte: elle dépend :-)

Si vous voulez votreexistant paquets à utiliser la sémantique char, vous devez recompiler. Sinon, ils resteront avec le réglage qu'ils avaient au moment de la compilation. D'un point de vue technique, il n'y a pas besoin de recompiler.

Et il n'est définitivement pas nécessaire de recompiler les paquets appartenant à SYS (comme dbms_sql).

+0

sys.htp semble penser en octets et accepte des chaînes plus longues contenant des "caractères étranges" après avoir changé nls_length_semantics en char et en le recompilant! –

1

@GWu est faux à mon avis. Au moins, il a tort dans l'esprit. Ce n'est pas une question de WANT, c'est une question de BESOIN. Cependant, il est également correct dans le sens où il dit: cela dépend.

Vous avez besoin de recompiler vos packages si les données sous-jacentes dans la base de données sont multi-octets.

J'ai eu des problèmes aujourd'hui où les paquets ont été compilés au format BYTE, bien que les données sous-jacentes dans mes tables soient en Unicode. Les tables ont été définies explicitement comme étant (par exemple) VARCHAR2 (20 CHAR), alors que le code dans mes paquets PL/SQL a été défini uniquement comme VARCHAR2 (20). Cela signifie qu'une colonne de la base de données définie avec la longueur 50 ne correspond pas toujours à une variable PL/SQL définie comme étant la longueur 50. Mes utilisateurs ont signalé beaucoup d'erreurs de type "caractère buffer trop petit" Par conséquent.

Une recompilation des paquets est requise si vous avez le même cas que moi.

Cependant, ce que j'aimerais vraiment savoir, c'est comment savoir si un paquet a été compilé dans un format BYTE. De cette façon, je saurais exactement quels paquets doivent être recompilés. Sans le savoir, je n'ai pas de méthode proactive pour les recompiler. Je dois juste attendre que l'utilisateur signale le problème.

Je suppose que je pourrais les re-compiler bien sûr, mais cela verrouillerait ma base de données pendant que les utilisateurs sont encore dedans. Je dois donc planifier un temps d'arrêt à nouveau pour résoudre le problème :-(

--EDIT--

Il devrait y avoir lu un commentaire de @AlexPoole avant de poster ce sujet. La vue dba_plsql_object_settings donne l'information nécessaire