O
今天继续学习日账开发的相关程序,在学习过程中遇到了几个问题,通过向导师咨询以及在网上查阅资料后有所理解,今天的ORID主要记录以下几个问题:设置断点、动态sql语句以及between...and与>=的区别。
R
今天能较好地静下心来学习代码,感觉有进步,继续加油!
I
这几个知识点的介绍及具体使用方法如下:
1.设置断点
在日账开发的程序中,我发现每一个功能前都加入了断点:avc_break_point。当时我不太理解加入断点的具体原因,我就向导师请教。他向我解释道,这个断点主要用于记录错误发生的位置,结合以下这个函数来看,可以得知avc_break_point表示的错误发生位置,以及avc_err_text表示的错误信息。在查看log_day_error_t日志表时,可以看到如图1所示的ERROR_INFO包含了avc_break_point与log_day_error_t。
函数:etl_day_report_alarm.program_log_create(str_proc_name,n_table_id,n_day_now,-1,n_start_time,sysdate,str_sql,avc_break_point||avc_err_text,0)
图1 日志中显示的错误信息2.动态sql语句
我从网上查阅资料得知,Oracle编译PL/SQL程序块包括前期联编(early binding)与后期联编(late binding),前者表示SQL语句在编译期间就已经确定;后者表示SQL语句只有在运行阶段才能建立。通常,静态SQL采用前期联编,而动态SQL采用后期联编。并且动态SQL是通过损失一些系统性能来获得灵活性。一般动态SQL常用于:执行SQL数据定义语句(例如:create table ..,alter table ,drop table)、执行数据控制語句(例如:grant...)、一个会话控制(例如:alter session)等等。其具体语法为:
execute immediate"sql语句";
例如对于如下所示的动态语句,删除表stat_day_report_t中满足table_id为90020030以及stat_date为n_day_now的行。
str_sql:='delete from stat_day_report_t a where a.table_id=90020030 and a.stat_date='''||n_day_now||'''';
EXECUTE IMMEDIATE str_sql;
3. between...and与>=的区别
举例说明,对于筛选出2018年1月11日及以后的数据,以下两种语法都可以实现,但若在后期进行回溯时两种语法就会有所差别。语法二只能统计2018年1月11日及以后全部数据,而语法一可以通过修改n_day_now的值来改变统计的区间,例如统计2018年1月11日至2018年1月15日、2018年1月21日的数据,这样能够提高程序的适用性。所以在以后编程中,我们应该注意细节的处理,以提高工作效率。
语法一:a.yyyymmdd between '20180111' and ''||n_day_now||''
语法二:a.yyyymmdd >= '20180111'
D
每天继续学习日账开发相关程序的编写与维护,记录其中的重难点问题。
网友评论