SQL:3.2数据类型-20190101

---代码3.8 CHAR类型定义示例
DECLARE
   V_NAME CHAR(2 BYTE);
   V_NAME2 CHAR(2 CHAR);
   V_NAME3 CHAR;
   V_NAME4 CHAR(50);
BEGIN
   V_NAME := 'ab';       ---正确,2个字节的字符串
   --V_NAME := '中国';   ---错误,大于2个字节
   V_NAME2 := '中国';    ---正确,2个字符
   V_NAME3 := 1;         ---正确,单个字节
   V_NAME4 := 'This is string';   ---为CHAR赋字符串值
   DBMS_OUTPUT.put_line(LENGTH(V_NAME4));  ---输出字符串长度
END;



---代码3.9 VARCHAR2类型定义示例
DECLARE
   V_NAME VARCHAR2(25);
   V_NAME1 VARCHAR2(25 BYTE);
   V_NAME2 VARCHAR2(25 CHAR);
   --V_NAME3 VARCAHR2;   ---错误,必须要为VARCHAR2指定长度值
BEGIN
   V_NAME := '中华人名共和国';
   DBMS_OUTPUT.put_line('V_NAME变量的长度为:'||LENGTH(V_NAME)||'字节');
   V_NAME1 := '中华人民共和国';
   DBMS_OUTPUT.put_line('V_NAME1变量的长度为:'||LENGTH(V_NAME1)||'字节');
   V_NAME2 := '中华人民共和国';
   DBMS_OUTPUT.put_line('V_NAME2变量的长度为:'||LENGTH(V_NAME2)||'字节');
END;



---代码3.10 ROWID使用示例
DECLARE
   V_EMPNAME ROWID;
   V_OTHERSNAME VARCHAR(18);
BEGIN
   SELECT ROWID INTO V_EMPNAME FROM EMP WHERE EMPNO = &EMPNO;
   DBMS_OUTPUT.put_line(V_EMPNAME);
   V_OTHERSNAME := ROWIDTOCHAR(V_EMPNAME);
   DBMS_OUTPUT.put_line(V_OTHERSNAME);
END;



---代码3.11 NUMBER类型声明示例
DECLARE
   V_NUM1 NUMBER := 3.1415926;  ---结果:3.1415926
   V_NUM2 NUMBER(3) := 3.1415926;   ---四舍五入等于3
   --V_NUM2_1 NUMBER(3) := 3145.1415926;   ---错误,精度太高
   V_NUM3 NUMBER(4,3) := 3.1415926;  ---结果:3.142
   --V_NUM3_1 NUMBER(4,3) := 314.123;  ---错误,精度太高
   V_NUM4 NUMBER(8,3) := 31415.9267;  ---四舍五入2为小数,结果为:31415.927
   V_NUM5 NUMBER(4,-3) := 3145611.789;  ---由于为负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;
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);
END; 



---代码3.13 DATE类型使用示例
DECLARE
   ---输出当前周的第1天,即星期日的日期
   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.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 弱类型PRE CURSOR使用示例
CREATE OR REPLACE FUNCTION SELECTALLEMPLOYMENTS RETURN 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.25 显式转换示例
DECLARE
  V_STARTDATE DATE;
  V_ENDDATE DATE;
  V_RESULTDATE NUMBER;
BEGIN
  --起始日期,将字符串转换为日期
  V_STARTDATE := TO_DATE ('2007-10-11', 'YYYY-MM-DD');
  V_ENDDATE := TRUNC(SYSDATE);  --赋日期值
  V_RESULTDATE := V_ENDDATE - V_STARTDATE;
  ---输出二者相差天数
  DBMS_OUTPUT.put_line('起始日期:'
                            || TO_CHAR(V_STARTDATE, 'YYYY-MM-DD')
                            || CHR(13)
                            || CHR(10)
                            || '结束日期:'
                            || TO_CHAR(V_ENDDATE, 'YYYY-MM-DD')
                            || CHR(13)
                            || CHR(10)
                            || '相差天数:'
                            || TO_CHAR(V_RESULTDATE));
END;



---代码3.26 隐式转换示例
DECLARE
  V_STARTDATE CHAR(10);
  V_ENDDATE CHAR(10);
  V_RESULT NUMBER(5);
BEGIN
  SELECT MIN(HIREDATE)INTO V_STARTDATE FROM EMP;
  SELECT TRUNC(SYSDATE) INTO V_ENDDATE FROM DUAL;
  --输出2者相差天数
  DBMS_OUTPUT.put_line('起始日期:'
                        || V_STARTDATE
                        || CHR(13)
                        || CHR(10)
                        || '结束日期:'
                        || V_ENDDATE);
  V_STARTDATE := '200';
  V_ENDDATE := '400';
  V_RESULT := V_ENDDATE - V_STARTDATE;
END;

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值