- 论坛徽章:
- 0
|
oracle的execute immediate可以动态执行sql语句。下面总结一下这一语句的用法:
1. execute immediate不会自动提交DML事务执行,需要显式提交或者作为execute immediate语句的一部分。(参考如下代码)
- 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>
上面的代码和结果可以证明,execute immediate并不自动提交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
可以看出手动提交后,DML语句的记录才插进表里。当然也可以用下面的方式动态执行提交语句,但是与手动提交没有太大的实际意义:
- 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>
2. 当执行sql语句时,结尾不需要分号;当执行pl/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>
|
|