80 votes

ORA-01461 : possibilité de lier une valeur LONG uniquement pour l'insertion dans une colonne LONG - se produit lors d'une requête

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 ?

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

215voto

Kiran Points 421

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

  1. créer une table avec une colonne de type varchar2 (20 ou toute autre longueur arbitraire) et
  2. insertion dans le tableau ci-dessus d'une ligne contenant plus de 20 caractères

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

17 votes

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) ?

6 votes

@Vering, peut confirmer. Nous obtenons le même comportement.

2 votes

C'est ce qui se passait réellement pour nous.

38voto

Tomasz Żuk Points 440

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;

19voto

Mark J. Bobak Points 5504

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.

16 votes

L'erreur peut se produire sans que l'on puisse percevoir l'opération sur une table avec un type LONG.

2 votes

Je l'ai obtenu en essayant de fusionner des données dans une table avec un CLOB.

22 votes

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).

13voto

Murali Points 91

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.

8voto

Markus1980Wien Points 193

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();
  • toute chaîne dont la longueur est inférieure à 2000 caractères ne déclenchera pas l'exception.
  • toute chaîne dont la longueur est supérieure à 4000 caractères ne déclenchera pas l'exception.
  • seules les chaînes dont la longueur est comprise entre 2000 et 4000 caractères feront l'objet de cette exception.

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é.

0 votes

Nous avons le même problème. Avez-vous une solution de contournement raisonnable ?

0 votes

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.com

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.

Powered by:

X