第6章:PL/SQL块
--6-19begin
p3(var_job=>'SALESMAN',i,j,k);end;/declarecursor cur_emp(var_job in varchar2:='SALESMAN')isselect empno,ename,sal from emp where job=var_job;type record_emp is record
(
x emp.empno%type,
y emp.ename%type,
z emp.sal%type);
emp_row record_emp;beginopen cur_emp('MANAGER');fetch cur_emp into emp_row;while cur_emp%found loop
dbms_output.put_line(emp_row.x||emp_row.y||emp_row.z);fetch cur_emp into emp_row;endloop;close cur_emp;end;/
完整结构:
[declare
变量,常量]begin
执行部分
[exception
异常处理]end;/
简写形式:
begin
执行部分
...end;/6.2变量与常量:
1.变量与常量定义必须在declare中。
合法标识:
必须以字母开头,长度不能超过30个字符。
标识符中不能包含减号“-”和空格。
Oracle标识符不区分大小写。
标识符不能是SQL保留字。
例题:
v_name varchar2(20)--对2010_name varchar2(20)--错
v-name varchar2(20)--错
v name varchar2(20)--错user varchar2(20)--错2.基本数据类型
1)数值类型:
例题:
declar
num_mo number(5,2);--小数位2位,整数位3位2)字符类型:
char
varchar2
例题:
declare
str varchar2(20);begin
str:='hello,everyone';
dbms_output.put_line(str);end;/3)日期类型:
declare
d1 date:= sysdate;
d2 date:='10-5月-2018';
或者d2 date:=to_date('10-5月-2018');4)布尔类型boolean:取值true、false、null
实际使用:
3.变量与常量声明注意事项:
例题:
declare
v_ename varchar2(20);
v_sal number(6,2);
c_tax_rate constant number(3,2):=5.5;--声明常量时,必须为它赋初始值,并且数值不能改
v_hiredate date;
v_valid booleannotnulldefaultfalse;beginnull;--begin与end之间至少有一条语句end;/6.2.2特殊数据类型
1.%type类型
a)用基本数据类型:
declare
x varchar2(10);
y varchar2(9);beginselect ename,job into x,y from emp where empno=7369;
sys.dbms_output.put_line(x||'的工作为'||y);end;/
b)%type类型
比如在system账户下:
declare
x scott.emp.ename%type;
y scott.emp.job%type;beginselect ename,job into x,y from scott.emp where empno=7369;
sys.dbms_output.put_line(x||'的工作为'||y);end;/
比如在scott账户下:
declare
x emp.ename%type;
y emp.job%type;beginselect ename,job into x,y from emp where empno=7369;
dbms_output.put_line(x||'的工作为'||y);end;/2.record类型
a)用%type类型
declare
x emp.ename%type;
y emp.job%type;
z emp.sal%type;beginselect ename,job,sal into x,y,z from emp where empno=7369;
dbms_output.put_line(x||y||z);end;/
b)用record类型
declaretype e_r is record
(
x emp.ename%type,
y emp.job%type,
z emp.sal%type);
e e_r;beginselect ename,job,sal into e from emp where empno=7369;
dbms_output.put_line(e.x||e.y||e.z);end;/
或者:
declaretype e_r is record
(
x varchar2(10),
y varchar2(9),
z number(7,2));
e e_r;beginselect ename,job,sal into e from emp where empno=7369;
dbms_output.put_line(e.x||e.y||e.z);end;/
补充:&的用法
declare
x emp.ename%type;
y emp.job%type;
z emp.sal%type;beginselect ename,job,sal into x,y,z from emp where empno=&员工编号;
dbms_output.put_line(x||y||z);end;/
或者:
declare
x emp.ename%type;
y emp.job%type;
z emp.sal%type;
m emp.empno%type;begin
m:=&员工编号;select ename,job,sal into x,y,z from emp where empno=m;
dbms_output.put_line(x||y||z);end;/3.%rowtype类型
declare
e emp%rowtype;beginselect*into e from emp where empno=7369;
dbms_output.put_line(e.ename||e.sal||e.job);end;/6.3流程控制语句
6.3.1选择语句
if语句:
1)单分支
if 条件 then
语句序列;endif;2)双分支
if 条件 then
语句序列1;else
语句序列2;endif;3)多分支
if 条件1