ORA-01400 cannot insert NULL with SUBSELECT
Posted: Thu 21 Jul 2011 08:33
Delphi 5, ODAC 7.20.0.7
Delphi XE, ODAC 7.20.0.7
Steps to reproduce
1) Create new app
2) Drop button on form
3) Insert code into OnClick-Event
4) Run (F9)
5) Click Button
Delphi XE, ODAC 7.20.0.7
Steps to reproduce
1) Create new app
2) Drop button on form
3) Insert code into OnClick-Event
Code: Select all
procedure TForm1.Button1Click(Sender: TObject);
const
Boo: array[Boolean] of string = ('False', 'True');
var
SE: TOraSession;
QR: TSmartQuery;
ID: TField;
begin
SE := TOraSession.Create(Self);
SE.ConnectString := 'DEMO/DEMO@ORCL';
SE.Connect;
SE.ExecSQL('CREATE TABLE ODACTEST(ID NUMBER(16) NOT NULL, C1 VARCHAR2(1))', []);
SE.ExecSQL('ALTER TABLE ODACTEST ADD CONSTRAINT PK_ODACTEST PRIMARY KEY(ID)', []);
QR := TSmartQuery.Create(Self);
QR.Session := SE;
QR.SQL.Add('SELECT DISTINCT S.ID,S.C1 FROM');
QR.SQL.Add('(');
QR.SQL.Add('SELECT * FROM ODACTEST WHERE C1 = ''A''');
QR.SQL.Add(') S');
QR.KeyFields := 'ID';
QR.UpdatingTable := 'ODACTEST';
QR.Open;
ID := QR.FieldbyName('ID');
ShowMessage(DACVersion);
ShowMessage('Required = ' + Boo[ID.Required]); // -> True, OK because NOT NULL
ShowMessage('ReadOnly = ' + Boo[ID.ReadOnly]); // -> True in 7.20 - False in 5.80 - Why?
ID.ReadOnly := False;
QR.Append;
ID.AsInteger := GetTickCount;
QR.Post;
{
Working in 5.80
In ODAC 7.20 this results in Exception:
ORA-01400 cannot insert NULL into ("DEMO"."ODACTEST"."ID")
because this Statement is sent:
INSERT INTO ODACTEST
(C1)
VALUES
(:C1)
}
end;
5) Click Button