~接上篇。
代码如下:
--代码3.21 子类型定义使用示例
DECLARE
TYPE empnamelist IS TABLE OF VARCHAR2 (20); --定义表类型
--定义表类型的子类型
SUBTYPE namelist IS empnamelist;
--定义员工记录
TYPE emprec IS RECORD (
empno NUMBER (4),
ename VARCHAR2 (20)
);
--定义员工记录子类型
SUBTYPE emprecord IS emprec;
--定义数据库表emp中的empno列类型
SUBTYPE empno IS emp.empno%TYPE;
--定义数据库表emp中的行记录子类型
SUBTYPE emprow IS emp%ROWTYPE;
BEGIN
NULL;
END;
--代码3.22 子类型数值检查示例
DECLARE
SUBTYPE numtype IS NUMBER (1, 0); --定义子类型
--定义子类型变量
x_value numtype;
y_value numtype;
BEGIN
x_value := 3; --正常
y_value := 10; --弹出异常提示
END;
--代码3.23 未约束类型示例
DECLARE
SUBTYPE numtype IS NUMBER; --定义类型和变量
x_value NUMBER;
y_value numtype;
BEGIN
x_value:=10; --赋初值
y_value:=x_value; --类型交换
END;
--代码3.24 基类型相同使用示例
DECLARE
SUBTYPE numtype IS VARCHAR2(200); --定义类型和变量
x_value VARCHAR2(20);
y_value numtype;
BEGIN
x_value:='This is a word'; --赋初值
y_value:=x_value; --类型交换
END;
--代码3.25 显式转换示例
DECLARE
v_startdate DATE; --起始日期
v_enddate DATE; --结束日期
v_resultdate NUMBER; --返回结果
v_ustartdate DATE; --起始日期
BEGIN
--起始日期,将字符串转换为日期
v_startdate := TO_DATE('&v_ustartdate', '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(20); --起始日期
v_enddate CHAR(20); --结束日期
v_result NUMBER(5);
BEGIN
SELECT MIN(hiredate)
INTO v_startdate
FROM emp; --自动转换为字符型
SELECT TRUNC(SYSDATE)
INTO v_enddate
FROM dual;
--输出两者相差天数
DBMS_OUTPUT.put_line(' 起始日期:' || v_startdate || CHR(13) || CHR(10) ||
' 结束日期:' || v_enddate);
v_startdate:='200'; --为字符串赋值
v_enddate:='400';
v_result:=v_enddate-v_startdate;
DBMS_OUTPUT.put_line(v_enddate||'减'|| v_startdate||'等于'||v_result); --对字符串进行运算
END;
--代码3.27 表达式赋值使用示例
DECLARE
v_sal NUMBER; --定义变量
v_result NUMBER;
BEGIN
SELECT sal --为变量赋值
INTO v_sal
FROM emp
WHERE empno = &empno;
v_result := v_sal * (1 + 1.5); --使用表达式赋值
END;
--代码3.28 赋值运算符示例
DECLARE
v_variable1 VARCHAR2 (200) := 'This is a '; --定义变量变赋初值
v_variable2 VARCHAR2 (100); --定义变量
v_result VARCHAR2 (500);
v_constant CONSTANT VARCHAR2 (10) := 'CONSTANT'; --定义常量赋常量值
BEGIN
v_variable2 := 'VARIABLE'; --使用操作数为变量赋值
v_result := v_variable1 || v_constant; --使用表达式为变量赋值
DBMS_OUTPUT.put_line (v_result); --输出变量结果值
END;
--代码3.29 连接运算符示例
DECLARE
x VARCHAR2 (8) := '你好,'; --定义字符串变量并赋初值
y VARCHAR2 (8) := '中国';
BEGIN
DBMS_OUTPUT.put_line (x || y); --输出字符串变量值
END;
--代码3.30 连接运算符与Null值示例
DECLARE
x VARCHAR2 (9) := '你好,'; --定义字符串变量并赋初值
y VARCHAR2 (9) := '中国!';
z VARCHAR2 (10); --未赋值则为NULL
BEGIN
DBMS_OUTPUT.put_line (x || z || NULL || y); --输出字符串变量值
END;
--代码3.31 逻辑运算符示例
--定义一个输出布尔值的过程
CREATE OR REPLACE PROCEDURE print_boolean (NAME VARCHAR2, VALUE BOOLEAN)
IS
BEGIN
IF VALUE IS NULL
THEN
DBMS_OUTPUT.put_line (NAME || ' = NULL'); --如果布尔值为NULL,结果为NULL
ELSIF VALUE = TRUE
THEN
DBMS_OUTPUT.put_line (NAME || ' = TRUE'); --如果布尔值为TRUE,结果为TRUE
ELSE
DBMS_OUTPUT.put_line (NAME || ' = FALSE'); --如果布尔值为FALSE,结果为FALSE
END IF;
END;
DECLARE
x BOOLEAN := TRUE; --定义布尔变量并赋初值
y BOOLEAN := FALSE;
BEGIN
print_boolean ('x', x); --输出布尔变量的值
print_boolean ('y', y);
print_boolean ('x AND y', x AND y); --AND运算
print_boolean ('NOT y', NOT y); --NOT运算
print_boolean ('x OR y', x OR y); --OR运算
END;
--代码3.32 比较运算符示例
DECLARE
v_value VARCHAR2 (200) := 'Johnson'; --定义并初始化变量
letter VARCHAR2 (1) := 'm';
BEGIN
--输出算述运算符结果
print_boolean ('(2 + 2 = 4)', 2 + 2 = 4);
print_boolean ('(2 + 2 <> 4)', 2 + 2 <> 4);
print_boolean ('(1 < 2)', 1 < 2);
print_boolean ('(1 > 2)', 1 > 2);
print_boolean ('(1 <= 2)', 1 <= 2);
print_boolean ('(1 >= 1)', 1 >= 1);
--输出LIKE运算符结果
IF v_value LIKE 'J%s_n'
THEN
DBMS_OUTPUT.put_line ('TRUE');
ELSE
DBMS_OUTPUT.put_line ('FALSE');
END IF;
--输出BETWEEN运算符结果
print_boolean ('2 BETWEEN 1 AND 3', 2 BETWEEN 1 AND 3);
print_boolean ('2 BETWEEN 2 AND 3', 2 BETWEEN 2 AND 3);
--输出IN运算符结果
print_boolean ('letter IN (''a'', ''b'', ''c'')',
letter IN ('a', 'b', 'c'));
print_boolean ('letter IN (''z'', ''m'', ''y'', ''p'')',
letter IN ('z', 'm', 'y', 'p')
);
END;
--代码3.33 运算符优先级示例
DECLARE
v_result NUMBER; --定义保存结果值的变量
BEGIN
--v_result := 10 + 5 * 6 - 9 / 3; --计算数学运算结果
v_result:=(10+5)*6-9/3;
DBMS_OUTPUT.put_line (TRUNC (v_result)); --输出结果
DBMS_OUTPUT.put_line (v_result);
END;