Oracle 动态SQL语句(1)之简单书写

   对不存在的表或视图进行操作时,如果是静态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;

原文地址:https://www.cnblogs.com/wylaok/p/2699834.html