• Oracle 动态SQL语句(2)之含变量的WHERE语句与日期变量


        在 Oracle 动态SQL语句(1)中提到基本动态SQL语句书写,但在写动态SQL语句时特别要注意日期型变量和WHERE语句的编写。

    如下代码:

    1、注意在执行动态SQL语句时,execute immediate ***关键语句,在调试过程中,最好把动态SQL语句即一个字符串赋值给一个字符变量,

    并用Dbms_output.put_line(SQL语句字符串)把SQL语句输出,方便查看SQL语句是否有误;

    2、因动态SQL语句相对静态SQL语句的执行效率低,建议用静态SQL语句。如果一定要用,一定要注意变量的使用!!!

    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 wy_laok  1.创建此存储过程
    1.0.1    2012-9-21 wy_laok 2.修改表名称及变量名称,增加必要注释
    
    入参出参描述:
    i_id 测点编号
    i_realtime 更新时间
    i_min00 最小值
    i_agv00 平均值
    i_max00 最大值
    
    ************************/
     v_recordnum NUMBER:=0;--标识是否存在记录
     v_tablename varchar2(30);--表名
     v_sql_statement varchar2(200);--执行的SQL语句
     v_time varchar2(30);--时间
     --v_datetime date;
    begin
      insert into mnl(datetime) values (i_realtime) ;
      v_tablename:=  fun_create_mnl(i_id);--获取表名,如果有直接获取,没有则创建表
      v_time:=to_char(i_realtime,'yyyy-mm-dd hh24:mi:ss');
     -- v_datetime:=to_date(v_time,'yyyy-mm-dd hh24-mi-ss');
      --i_realtime:=to_date(to_char(i_realtime,'yyyy-mm-dd hh24-mi-ss'),'yyyy-mm-dd hh24-mi-ss');
      --判断是否含有此时间下的列
     v_sql_statement:='select count(DATETIME) from '||v_tablename||
     ' Where DATETIME=to_date('''||v_time||''',''yyyy-mm-dd hh24-mi-ss'')';--WHERE语句三个引号***
     Dbms_output.put_line(v_sql_statement);
      execute immediate v_sql_statement into v_recordnum ;
      --Dbms_output.put_line(v_sql_statement);
     IF v_recordnum=0 THEN
     --没有则插入
      --execute immediate
       v_sql_statement:= 'INSERT INTO '||v_tablename||'(DATETIME,MIN00,AGV00,MAX00)
      VALUES (to_date('''||v_time||''',''yyyy-mm-dd hh24-mi-ss''),'||i_min00||','||i_agv00||','||i_max00||')';
      execute immediate v_sql_statement;
      Dbms_output.put_line(v_sql_statement);
      ElSE
      --有则更新
      --execute immediate
       v_sql_statement:= 'UPDATE '||v_tablename||' 
        SET MIN00='||i_min00||',AGV00='||i_agv00||',MAX00='||i_max00||'
        WHERE DATETIME=to_date('''||v_time||''',''yyyy-mm-dd hh24-mi-ss'')';
        execute immediate v_sql_statement;--执行SQL语句
      Dbms_output.put_line(v_sql_statement);--输出SQL语句
      end if;
      commit;--数据更新
    end ;
    
  • 相关阅读:
    .NET 面试题汇总(带答案)
    C#声明一个100大小的数组 随机生成1-100之间不重复的数
    添加和读取Resources嵌入资源文件(例如.dll和.ssk文件)
    C#DataTable转List<T>互转
    “不允许使用邮箱名称。服务器响应为:”的错误解决办法
    微信多开防撤回(带提示)2.8.0.133补丁
    逆向某网站的登录接口生成元素加密
    C#中new的三种用法
    SQL Server查询第31到40条数据
    关于EF框架EntityState的几种状态
  • 原文地址:https://www.cnblogs.com/wylaok/p/2701961.html
Copyright © 2020-2023  润新知