Lorsque j'essaie d'interroger des objets, j'obtiens l'erreur suivante :
ORA-01461: can bind a LONG value only for insert into a LONG column
Quelqu'un pourrait-il m'aider à trouver la cause et la solution du problème ?
Lorsque j'essaie d'interroger des objets, j'obtiens l'erreur suivante :
ORA-01461: can bind a LONG value only for insert into a LONG column
Quelqu'un pourrait-il m'aider à trouver la cause et la solution du problème ?
Cela peut également se produire avec des colonnes varchar2. Ce problème peut être reproduit avec PreparedStatements via JDBC en utilisant simplement les méthodes suivantes
Comme indiqué ci-dessus, il peut s'agir d'un problème de type ou de largeur de colonne dépassée.
Notez également que, comme varchar2 autorise 4k caractères maximum, la limite réelle sera de 2k pour les caractères à double octet.
J'espère que cela vous aidera
Dans une base de données Oracle, j'ai une table dont la colonne est VARCHAR2(2000 CHAR). Je vois à la fois l'erreur ORA-01461 (à propos de cette longue valeur) et une autre erreur ORA-12899. L'ORA-12899 indique précisément le problème : longueur réelle : 2392, longueur maximale : 2000. Il semble que le type d'erreur ORA-01461 soit renvoyé lorsque le contenu > 4000 CHAR, qui est le maximum supporté par Oracle. Alors que l'ORA-12899 est renvoyé lorsque la longueur est > 2000 et < 4000. Quelqu'un peut-il le confirmer (du moins pour Oracle) ?
Cette erreur se produit lorsqu'on tente d'utiliser une variable varchar de plus de 4000 octets dans une instruction SQL. PL/SQL autorise les varchars jusqu'à 32767 octets, mais la limite pour les tables de base de données et le langage SQL est de 4000. Vous ne pouvez pas utiliser de variables PL/SQL que le langage SQL ne reconnaît pas dans les instructions SQL ; une exception, comme l'explique le message, est une insertion directe dans une colonne de type long.
create table test (v varchar2(10), c clob);
declare
shortStr varchar2(10) := '0123456789';
longStr1 varchar2(10000) := shortStr;
longStr2 varchar2(10000);
begin
for i in 1 .. 10000
loop
longStr2 := longStr2 || 'X';
end loop;
-- The following results in ORA-01461
insert into test(v, c) values(longStr2, longStr2);
-- This is OK; the actual length matters, not the declared one
insert into test(v, c) values(longStr1, longStr1);
-- This works, too (a direct insert into a clob column)
insert into test(v, c) values(shortStr, longStr2);
-- ORA-01461 again: You can't use longStr2 in an SQL function!
insert into test(v, c) values(shortStr, substr(longStr2, 1, 4000));
end;
Ok, puisque vous n'avez pas montré de code, je vais faire quelques suppositions ici.
D'après l'erreur ORA-1461, il semble que vous ayez spécifié un type de données LONG dans une instruction select ? Et vous essayez de le lier à une variable de sortie ? C'est bien cela ? L'erreur est assez simple. Vous pouvez uniquement lier une valeur LONG pour l'insérer dans une colonne LONG.
Je ne sais pas trop quoi dire d'autre. L'erreur est assez explicite.
En général, c'est une bonne idée d'abandonner le type de données LONG au profit d'un CLOB. Les CLOB sont beaucoup mieux supportés, et les types de données LONG ne sont vraiment là que pour la rétrocompatibilité.
Voici un liste des restrictions du type de données LONG
J'espère que cela vous aidera.
L'erreur peut se produire sans que l'on puisse percevoir l'opération sur une table avec un type LONG.
Malheureusement, le message d'erreur n'est pas très explicite, s'il est causé par un champ varchar2 qui dépasse sa longueur (voir la réponse de Kiran).
Cette ORA-01461 ne se produit pas uniquement lors de l'insertion dans une colonne longue. Cette erreur peut se produire lors de la liaison d'une longue chaîne pour l'insertion dans une colonne VARCHAR2 et se produit le plus souvent lorsqu'il y a un problème de conversion de caractères multi-octets (ce qui signifie qu'un seul caractère peut prendre plus d'un octet d'espace dans oracle).
Si la base de données est UTF-8 alors, en raison du fait que chaque caractère peut prendre jusqu'à 3 octets, la conversion de 3 est appliquée pour vérifier et donc en fait limitée à l'utilisation de 1333 caractères pour insérer dans varchar2(4000).
Une autre solution serait de changer le type de données de varchar2(4000) à CLOB.
Un de mes collègues et moi avons découvert ce qui suit :
Lorsque nous utilisons le pilote Oracle de Microsoft .NET pour nous connecter à une base de données Oracle (System.Data.OracleClient.OracleConnection).
Et nous essayons d'insérer une chaîne dont la longueur est comprise entre 2000 et 4000 caractères dans un champ CLOB ou NCLOB en utilisant un paramètre de base de données
oraCommand.CommandText = "INSERT INTO MY_TABLE (NCLOB_COLUMN) VALUES (:PARAMETER1)";
// Add string-parameters with different lengths
// oraCommand.Parameters.Add("PARAMETER1", new string(' ', 1900)); // ok
oraCommand.Parameters.Add("PARAMETER1", new string(' ', 2500)); // Exception
//oraCommand.Parameters.Add("PARAMETER1", new string(' ', 4100)); // ok
oraCommand.ExecuteNonQuery();
Nous avons ouvert un ticket auprès de Microsoft pour ce bug il y a plusieurs années, mais il n'a toujours pas été corrigé.
Si possible, utilisez Oracle.ManagedDataAccess.dll. (peut être déployé librement, il n'est pas nécessaire d'installer un client Oracle sur les ordinateurs clients). [Si vous ne pouvez pas passer à un autre DataProvider .NET, il y a quelques solutions de contournement possibles que je peux imaginer : Nous avons stocké des données XML ou du texte lisible par l'homme dans ces champs. Une autre solution possible serait d'enregistrer la longueur de la chaîne dans un champ de base de données supplémentaire, d'ajouter des espaces si la longueur de la chaîne est comprise entre 2000 et 4000, et d'utiliser l'information sur la longueur dans le champ supplémentaire pour couper la chaîne à la lecture.
Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.
0 votes
@Rupesh êtes-vous sûr que cela provient d'une requête ? Essayez-vous de faire une insertion peut-être ? De plus, comment est-ce exécuté (java, C#, sqlplus, etc.) ?
1 votes
Il existe des solutions de contournement PL/SQL pour l'utilisation de chaînes de caractères longues pour l'insertion dans les fichiers suivants CLOB y BLOB colonnes.
0 votes
Pour la plupart des personnes qui cherchent une solution, celle-ci serait la bonne (et non la solution acceptée) : stackoverflow.com/a/14497831/1657465