代码如下:
--第三章开始
--代码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;