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


代码如下:

--第三章开始
--代码3.1 变量定义示例
DECLARE
   v_empname    VARCHAR2 (20);   --定义员工名称变量
   v_deptname   VARCHAR2 (20);   --定义部门名称变量
   v_hiredate   DATE         NOT NULL := SYSDATE;  --定义入职日期变量
   v_empno      INT          NOT NULL DEFAULT 7369;--变量员工编码变量
BEGIN
   NULL;                       --不执行任何代码
END;


--如果不为变量赋初始值,结果为null(代码已优化)
DECLARE
   v_counter INTEGER;          --定义一个变量
BEGIN
   v_counter:=v_counter+1;     --没有为变量赋初始值直接计算
   if v_counter is null
     then
   DBMS_OUTPUT.put_line('未赋值的变量示例结果为:null');
   end if;
END;  


--如果为变量赋初始值,可正常计算
DECLARE
   v_counter INTEGER;          --定义一个变量
BEGIN
   v_counter:=0;               --为变量赋初值
   v_counter:=v_counter+1;     --没有为变量赋初始值直接计算
   DBMS_OUTPUT.put_line('未赋值的变量示例结果:'||v_counter);
END;  


--代码3.2 使用数据库数据为变量赋值
DECLARE
   v_empno      emp.empno%TYPE;                  --定义变量
   v_ename      emp.ename%TYPE;
   v_hiredate   emp.hiredate%TYPE;
BEGIN
   SELECT empno, ename, hiredate                 --查询数据库并为变量赋值
     INTO v_empno, v_ename, v_hiredate
     FROM emp
    WHERE empno = &empno;
   --输出变量的内容
   DBMS_OUTPUT.put_line ('员工编号:' || v_empno);
   DBMS_OUTPUT.put_line ('员工名称:' || v_ename);
   DBMS_OUTPUT.put_line ('雇佣日期:' || v_hiredate);
END;

--代码3.3 使用%Rowtype获取数据库列数据
DECLARE
   v_emp   emp%ROWTYPE;                               --定义emp表的所有列类型
BEGIN
   SELECT *                               --查询emp表并将结果写入到v_emp记录中
     INTO v_emp
     FROM emp
    WHERE empno = &empno;

   --输出结果信息
   DBMS_OUTPUT.put_line (v_emp.empno || CHR (13) || CHR (10) || v_emp.ename);
END;


--代码3.4 将%rowtype定义的变量插入表
DECLARE
   v_emp emp%ROWTYPE;              --定义emp表列类型的记录
BEGIN
   v_emp.empno:=8000;              --为记录类型赋值
   v_emp.ename:='张三丰';
   v_emp.job:='掌门';
   v_emp.mgr:=7902;
   v_emp.hiredate:=date'2010-12-13';
   v_emp.sal:=8000;
   v_emp.deptno:=20;
   INSERT INTO emp VALUES v_emp;   --将记录类型插入到数据表
END;

select * from emp;

--代码3.5 使用%rowtype定义游标类型的变量
DECLARE
  CURSOR emp_cursor --定义游标类型
  IS
    SELECT empno, ename, job, sal, hiredate
    FROM   emp;
  --使用%ROWTYPE定义游标类型的变量
  v_emp emp_cursor%ROWTYPE;
BEGIN
  OPEN emp_cursor; --打开游标
  --循环并提取游标数据
  LOOP
    FETCH emp_cursor
      INTO v_emp;
    --要注意游标移动到最尾部退出游标
    EXIT WHEN emp_cursor%NOTFOUND;
    --输出游标数据
    DBMS_OUTPUT.put_line(v_emp.empno || ' ' || v_emp.ename || ' ' || v_emp.job || ' ' ||
                         v_emp.sal || ' ' ||
                         TO_CHAR(v_emp.hiredate, 'YYYY-MM-DD'));
  END LOOP;
  --关闭游标
  CLOSE emp_cursor;
END;


--代码3.6 变量的作用域和可见性示例(此段代码在PL/SQL中编译不通过,但可在SQLPLUS中成功执行)
<<outer>>
DECLARE
   v_empname VARCHAR2(20);          --定义外层块变量
BEGIN
   v_empname:='张三';               --为外层外的变量赋初值
   <<inner>>
   DECLARE
      v_empname VARCHAR2(20);       --定义与外层块同名的内层块的变量
   BEGIN
      v_empname:='李四';            --为内层块变量赋值
      --输出内层块的变量
      DBMS_OUTPUT.put_line('内层块的员工名称:'||v_empname);
      --在内层块中访问外层块的变量
      DBMS_OUTPUT.put_line('外层块的员工名称:'||outer.v_empname);
   END;
   DBMS_OUTPUT.put_line('outer员工名称:'||v_empname);  --在外层块中访问变量
END;   

--代码3.7 常量定义示例
DECLARE
   c_salary_rate   CONSTANT NUMBER (7, 2) := 0.25;  --定义加薪常量值
   v_salary                 NUMBER (11, 2);          --定义保存薪资结果的变量
BEGIN
   SELECT sal * (1 + c_salary_rate)                 --查询数据库,返回加薪后的结果
     INTO v_salary
     FROM emp
    WHERE empno = &empno;
   --输出屏幕消息
   DBMS_OUTPUT.put_line ('加薪后的薪资:' || v_salary);
END;

commit;

select * from emp where empno=5093;

--代码3.8 CHAR类型定义示例
DECLARE
   v_name CHAR(2 BYTE);
   v_name2 CHAR(2 CHAR);
   v_name3 CHAR;
   v_name4 CHAR(20);
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类型定义示例(代码已增强,加入了和NVARCHAR2的比较)
DECLARE
  v_name VARCHAR2(25);
  v_name1 VARCHAR2(25 BYTE);
  v_name2 VARCHAR2(25 CHAR);   
  v_name3 NVARCHAR2(25 CHAR); 
  v_length number(10); 
  --v_name3 VARCHAR2;          --错误,必须要为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:='一二三四五六七八九十0123456789一二三四1';
  DBMS_OUTPUT.put_line('v_name1变量的长度为:'||LENGTH(v_name2)||'字符');  
  v_name3:='一二三四五六七八九十一二三四五六七八九十一二三四五';
  select LENGTHB(v_name3) into v_length  from dual;
  DBMS_OUTPUT.put_line('v_name1变量的长度为:'||LENGTH(v_name2)||'字符,'||v_length||'个字节');     
END; 

--代码3.10 ROWID使用示例
DECLARE
   v_empname      ROWID;                                --定义ROWID类型的变量
   v_othersname   VARCHAR (18);               --定义用来保存ROWID的字符串变量
BEGIN
   SELECT ROWID                               --查询并获取ROWID的值
     INTO v_empname
     FROM emp
    WHERE empno = &empno;
   --输出ROWID值
   DBMS_OUTPUT.put_line (v_empname);
   v_othersname := ROWIDTOCHAR (v_empname);    --转换ROWID为字符串值
   DBMS_OUTPUT.put_line (v_othersname);
END;

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值