oracle 带有变量的语句_Oracle 动态SQL语句(2)之含变量的WHERE语句与日期变量

博客介绍了Oracle动态SQL语句编写时,要特别注意日期型变量和WHERE语句的编写。执行时可将动态SQL语句赋值给字符变量并输出查看。因动态SQL执行效率低,建议用静态SQL,若使用需注意变量使用,还给出了相关存储过程代码示例。

在 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 ;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值