使用execute immediate处理DDL操作:
create or replace procedure drop_table(table_name in varchar2)
is
sql_statement varchar2(100);
begin
sql_statement := 'drop table '|| table_name;
execute immediate sql_statement;
end;
/
调用:SQL> exec drop_table('demo'); 删除表
------------------------------------------------------------------------------------------------
DML操作:
使用无符号占位符和returing语句:
begin
execute immediate 'update emp set sal = sal + 1000 where deptno = 30';
end;
/
有符号占位符:
begin
execute immediate 'update emp set sal = (sal+:addsal) where deptno = :dno' using &1,&2;
end;
/
有符号占位符,有returing子句:
declare
salary number(6,2);
begin
execute immediate 'update emp set sal = (sal+:addsal) where '||
'empno = :dno returning sal into :salary' using &1,&2 returning into salary;
dbms_output.put_line('修改后的工资:' || salary);
end;
/
处理单行查询:
declare
salary number(6,2);
begin
execute immediate 'select sal from emp where empno = :eno' into salary using &1;
dbms_output.put_line('雇员的工资:' || salary);
end;
/
------------------------------------------------------------------------------------------------
处理多行查询
declare
type emp_cursor_typ is ref cursor;--定义游标变量类型
emp_cursor emp_cursor_typ;--声明游标变量
emp_record emp%rowtype;--记录
sql_stat varchar2(100);
begin
sql_stat := 'select * from emp where deptno=:dno';
open emp_cursor for sql_stat using &dno;--打开游标
loop
fetch emp_cursor into emp_record;--提取数据
exit when emp_cursor%notfound;
dbms_output.put_line('雇员名:'||emp_record.ename);
end loop;
end;
/
批量提取:
declare
type ename_table_type is table of emp.ename%type index by binary_integer;
type sal_table_type is table of emp.sal%type index by binary_integer;
ename_table ename_table_type;
sal_table sal_table_type;
sql_stat varchar2(100);
begin
sql_stat := 'update emp set sal = sal + 500 where deptno=:dno' ||
' returning ename,sal into :name,:salary';
execute immediate sql_stat using &dno returning bulk collect into
ename_table, sal_table;
for i in 1..ename_table.count loop
dbms_output.put_line('雇员'||ename_table(i)||'的新工资为:'||sal_table(i));
end loop;
end;
/
使用fetch的批量:
declare
type emp_cursor_type is ref cursor;
emp_cursor emp_cursor_type;
type ename_table_type is table of emp.ename%type index by binary_integer;
ename_table ename_table_type;
sql_stat varchar2(100);
begin
sql_stat := 'select ename from emp where job=:title';
open emp_cursor for sql_stat using '&job';
fetch emp_cursor bulk collect into ename_table;--批量提取
for i in 1..ename_table.count loop
dbms_output.put_line(ename_table(i));
end loop;
end;
/
forall中使用bulk子句:
declare
type ename_table_type is table of emp.ename%type;
type sal_table_type is table of emp.sal%type;
ename_table ename_table_type;
sal_table sal_table_type;
sql_stat varchar2(100);
begin
ename_table := ename_table_type('SCOTT','SMITH','CLARK');
sql_stat := 'update emp set sal = sal + 500 where ename =:1 returning sal into :2';
forall i in 1..ename_table.count --forall
execute immediate sql_stat using ename_table(i) returning bulk collect into sal_table;
for j in 1..ename_table.count loop
dbms_output.put_line('雇员:'||ename_table(j) ||'的新工资为:'||sal_table(j));
end loop;
end;
/