次の表を作成しました
CREATE TABLE Customers(
CustomerID varchar2(9) PRIMARY KEY,
Customer_Contact varchar2(40) NOT NULL,
Address varchar2(20) NOT NULL,
Post_Code varchar2(7) NOT NULL,
Telephone_Number varchar2(11) NOT NULL)
そして、私は現在INSERT VALUESステートメントを使用しようとしています。私は次の声明を書きました
INSERT INTO Customers VALUES(
501623129,
'John Petterson',
'-- Singleton Close London',
'--- ---', 02082860222)
ステートメントを実行しようとすると、次のエラーメッセージが表示されます。
コマンドの4行目から開始するエラー:INSERT INTO Customers VALUES(501623129、 'David Patterson'、'30 Singleton Close London '、' SW17 9JY '、02082860642)エラーレポート:SQLエラー:ORA-12899:列の値が大きすぎます " DJ "。" CUSTOMERS "。" ADDRESS "(実際:25、最大:20)12899. 00000-"列%sには大きすぎる値(実際:%s、最大:%s) "
ORA-12899: value too large for column "DJ"."CUSTOMERS"."ADDRESS" (actual: 25, maximum: 2
エラーが何であるかを伝えます。アドレスは最大20文字を保持でき、25文字を渡します。
前述のとおり、エラーメッセージは正確な問題を示しています。つまり、20文字を保持するように設定されたフィールドに25文字を渡しています。列をもう少し正確に定義することも検討してください。 VARCHAR2列に特定のバイト数または文字数を格納するかどうかを定義できます。マルチバイト文字をフィールドに挿入しようとすると、将来的に問題が発生する可能性があります。たとえば、これは長さが5文字ですが、5バイトに収まりません: 'ÀÈÌÕÛ'
次に例を示します。
CREATE TABLE Customers(CustomerID VARCHAR2(9 BYTE), ...
または
CREATE TABLE Customers(CustomerID VARCHAR2(9 CHAR), ...
この回答は、たとえ古いものであっても、ORA-12899と上記の役に立たないコメントの多くで依然として上位に表示されています。最も役立つコメントは、データを読み込むときになぜこれが得られるのかを調べようとしている専門家にとって#4でした。
一部の文字は長さが1バイトを超える場合があり、特にSQL Serverの場合はそうです。また、SQLServerのvarchar(20)に収まるものは、Oracleの同様のvarchar2(20)には収まりません。
昨日、SSISがAttunityドライバーを使用してOracleデータベースをロードしているときにこのエラーに遭遇し、時間を節約できると思いました。
私の場合、私はC# OracleCommand
with OracleParameter
、そしてすべてのパラメーターSize
プロパティを各列の最大長に設定して、エラーを解決しました。
OracleParameter parm1 = new OracleParameter();
param1.OracleDbType = OracleDbType.Varchar2;
param1.Value = "test1";
param1.Size = 8;
OracleParameter parm2 = new OracleParameter();
param2.OracleDbType = OracleDbType.Varchar2;
param2.Value = "test1";
param2.Size = 12;