源码-PL/SQL从入门到精通-第三章-变量和类型-Part 2

不吐不快:

本来以为清华大学出版的书,质量上应该没的说,但是,通过调试示例程序,还是发现不少问题:

1. 个别概念解释不清,容易误导读者

2. 有些文字词不达意,不准确

3. 代码解释中有错别字,有的代码标题张冠李戴

之前说过的问题就不提了。总之,目前看到的最好的教材还是Java how to program,堪称完美!


代码如下:

--代码3.11 NUMBER类型声明示例
--说明:根据调试结果,基本可以确认Number(precesion,scale)中的precesion(精度)是指有效数字的位数,而不能简单理解为数字的长度。
--如,v_num6 NUMBER(4,-1):=31451;输出结果为31450,数字长度为5,而不是4(31450=3.145*10^1,科学计数法中的有效数字个数)。
--而另一参数-scale,意为赋值时小数点的移动位数,正数表示向右移动;负数表示向左移动
DECLARE
   v_num1 NUMBER:=3.1415926;           --结果:3.1415926
   v_num2 NUMBER(3):=3.1415926;        --四舍五入等于3
 --v_num2_1 NUMBER(3):=3145.1415926;   --错误,精度太高:ORA-06502:PL/SQL:数字或值错误:数值精度太高   
   v_num3 NUMBER(4,3):=3.1415926;      --结果:3.142
 --v_num3_1 NUMBER(4,3):=314.123;      --错误,精度太高:ORA-06502:PL/SQL:数字或值错误:数值精度太高   
   v_num4 NUMBER(8,3):=31415.9267;     --四舍五入3位小数,结果为:31415.927
   v_num5 NUMBER(4,-3):=3145611.789;   --由于为负3,要小数点左侧进行舍入3位结果为3146000
   v_num5_1 NUMBER(4,-3):=314.567895;  --舍入后的结果为0
   v_num6 NUMBER(4,-1):=31451;         --舍入后结果31450  
   v_num6_1 NUMBER(4,-1):=3145123;     --错误,精度太高:ORA-06502:PL/SQL:数字或值错误:数值精度太高   
BEGIN
  DBMS_OUTPUT.put_line('v_num1:='||v_num1);
  DBMS_OUTPUT.put_line('v_num2:='||v_num2);
  DBMS_OUTPUT.put_line('v_num3:='||v_num3);
  DBMS_OUTPUT.put_line('v_num4:='||v_num4);      
  DBMS_OUTPUT.put_line('v_num5:='||v_num5);    
  DBMS_OUTPUT.put_line('v_num5_1:='||v_num5_1);  
  DBMS_OUTPUT.put_line('v_num6:='||v_num6);   
 -- DBMS_OUTPUT.put_line('v_num6_1:='||v_num6);         
END; 

--代码3.12 PLS_INTEGER与BINARY_INTEGER的使用示例
DECLARE
   v_num1 PLS_INTEGER :=2147483647;   
BEGIN
   --当为v_num1+1时,产生了溢出,会触发异常
   v_num1:=v_num1+1-1;
   EXCEPTION
     WHEN OTHERS THEN
       --输出:ORA-01426: 数字溢出
       DBMS_OUTPUT.put_line(SQLERRM);
END;


--BINARY_INTEGER使用示例 
--实际调试结果:会产生编译错误
DECLARE
   v_num1 BINARY_INTEGER :=2147483647;
BEGIN   
   --以下论述与实际调试结果不符:
   --当为v_num1+1时,产生了溢出,
   --此时v_num1会被当作NUMBER进行处理,不会触发异常
   
   v_num1:=v_num1+1-1;
      EXCEPTION
     WHEN OTHERS THEN
       --输出:ORA-01426: 数字溢出
       DBMS_OUTPUT.put_line(SQLERRM);
END;

select power(2,8) from dual;
select * from product_component_version;
select * from v$instance;
select * from V$VERSION

