上面的代码和结果可以证明,execute immediate并不自动提交DML操作。下面的代码中,我们手动提交:
- SQL> create table PEOPLE_T(
- 2 id number,
- 3 name varchar(50)
- 4 );
- Table created
- SQL> set serveroutput on;
- SQL> declare
- 2 cnt integer;
- 3 begin
- 4 execute immediate 'insert into people_t values(1, ''zhangsan'')';
- 5 rollback;
- 6 select count(*) into cnt from people_t;
- 7 dbms_output.put_line(cnt);
- 8 end;
- 9 /
- 0
- PL/SQL procedure successfully completed
- SQL>
可以看出手动提交后,DML语句的记录才插进表里。当然也可以用下面的方式动态执行提交语句,但是与手动提交没有太大的实际意义:
- SQL> declare
- 2 cnt integer;
- 3 begin
- 4 execute immediate 'insert into people_t values (2, ''Lisi'')';
- 5 commit;
- 6 select count(*) into cnt from people_t;
- 7 dbms_output.put_line(cnt || ' records after commit');
- 8 end;
- 9 /
- 1 records after commit
- PL/SQL procedure successfully completed
2. 当执行sql语句时,结尾不需要分号;当执行pl/sql块时,需要用分号结尾。
- SQL> declare
- 2 cnt integer;
- 3 begin
- 4 execute immediate 'insert into people_t values (3, ''Wangwu'')';
- 5 execute immediate 'commit';
- 6 select count(*) into cnt from people_t;
- 7 dbms_output.put_line(cnt || ' records after commit');
- 8 end;
- 9 /
- 2 records after commit
- PL/SQL procedure successfully completed
- SQL>
- SQL> begin
- 2 execute immediate 'insert into people_t values (1, ''Zhangsan'');';
- 3 end;
- 4 /
- begin
- execute immediate 'insert into people_t values (1, ''Zhangsan'');';
- end;
- ORA-00911: invalid character
- ORA-06512: at line 3
- SQL>
- SQL> begin
- 2 execute immediate 'begin insert into people_t values (1, ''Zhangsan''); end';
- 3 end;
- 4 /
- begin
- execute immediate 'begin insert into people_t values (1, ''Zhangsan''); end';
- end;
- ORA-06550: line 1, column 54:
- PLS-00103: Encountered the symbol "end-of-file" when expecting one of the following:
- ; <an identifier> <a double-quoted delimited-identifier>
- The symbol ";" was substituted for "end-of-file" to continue.
- ORA-06512: at line 3
- SQL>
欢迎光临 Chinaunix (http://bbs.chinaunix.net/) | Powered by Discuz! X3.2 |