1.why——有些时候表明和列名在程序运行的时候才被告诉。
2.what
3.参考变量的绑定方式
3.1:早起绑定——编译时检查表名和列名,如大部分DDL,
3.2::晚期绑定——无法检查表名和列名。如动态SQL,truncate命令,
3.格式
3.1:基本式
select *from emp;
declare
vsql varchar(100);
vtbl varchar(30);
begin
vtbl:='&请输入表名';
vsql:='delete from'||vtbl;
execute immediate vsql;--执行动态语句
dbms_output.put_line(sql);
end;
declare
salary number(6,2);
sql_stat varchar2(100);
begin
sql_stat:='update emp set sal=sal*(1+:percent/100)'
||'where empno=:eno returning sal into :salary';--这里的:salary不是占位符表示什么意思。
execute immediate sql_stat using &增幅,&员工号 returning into salary;
dbms_output.put_line('新工资'||salary);
end;
3.2:查询式——execute immediate 查询sql into 变量
declare
vsql varchar(1000);
v_empno emp.empno%type;
v_ename emp.ename%type;
begin
v_empno:='&请输入工号';
vsql:='select ename from emp where empno='||v_empno;
execute immediate vsql into v_ename;--执行动态语句
dbms_output.put_line(v_ename);
end;
3.3:变量绑定式——execute immediate sql using 绑定变量
*每个对PL/SQL变量的引用实际上都是绑定变量。
*不能用绑定变量替换实际的数据库对象名
declare
vsql varchar(1000);
v_empno emp.empno%type;
v_ename emp.ename%type;
begin
v_empno:='&请输入工号';
vsql:='select ename from emp where empno=:xx';
execute immediate vsql into v_ename using v_empno;--执行动态语句
dbms_output.put_line(v_ename);
end;
3.4:海量式——ref corsor+open for
declare
type rc_type is ref cursor;
my_rec rc_type;
my_str varchar(30);
v_field varchar(30);
begin
v_field:='&字段';
open my_rec for 'select'||v_field||'from'||&表名;
fetch my_rec into my_str;
while(my_rec%found)
loop
dbms_output.put_line(my_str);
fetch my_rec into my_str;
end loop;
close my_rec;
end;