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:
Bitte helfen Sie, wenn Sie irgendwelche Ideen haben. Vielen Dank.
Überprüfen Sie den Datentyp von customer_number in Tabelle C, es kann Nummer sein und nicht char (6). – mathguy
[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. –