---代码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;