ORA-01461: Problem mit langen Strings

chla1234

Benutzer
Beiträge
11
Hallo zusammen,

ich habe eine komplizierte Abfrage, die mir die Daten per Insert mehrmals am Tag in eine Tabelle schreiben soll.
Sie funktioniert soweit auch, aber sobald ich diese als Job anlegen möchte bekomme ich folgende Fehlermeldung:

ORA-01461: can bind a LONG value only for insert into a LONG column

Was mich nun verwundert sind die folgenden Tatsachen:
a) Ich habe keine LONG Werte in meiner Abfrage und ich habe keine Spalte des Typs LONG in meiner Zieltabelle.
b) Die Abfrage und der Insert funktionieren, wenn ich diese "per Hand" ausführe.

Nun habe ich gelesen, dass Oracle ein Problem mit langen Strings hat. In den Spalten in denen lange Strings auftauchen könnten habe ich nun probiert diese als CLOB umzudeklarieren (davor war es varchar2(4000) ).
Leider ohne Erfolg.


Ich kann mir darauf keinen Reim machen und das Internet + Foren liefern eigentlich immer nur die oben genannte Lösungsmöglichkeit. Hat dies eventuell mit dem Job zu tun? Habt ihr einen Rat?

Vielen Dank und viele Grüße
chla1234

EDIT:
Einen Materialized View anzulegen funktioniert zwar, aber ist jedoch leider keine Alternative, da mit der Ergebnismenge gearbeitet wird und teilweise Werte noch im Nachhinein geändert werden.
 
Werbung:
Zitat von hier: http://stackoverflow.com/questions/...nly-for-insert-into-a-long-column-occurs-when
"This error occurs when one attempts to use a varchar variable longer than 4000 bytes in an SQL statement. PL/SQL allows varchars up to 32767 bytes, but the limit for database tables and SQL language is 4000. You can't use PL/SQL variables that SQL doesn't recognize in SQL statements; an exception, as the message explains, is a direct insert into a long-type column.

Code:
create table test (v varchar2(10), c clob);
declare
shortStr varchar2(10):='0123456789';
longStr1 varchar2(10000):= shortStr;
longStr2 varchar2(10000);beginfor i in1..10000
loop
longStr2 := longStr2 ||'X';end loop;
-- The following results in ORA-01461insertinto test(v, c)values(longStr2, longStr2);
-- This is OK; the actual length matters, not the declared oneinsertinto test(v, c)values(longStr1, longStr1);
-- This works, too (a direct insert into a clob column)insertinto test(v, c)values(shortStr, longStr2);
-- ORA-01461 again: You can't use longStr2 in an SQL function!insertinto test(v, c)values(shortStr, substr(longStr2,1,4000));end;
"
Sollte alle offenen Fragen beantworten :)
 
Hallo zusammen,
danke für die Links aber es gibt noch ein paar Unklarheiten....

Ich habe nun eine Tabelle ziel_tabelle
Code:
create table ziel_tabelle
(
PNR CLOB,
REPORT CLOB,
ACTION CLOB,
....
)


Und folgende Abfrage:
Code:
declare
      PNR  CLOB;
      REPORT CLOB;
      ACTION CLOB;
begin
insert into ziel_tabelle (
PNR,
REPORT,
ACTION,
...
)
(select PNR, REPORT, ACTION , ....
from ....) ;
END;

PNR, REPORT, ACTION sind die möglichen Spalten, bei denen ein zu langer String auftauchen könnte. Der Fehler bleibt allerdings bestehen. Habe ich da etwas falsch verstanden? Ich bin im übrigen immer noch Neuling auf diesem Gebiet - den Witz habe ich nämlich auch nicht verstanden :)

ich danke euch für eure Mühe!
 
@chla1234 akretschmer ist einfach ein überzeugter Anhänger von PostgreSQL und mag es einfach über Oracle herzuziehen :)
Ich kann deinen Fehler nicht nachstellen... Welche Datenbank-Version hast du denn ? :)

@akretschmer Dafür kann CLOB dann auch 128 Terrabyte :)
 
und das funktioniert bei dir nicht? Kann ich mir kaum vorstellen.
Code:
Create Table test_tabelle (spalte Varchar2(4000), spalte2 Clob);

Insert Into test_tabelle
   (spalte, spalte2)
   (Select ao.object_name,
           to_clob(ao.object_name)
    From   all_objects ao
    Where  rownum < 1000);
 
Doch, das funktioniert.
Habe auch mal betreffende Spalten im SELECT wie in deiner Abfrage mit to_clob versehen, doch es funktioniert hier wieder nicht...
Da die Abfrage sehr groß ist und ich viele temp-Fehler hatte, musste ich mit einigen WITH AS- Verschachtelungen arbeiten. Ist das möglicherweise ein Problem?
 
Hmm... habe jetzt mal einzelnen Spalten einzeln nacheinander herauskommentiert. Am Ende hatte ich nur die Spalte mit der ID. Und diese kann ganz gewiss nicht >4000 sein. Der Fehler ist jedes Mal aufgetaucht... :(
 
Werbung:
Zurück
Oben