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

~接上篇。

代码如下:

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值