01 动态sql执行ddl语句
在pl/sql程序开发中,可以使用DML语句和事务控制语句,但是还有很多语句(比如DDL语句)不能直接在pl/sql中执行。
这些语句可以使用动态的sql来实现。动态sql是指在pl/sql块编译sql语句是不确定的。
--动态sql执行ddl语句
drop procedure procedure5;
create or replace procedure procedure5(
tablename in varchar2,
column1 in varchar2,
datatype1 in varchar2,
column2 in varchar2,
datatype2 in varchar2
)
as
existscount number:=0;
str_sql varchar2(500);
begin
begin
execute immediate 'drop table ' || tablename;
exception when others then null;
end;
str_sql:='create table ' || tablename ||
'(' || column1 || ' ' || datatype1 || ',' || column2 || ' ' || datatype2 || ')';
execute immediate str_sql;--执行动态ddl语句
-- execute immediate 'truncate table xxxxx'
-- execute immediate 'alter trigger xxxxx disable'
exception
when others then raise;
end;
测试如图:
02 动态sql执行dml语句
drop procedure procedure6;
create or replace procedure procedure6(
table_in IN VARCHAR2,
column1_in IN VARCHAR2,
column1_data_in IN VARCHAR2,
column2_in IN VARCHAR2,
column2_data_in IN VARCHAR2
)
IS
BEGIN
EXECUTE IMMEDIATE 'insert into '
|| table_in || '(' || column1_in || ',' || column2_in || ')'
|| 'values (:1,:2)'
USING column1_data_in, column2_data_in;
COMMIT;
EXCEPTION
WHEN OTHERS
THEN
RAISE;
END;
drop procedure procedure7;
create or replace procedure procedure7(
table_in IN VARCHAR2,
column_in IN VARCHAR2,
column_data_in IN VARCHAR2,
column_where_in IN VARCHAR2,
column_where_data_in IN VARCHAR2
)
IS
BEGIN
EXECUTE IMMEDIATE 'Update '
|| table_in
|| ' set '
|| column_in
|| ' = :1 where '
|| column_where_in
|| ' = :2'
USING column_data_in, column_where_data_in;
COMMIT;
EXCEPTION
WHEN OTHERS
THEN
RAISE;
END;
测试如图: