2016-06-05 5 views
0

Ich habe zwei Tabellen "Kunde" und "Quote", jede hat ein customer_number Feld, das CHAR (6) ist. Tatsächlich ist "Quote" eine Tabelle und "Customer" ist eine Ansicht, die "Groups" (auch CHAR (6)) zuordnet. Datenbank ist 11g XE.Warum schneidet Oracle die führenden Nullen eines Strings beim Einfügen oder Aktualisieren automatisch ab?

Ich füge "000100" in "Kunde" ein, und wenn ich es abfrage, ist das, was ich bekomme. Ich füge dieselbe genaue Sache in "Quote" ein, und wenn ich es abfrage, bekomme ich "100" mit drei abschließenden leeren Räumen.

Für Sicherheit:

Hier ist ein Auszug aus der "CUSTOMER" DDL-Anweisung:

CREATE OR REPLACE FORCE VIEW "SCHEMA"."CUSTOMER" ("CUSTOMER_RSN", "CUSTOMER_NAME", "GROUP_TYPE", "ORGANIZATION_NAME", "MANAGING_GROUP_RSN", "CUSTOMER_NUMBER", ... "LAST_CHANGED_AT") 
AS 
     select GROUPS_RSN, GROUP_NAME, GROUP_TYPE, ORGANIZATION_NAME, MANAGING_GROUP_RSN, CUSTOMER_NUMBER, ... LAST_CHANGED_AT 
    from SCHEMA.GROUPS where group_type = 'Customer' WITH CHECK OPTION; 

Hier ist ein Auszug aus der "Gruppen" DDL-Anweisung:

CREATE TABLE "SCHEMA"."GROUPS" 
    ( "GROUPS_RSN" NUMBER(6,0) NOT NULL ENABLE, 
    "GROUP_NAME" VARCHAR2(100 BYTE) NOT NULL ENABLE, 
    "GROUP_TYPE" VARCHAR2(40 BYTE) NOT NULL ENABLE, 
    "ORGANIZATION_NAME" VARCHAR2(100 BYTE), 
    "CUSTOMER_NUMBER" CHAR(6 BYTE) DEFAULT '000000' NOT NULL ENABLE, 
    "CUSTOMER_CODE" VARCHAR2(4 BYTE), … 
    PRIMARY KEY ("GROUP_NAME", "GROUP_TYPE") 
    USING INDEX PCTFREE 10 INITRANS 2 MAXTRANS 255 COMPUTE STATISTICS 
    STORAGE(INITIAL 16384 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645 
    PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT) 
    TABLESPACE "SCHEMA_IDX" ENABLE 
    ) SEGMENT CREATION IMMEDIATE 
    PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255 NOCOMPRESS LOGGING 
    STORAGE(INITIAL 16384 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645 
    PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT) 
    TABLESPACE "SCHEMA" ; 

Hier ist der Code für ein Update auf "Kunde":

String customer_number = ""; 
customer_number = request.getParameter("customer_number"); 

... 

logger.debug("Updating the customer_number:" + customer_number); 
         String updateSql = 
           "update oe_customer set " + 
           "customer_name = '" + customer_name "', " + 
           "managing_group_rsn = " + managing_group_rsn + ", " + 
           "customer_number = '" + customer_number + "', " ... 

Hier ist die Log-Ausgabe von einem Update auf "Kunden":

21:21:30.861 [http-bio-8080-exec-74] DEBUG org.apache.jsp.updateCustomer_jsp - Updating the customer_number:000100 

Hier ist ein Auszug aus der "Quote" DDL-Anweisung:

CREATE TABLE "TIME"."QUOTE" 
    ( "QUOTE_RSN" NUMBER(6,0) NOT NULL ENABLE, 
    "QUOTE_NUMBER" NUMBER(6,0), 
    "OE_CUSTOMER_RSN" NUMBER(6,0) NOT NULL ENABLE, 
    "CUSTOMER_NUMBER" CHAR(6 BYTE) DEFAULT '000000' NOT NULL ENABLE, 
    "CUSTOMER_NAME" VARCHAR2(100 BYTE) NOT NULL ENABLE, ...  
CONSTRAINT "UNIQUE_Q_RSN" UNIQUE ("QUOTE_RSN") 
    USING INDEX PCTFREE 10 INITRANS 2 MAXTRANS 255 COMPUTE STATISTICS 
    STORAGE(INITIAL 16384 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645 
    PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT) 
    TABLESPACE "SCHEMA_IDX" ENABLE, 
    CONSTRAINT "PK_Q" PRIMARY KEY ("QUOTE_NUMBER") 
    USING INDEX PCTFREE 10 INITRANS 2 MAXTRANS 255 COMPUTE STATISTICS 
    STORAGE(INITIAL 16384 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645 
    PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT) 
    TABLESPACE "SCHEMA_IDX" ENABLE 
    ) SEGMENT CREATION IMMEDIATE 
    PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255 NOCOMPRESS LOGGING 
    STORAGE(INITIAL 16384 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645 
    PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT) 
    TABLESPACE "SCHEMA" ; 

Hier ist der Code für ein Update auf "Quote":

newValue.customerNumber is a public String customerNumber; 

... 
      logger.debug("Updating existing quote, rsn: " + newValue.quoteRSN); 
      String updateQuote = "update quote set "; 
      try { 

       updateQuote += "OE_CUSTOMER_RSN = " + newValue.oe_customerRSN + ", "; 
       updateQuote += "CUSTOMER_NUMBER = " + newValue.customerNumber + ", "; 
       logger.debug("Updating quote customer_number to:" + newValue.customerNumber); 

Hier ist die Log-Ausgabe von einem Update auf "Quote":

00:50:45.232 [http-bio-8080-exec-73] DEBUG quote.Quote_Single_Record - Updating existing quote, rsn: 86250 
00:50:45.232 [http-bio-8080-exec-73] DEBUG quote.Quote_Single_Record - Updating quote customer_number to:000100 

Hier werden die Werte in der Datenbank sitzen: enter image description here

Bitte helfen Sie, wenn Sie irgendwelche Ideen haben. Vielen Dank.

+0

Überprüfen Sie den Datentyp von customer_number in Tabelle C, es kann Nummer sein und nicht char (6). – mathguy

+0

[bearbeiten] Sie Ihre Frage und fügen Sie die Anweisung 'create table' für die Tabelle hinzu. Nicht verwandt, aber: *** *** *** verketten Sie Variablen nicht in eine SQL-Anweisung. Verwenden Sie stattdessen "PreparedStatement". Dies wird Ihre Anwendung sicherer machen und die Leistung verbessern. –

Antwort

2

In der Anweisung für die Tabelle QUOTE wird newValue.customerNumber nicht angegeben.

"customer_number = -->'" + customer_number + "'<--, " 

vs

updateQuote += "CUSTOMER_NUMBER = " + newValue.customerNumber + ", "; 

so seine eine Zahl ist, und durch die Umwandlung gibt es keine führenden Nullen.

TIPP: Versuchen Sie, vorbereitete Anweisungen zu verwenden, sie sind sicher gegen Fehler wie diesen und SQL-Injektion.

+0

Sehr guter Fang. Selbst nachdem Sie darauf hingewiesen hatten, fiel es mir schwer, das zu erkennen und seine Wirkung zu erkennen. Problem gelöst, vielen Dank. – Jibbyj

+0

an die Redaktion: Sorry, ich habe die Edit überarbeitet, bevor Sie die editierte Frage gelesen haben, Sie hatten Recht. – Turo

Verwandte Themen