--代码3.13 Date类型使用示例
--to_char函数中的'D'的含义,当前日期在本周中的天数序号,星期日为第一天(这个可不符合中国人的习惯啊☺
--Day of week (1-7). This element depends on the NLS territory of the session.
DECLARE
  v_weekday DATE := trunc(SYSDATE) - to_char(SYSDATE, 'D') + 1;
  v_now     DATE := SYSDATE;
BEGIN
  dbms_output.put_line('上个星期天的日期为:'||to_char(v_weekday, 'yyyy-mm-dd'));
  dbms_output.put_line('当前时间:'||to_char(v_now, 'yyyy-mm-dd hh24:mi:ss'));
END;


--代码3.14 TIMESTAMP类型使用示例
DECLARE
  v_now TIMESTAMP(8) := SYSDATE;
  v_nowdate DATE := SYSDATE;
BEGIN
  dbms_output.put_line(v_now);
  dbms_output.put_line(v_nowdate);
END;


--代码3.15 TIMESTATMP WITH TIME ZONE类型使用示例
DECLARE
   v_timestamp           TIMESTAMP;                      --定义日期类型的变量
   v_timestampwithzone   TIMESTAMP WITH TIME ZONE;
   v_timestampwithlocalzone   TIMESTAMP WITH LOCAL TIME ZONE;
BEGIN
   v_timestamp := SYSDATE;                           --为日期类型的变量赋初值
   v_timestampwithzone := SYSDATE;
   v_timestampwithlocalzone :=SYSDATE;
   DBMS_OUTPUT.put_line (v_timestamp);                             --输出信息
   DBMS_OUTPUT.put_line (v_timestampwithzone);
   DBMS_OUTPUT.put_line ( v_timestampwithlocalzone);  --和timestamp的输出相同
END;

--INTERVAL YEAR TO MONTH类型使用示例
DECLARE
  v_start    TIMESTAMP; --定义起始与结束时间戳类型
  v_end      TIMESTAMP;
  v_interval INTERVAL YEAR TO MONTH;
  v_year     NUMBER;
  v_month    NUMBER;
  v_date     DATE;
  v_uinterv  interval YEAR TO MONTH;
BEGIN
  v_start    := TO_TIMESTAMP('&v_date', 'yyyy-MM-dd'); --赋指定的时间戳值(此处优化了代码,允许用户任意输入一个日期(年月日,如2015-08-03))
  v_end      := CURRENT_TIMESTAMP; --赋当前的时间戳值
  v_interval := (v_end - v_start) YEAR TO MONTH; --YEAR TO MONTH是INTERVAL表达式语法。
  v_year     := EXTRACT(YEAR FROM v_interval); --提取年份和月份
  v_month    := EXTRACT(MONTH FROM v_interval);
  --输出当前的INTERVAL类型的值
  DBMS_OUTPUT.put_line(to_char(v_start, 'yyyy-mm-dd') || '与当前时间的间隔INTERVAL值为:' ||
                       v_interval);
  --输出年份与月份值
  DBMS_OUTPUT.put_line('INTERVAL年份为:' || v_year || CHR(13) || CHR(10) ||
                       'INTERVAL月份为:' || v_month);
 --直接为INTERVAL赋值
--此处增强代码,允许用户任意输入一个间隔(年月,如10年8个月,10-08),并计算经过该间隔定义的年月后的日期,
--如,17年后,您的孩子上大学时,是哪一年呢?☺
--彩蛋:如何在英文输入法下,输入笑脸?
--答案:1.打开Numlock开关(即小键盘/数字区)
--2. 按住Alt的同时,在小键盘区域连续输入9786,☺就会出现*                 
  v_interval := INTERVAL '&v_uinterv' YEAR TO MONTH; 
  --输出INTERVAL的值
  DBMS_OUTPUT.put_line('当前的INTERVAL值为:' || v_interval);
  v_year :=EXTRACT(YEAR FROM v_interval);
  v_month :=EXTRACT(month FROM v_interval);
   DBMS_OUTPUT.put_line(v_year||'年'||v_month||'月后的日期为:'||to_char((sysdate+v_interval),'yyyy-mm-dd'));
  v_interval := INTERVAL '01' YEAR; --直接为INTERVAL赋年份值
  DBMS_OUTPUT.put_line('当前的INTERVAL值为:' || v_interval);
  --提取年份和月份
  v_year  := EXTRACT(YEAR FROM v_interval);
  v_month := EXTRACT(MONTH FROM v_interval);
  --输出值
  DBMS_OUTPUT.put_line('INTERVAL年份为:' || v_year || CHR(13) || CHR(10) ||
                       'INTERVAL月份为:' || v_month);
  v_interval := INTERVAL '03' MONTH; --直接为INTERVAL赋月份
  --输出月份值
  DBMS_OUTPUT.put_line('当前的INTERVAL值为:' || v_interval);
END;

--代码 3.17 布尔类型使用示例
DECLARE
  v_condition BOOLEAN;
BEGIN
  v_condition := TRUE;
  -- v_condition := 'FALSE';
  IF v_condition
  THEN
    dbms_output.put_line('布尔值为True');
  END IF;
END;

--代码3.18 弱类型REF CURSOR使用示例
CREATE OR REPLACE FUNCTION selectallemployments
   RETURN sys_refcursor           --定义一个返回sys_refcursor的函数
AS
   st_cursor   sys_refcursor;
BEGIN
   OPEN st_cursor FOR             --使用该函数查询所有的员工记录
      SELECT *
        FROM emp;
   --返回指向游标的指针
   RETURN st_cursor;
END;


--代码3.19 使用引用游标示例
DECLARE
   x       sys_refcursor;    --定义引用游标变量
   v_emp   emp%ROWTYPE;      --定义获取游标结果的记录类型
BEGIN
   x := selectallemployments;--调用函数获取游标指针
   --循环遍历游标指针
   LOOP
      FETCH x                --提取游标数据
       INTO v_emp;
      --当没有找到游标记录时则退出
      EXIT WHEN x%NOTFOUND;
      --输出记录信息
      DBMS_OUTPUT.put_line (   '员工编号:'
                            || v_emp.empno
                            || '   员工名称:'
                            || v_emp.ename
                           );
   END LOOP;
END;


--代码3.20 用户自定义类型示例
DECLARE
  SUBTYPE empcounttype IS INTEGER;
  empcount empcounttype;
BEGIN
  SELECT COUNT(*)
  INTO   empcount
  FROM   emp;
  dbms_output.put_line('员工人数为:' || empcount);
END;


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
新酷数据网站管理系统免费完整版Newcool v9.001.45版 一、基本说明: 本程序适用于中小型ASP网站的快速建设; 结构:ASP+ACESS+FSO。 二、功能说明: 主要栏目设置: 新闻系统(二级分类) 公告系统 投票系统 图片系统(二级分类,组图功能) 文章系统(二级分类) 教程系统(第二文章系统,可关闭或设置整体查阅权限) 软件系统(二级分类) 留言系统 友情链接 交互式会员系统(VIP及贵宾会员可在前台提交信息,后台由管理员审核) 会员短信系统 频道系统(可生成ASP文件,实现见名知义) 广告系统(图片/SWF/JS/框架广告,后台可关闭) 作品展示系统 订单系统 影音系统(二级分类,可播放MP3、WMA、WMV、RM、FLV等) 混合型专题(内容聚合,将所有栏目中的相关内容放在一个页面中显示) 部分页面静态生成 主要功能与特色介绍 完全兼容IE与Firefox 系统结构良好,搜索引擎收录快速 网站缓存功能 前台采用ASP与HTML代码分离的模板技术,采用风格模板来管理,使网站个性化更方便 自由设置的SQL防注功能 内容转向链接功能,方便引用外部内容 功能强大的参数过滤功能,确保程序安全 导航菜单管理功能 交互式会员系统,VIP及贵宾会员可发布文章/教程/图片/软件/新闻/影音 混合型专题功能,可整合新闻/文章/教程/软件/图片/影音/频道/作品栏目,方便查看全站相关内容 自由编辑、组合任一管理员、会员权限 后台管理员权限可细分至某个栏目的某个分类(如管理文章系统中的图形处理分类内容) 全站最新信息RSS生成 频道功能,自由设定内容,页面结构自由设置 站点地图 首页头条新闻、首页自定义内容 网站音乐播放器 上传文件超强过滤,确保文件真实性 上传文件智能化分类管理 管理员公告板及会员公告板,类似便笺,便于站内适时交流 后台栏目同步发表功能 广告系统 订单系统 客户管理 后台网站日志,是站长专用的BLOG 后台管理日志,全面记录管理员在后台的一切行动,以及VIP会员在前台的提交情况 方便快捷的后台栏目批处理功能 流量统计(可关闭) 后台分布式帮助系统,帮助管理员快速掌握系统的使用 数据库管理功能 灵活多变的风格,适合不同的工作环境及要求 灵活调用的模板标签,可在任何页面、任何位置进行任意调用 部分页面静态化,可批量生成默认页面,也可手工生成任何页面 后台部分栏目名称自定义 原创后台内容发布预置输入功能,减少一次性批量输入相关内容的重复输入或鼠标点击,给客户带来 更好的人性化体验; 会员短信系统,轻松实现会员间、会员与管理员间的交流 后台登录允许IP地址列表功能 内容关键词链接到站内搜索功能 作品栏目增加二级分类 内容页广告位预置管理 留言系统进行更新,可实现悄悄话留言及悄悄话回复,留言者(会员)可查看自己的悄悄话及别人回 复给自己的悄悄话; SEO优化 后台智能系统,实现定期自动操作,提高后台安全性,实现简单站内资源防盗链 无处不在的人性化设置,使管理者顺心,让浏览者舒心 三、特色: 1、上手容易: 解压后即可投入使用,基本设置可在后台搞定,同时也有超级管理员帮助系统,使您快速掌握本系统 。 2、建站迅速: 本系统采用ASP+FSO+ACESS,建站成本低廉、快速,可以快速建立一个界面好、功能强、安全性高的中 小型WEB站点。 3、功能强大: 本系统定位于中小型ASP网站程序,前后台操作方便,功能强大。 4、个性设置: 本系统设置有许多贴心设计,助您轻松、愉悦掌握系统操作;全站风格模板化,便于风格交流,满足 个性要求。 5、改造容易: 本系统采用开放式设计,每个文件皆有相应说明,助你轻松改造。 四、使用: 数据库设置:前台数据库链接地址修改在Ft_conn.asp文件中,后台数据库链接地址修改在 admin/Ft_conn_admin.asp文件中; 网站基本参数设置在Ft_config.asp文件中,在后台通过FSO功能进行实时修改,如果你的网站空间不 支持FSO,可以手工编辑此文件,然后再重新上传,即可实现设置的更改; 首页文章/软件分类调用,请在后台分好类后,打开首页风格模板,填入想要在首页调用的大类ID值( cat_id),即可在首页实现分类调用; 当网站处于关闭状态时,为安全起见,在提示页面中没有提供管理员登录链接,管理员可在IE地址栏 直接输入admin/admin_login.asp,即可直接登录; 后台登录:admin/admin_login.asp,初始帐号/密码:admin/adminadmin。 更多使用说明详见后台在线帮助系统。 五、客服: 官方网站:http://www.xksj.net.cn 技术讨论:http://bbs.xksj.net/ 官方演示:http://web.xksj.net/200812/ruanjian/ 商业版演示:http://web.xksj.net

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值