2016-12-26 4 views
0

ich eine Abfrage von mehr als 4000 Zeichen haben, die aus unterschiedlichen varaibles gebildet wird, varchar2 Datentyp Größe 2000 Beispiel query1 varcahr2(2000):='string 1'; query2 varchar2(2000):='string2'; query3 varcahr2 (2000):= string3';Identifier Zu lange Exception

ich eine Variable Abfrage varchar2 erklärt haben (32000) query := query1|| query2 || query3 ;

create table t ( id number, querystring varchar2(4000));

Ich habe versucht, die ersten 4000 Zeichen aus der Abfragevariable zu bekommen, die es nicht funktioniert. Kann mir bitte jemand helfen?

declare 
    querystring1 varchar2(2000) := "string1"; 
    querystring2 varchar2(2000) := "string2"; 
    l_query varchar2(32000); 
    query varchar2(4000); 
begin 
    l_query := querystring1 || querystring2 ; 
    select substr(l_query,1,4000) into query from dual; 
    insert into lib_query_table values('1',query); 
end; 
+0

Nur zu sagen, dass etwas nicht funktioniert, ist nicht hilfreich. * Wie * hast du versucht, die ersten 4000 Zeichen zu bekommen? Was ist passiert - welcher Fehler hast du bekommen? Enthält die Zeichenfolge Multibyte-Zeichen? –

+0

'wählen Sie substr (Query, 1,4000) von Dual ' – Mahi

+0

Nach der Ausführung dieser Abfrage bekomme ich Bezeichner zu lang.In meiner Anwendung schaute ich auch in der Tabelle, die es nicht den Datensatz in die Tabelle einfügen, da String mehr als 4000 enthält Zeichen – Mahi

Antwort

0

Sie doppelte Anführungszeichen um Ihre Abfrage Stringliterale verwenden, statt einfache Anführungszeichen. Das bedeutet, dass Oracle sie als Bezeichnernamen interpretiert - sobald Ihr Literal mehr als 30 Zeichen lang ist, erhalten Sie diese Ausnahme. Bei kürzeren Strings würde man immer noch einen Fehler bekommen, aber so etwas wie 'unbekannte Kennung'.

Ersetzen Sie Ihre doppelte Anführungszeichen mit Einzel diejenigen:

declare 
    querystring1 varchar2(2000) := 'string1'; 
    querystring2 varchar2(2000) := 'string2'; 
    l_query varchar2(32000); 
    query varchar2(4000); 
begin 
    l_query := querystring1 || querystring2 ; 
    select substr(l_query,1,4000) into query from dual; 
    insert into lib_query_table values (1, query); 
end; 

Sie brauchen nicht die Abfrage von Dual können Sie tun:

query := substr(l_query, 1, 4000); 

Sie diese Variable überspringen könnte und zu tun:

insert into lib_query_table (id, querystring) 
values (1, substr(l_query, 1, 4000); 

oder sogar:

insert into lib_query_table (id, querystring) 
values (1, substr(querystring1 || querystring2, 1, 4000)); 

Da Ihre ID-Spalte eine Zahl ist, sollten Sie den Wert dafür nicht als Zeichenfolge eingeben '1' - verwenden Sie einfach eine Zahl. Sie möchten wahrscheinlich eine Sequenz, um diesen Wert schließlich einzustellen.


auch nicht direkt verwandt, aber wenn Sie Teile einer Abfrage verketten zusammen, sagen, wo eine Zeichenkette die Auswahlliste und die zweite ist die from Klausel usw., stellen Sie sicher, dass Sie Leerzeichen am Ende haben von jedem Teil (oder dem Anfang des nächsten Teils), oder der kombinierte String könnte ungültig werden.

+0

Danke Alex Seine Arbeit für mich jetzt .. – Mahi

0

Zeichenkette variabler Länge mit maximaler Länge Größe Bytes oder Zeichen. Sie müssen die Größe für VARCHAR2 angeben. Die Mindestgröße beträgt 1 Byte oder 1 Zeichen. Die maximale Größe beträgt: 32767 Bytes oder Zeichen, wenn MAX_STRING_SIZE = EXTENDED 4000 Bytes oder Zeichen.

Sie können Datentyp CLOB suchen