对不存在的表或视图进行操作时,如果是静态SQL语句就会提示错误,这时必须用到动态SQL语句,特别是传入的参数为表名和表字段的情况。
注意:1、在调用函数时,注意其声明语句的书写。2、在调用过程语句时,只允许有一套begin……end
create or replace procedure sp_update_mnl00(i_id varchar,i_realtime DATE,i_min00 float, i_agv00 float,i_max00 float )
authid current_user as
/***********************
名称:sp_update_mnl00
功能描述:更新模拟量历史数据表中含00的列表项
修订记录:
版本号 编辑时间 编辑人 修改描述
1.0.0 2012-9-22 wylaok 1.创建此存储过程
1.0.1 2012-9-21 wylaok 2.修改表名称及变量名称,增加必要
注释
入参出参描述:
i_id 测点编号
i_realtime 更新时间
i_min00 最小值
i_agv00 平均值
i_max00 最大值
************************/
v_recordnum NUMBER:=0;--标识是否存在记录
v_tablename varchar2(30);--表名
v_sql_statement varchar2(100);--执行的SQL语句
begin
--此处的创建表的函数主体代码和上一个随笔中写的过程类似,不同的是把表名返回。
v_tablename:= fun_create_mnl(i_id);--获取表名,如果有直接获取,没有则创建表
--判断是否含有此时间下的列
v_sql_statement:='select count(DATETIME) from '||v_tablename||
' Where DATETIME='''||i_realtime||'''';
execute immediate v_sql_statement into v_recordnum ;
IF(v_recordnum=0) THEN
--没有则插入
execute immediate 'INSERT INTO '||v_tablename||'(DATETIME,MIN00,AGV00,MAX00)
VALUES ('''||i_realtime||''','||i_min00||','||i_agv00||','||i_max00||')';
ElSE
--有则更新
execute immediate 'UPDATE '||v_tablename||'
SET MIN00='||i_min00||',AGV00='||i_agv00||',MAX00='||i_max00||'
WHERE DATETIME='''||i_realtime||'''';
end if;
end ;
执行:
begin
sp_update_mnl00('12',to_date('2012-9-5 15:00:01','yyyy-mm-dd hh24:mi:ss'),1,1,1);
end;