赞
踩
【功能】
如果在存储过程中,要执行“创建、修改、删除、删表(create、alter、drop、truncate)”四种语句,不能直接使用,要将该类语句放在动态SQL(execute immediate)中执行。
应用场景:
1.封装DDL语句 alter drop
2.for 循环使用
【格式】
begin
execute immediate ‘要执行的语句’;
end;
【示例】
①动态SQL组成部分:
1.常量(DML语音关键字用常量封装) 2.变量(字段、表 注意:不能用单引封装) 3.连接符||
4.逗号(用常量封装 ‘,’)
5.动态SQL出现(’’)引号=静态SQL中(’)引号
比如 静态SQL:where name=‘gaiwu’ 动态SQL:‘where name’’’||gaiwu||’’
动态SQL中表名在过程所依赖的表找不到
select * from DBA_dependencies t where t.name in (‘P_ETL_SWITCH_INS_IMPORT_M’) and t.referenced_type=‘TABLE’;
例如:
v_str:=‘INSERT INTO CCCC
SELECT ‘||i.ddate||’,’
||i.sid||’,’’’
||i.dwtable||’’’,
COUNT(1)
FROM ‘||i.dwtable||
’ WHERE STATIS_DATE=’’’||i.ddate||’’’
GROUP BY STATIS_DATE’;
DBMS_OUTPUT.put_line(v_str);
execute immediate v_str;
②快速封装动态SQL技巧
1.首先把常量封装好
2.封装变量(变量不加单引’’)
3.封装地段之间逗‘,’号。逗号为’'一对出现
begin
execute immediate ‘truncate table 表名’;
end;
declare
v_str varchar2(100);
begin
v_str := ‘truncate table 表名’;
execute immediate v_str;
end;
create or replace procedure vgopkr.pkr_moni_game_user_info_d
(
iv_date in varchar2, – 统计日期
oi_return out integer – 结束成功否标志
)
is
vv_task_pos varchar2(50); – 任务位置
vv_partition varchar2(100); – 分区名称
begin
vv_task_pos := ‘删除当日数据’;
vv_partition := ‘DATE_GAME_’||iv_date;
execute immediate 'alter table tmk_moni_game_sp_dnld_d truncate partition '||vv_partition;
end;
–验证动态语句:
declare
v_sql varchar2(4000);
vi_date number;
begin
vi_date:=20140201;
v_sql:= ‘delete from vgopmk.tmk_daily_fee_d where dsc=’‘手机报’’ and statis_date=’||vi_date;
dbms_output.put_line(v_sql);
end;
–输出语句
delete from vgopmk.tmk_daily_fee_d where dsc=‘手机报’ and statis_date=20140201
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。