Falls es jemanden wie mir gehen sollte, hier eine kleine Hilfe:
Man überprüft z.B. mit Perl, ob ein geänderter Wert eines Datenbanken-Felds über die dafür vorgesehene Maximalgrösse kommen würde (z.B. varchar2(4000):
my $length = length($new_value);
if ($length < 4000)
{
&update_component_table($new_value, $id);
}
else
{
print "[ERROR] component $id value would be too long!\n";
}
Perl gibt zurück, dass alles innerhalb der Toleranzen ist (also kleiner als 4000 Zeichen), aber Oracle meldet sich dann mit der "ORA-01704" Fehlermeldung (String Literal too long), dann hat das normalerweise den Grund, dass Oracle als NLS_LENGTH_SEMANTICS(*) eben Byte hat und nicht Chars, was der einfache Perl Code lediglich abprüft.
Um das zu vermeiden, muss man folgendes hinzufügen:
(... my $length = length($new_value);... )
foreach (split (//, $new_value))
{
$length++ if (ord($_) > 127);
}
(...if ($length < 4000)...)
Damit wird man, wie ich (wir) heute feststellen, dass die Länge des Strings eben doch grösser als 4000 Bytes (und eben weniger als 4000 Zeichen) ist.
(*) = Diese Attribute findet man über:
select * from v$nls_parameters
Im "Oracle Programming Book" steht dazu übrigens nur "Contact your Database Administrator" anstelle, dass eben dieser einzeilige SQL-Befehl angegeben wird... Mann oh Mann.
Vielleicht hilft es jemanden, hat mich heute eine gute Stunde oder so beschäftigt
Claus