[php]
环境如下:
window2000 professional
oracle 9.2.0.1
delphi 6
-- 建表
create table t1
( f1 varchar2(100)
);
insert into t1 (f1) values ('0');
commit;
procedure TForm1.Button1Click(Sender: TObject);
var
sSQL: string;
begin
// 1 不成功
// ORA-00911: invalid character
and is unable to recognize the comment.
sSQL :=
' update t1 set f1 = ''1 delphi''; ';
try
prExecSQL(sSQL);
except
MessageDlg('Error', mtError, [mbOK], 0);
end;
// 2 成功
sSQL :=
' update t1 set f1 = ''2 delphi'' ';
try
prExecSQL(sSQL);
except
MessageDlg('Error', mtError, [mbOK], 0);
end;
// 3 成功
sSQL :=
' begin ' +
' update t1 set f1 = ''3 delphi''; ' +
' commit; ' +
' end; ';
try
prExecSQL(sSQL);
except
MessageDlg('Error', mtError, [mbOK], 0);
end;
// 4 成功
sSQL :=
' update t1 set f1 = ''4 delphi'' ';
if not ADOConnection1.InTransaction then ADOConnection1.BeginTrans;
try
prExecSQL(sSQL);
ADOConnection1.CommitTrans;
except
ADOConnection1.RollbackTrans;
MessageDlg('Error', mtError, [mbOK], 0);
end;
end;
procedure TForm1.prExecSQL(aSQL: string);
begin
with ADOQuery1 do
begin
Close;
SQL.Clear;
SQL.Add(aSQL);
ExecSQL;
end;
end;
[/php]
疑问 1
为什么第一组语句多了一个分号就不能执行呢?
而在 sqlplus 中执行是可以的?
疑问 2
如果在 sqlplus 中
进程 1:
update t1 set f1 = 'test 1';
commit;
update t1 set f1 = 'test 2';
进程 2:
select * from t1;
如果第一个进程最后的语句不 commit,进程 2 读取是 'test 1'
第 2 组的语句并没有调用提交,但是此时在 sqlplus 读取出来的是 '2 delphi' 了
如果是这样的话,一定通过某种方式调用了 commit,这个是如何调用的呢?
通过什么方法能知道,这个语句由 ado 封装后,到了 oracle 中是什么样子的?
如果可以知道的话,我想分析一下语句2、3、4在oracle里都干了什么
|