一、PL/SQL的特点
1、运行在服务器端
(1)缺点:消耗服务器端CUP;
(2)优点:兼容性更好、性能稍好;
2、锁(依赖关系造成的锁)
共享锁、空锁、独占锁。
3、某些功能无法替代
二、PL/SQL块结构
PL/SQL块由三个部分组成:声明部分、执行部分、异常处理部分。
Declare(可选)
……
begin
……
exception (可选)
……
end;
1、只包含执行块的PL/SQL块。
SQL> begin
2 dbms_output.put_line('OK');
3 end;
4 /(执行PL/SQL块)
PL/SQL 过程已成功完成。
SQL> set serveroutput on(打开输出缓冲区)
注:dbms_output是用于输出信息的PL/SQL系统包,是包中的过程。
2、包含声明部分和执行部分的PL/SQL块。
SQL> select * from empl;
ENO ENAME DEPT SAL
---------- -------------------- ------------------------------ ----------
1001 jack sa 8900
1002 jim sb 5900
1003 tom sc 8000
SQL> declare
2 v_name varchar2(20);
3 begin
4 select ename into v_name from empl where eno=&no;
5 dbms_output.put_line('雇员名'||v_name);
6 end;
7 /
输入 no 的值: 1001
原值 4: select ename into v_name from empl where eno=&no;
新值 4: select ename into v_name from empl where eno=1001;
雇员名jack
3、完整的PL/SQL块。
SQL> declare
2 v_ename varchar2(20);
3 begin
4 select ename into v_ename from empl where eno=&no;
5 dbms_output.put_line('雇员名'||v_ename);
6 exception
7 when no_data_found then
8 dbms_output.put_line('请输入正确的雇员名');
9 end;
10 /
输入 no 的值: 1
原值 4: select ename into v_ename from empl where eno=&no;
新值 4: select ename into v_ename from empl where eno=1;
请输入正确的雇员名
三、变量
1、标识符
标识符不能超过30个字符。
第一个字符必须是字母。
不分大小写。
不能用’-‘;
不能是SQL保留字
2、复合变量
(1)记录类型
declare
type test_rec is record(
code varchar2(10),
name varchar2(30) not null :='a book'
);
v_book test_rec;
begin
v_book.code:='123';
v_book.name:='c++';
dbms_output.put_line(v_book.code||v_book.name);
end;
/
(2)%Type
SQL> declare
2 v_ename empl.ename%type;
3 v_dept empl.dept%type;
4 v_sal empl.sal%type;
5 begin
6 select ename,dept,sal into v_ename,v_dept,v_sal from empl where eno=&no;
7 dbms_output.put_line('员工姓名:'||v_ename);
8 dbms_output.put_line('员工部门:'||v_dept);
9 dbms_output.put_line('员工薪水:'||v_sal);
10 end;
11 /
输入 no 的值: 1001
原值 6: select ename,dept,sal into v_ename,v_dept,v_sal from empl where eno=&no;
新值 6: select ename,dept,sal into v_ename,v_dept,v_sal from empl where eno=1001;
员工姓名:jack
员工部门:sa
员工薪水:8900
(3)%rowtype
SQL> declare
2 v_emp empl%rowtype;
3 begin
4 select * into v_emp from empl where rownum=1;
5 dbms_output.put_line('eno:'||v_emp.eno);
6 dbms_output.put_line('ename:'||v_emp.ename);
7 end;
8 /
eno:1001
ename:jack
3、变量的作用范围(同义词的道理一样,优先级)
delcare
num number(8):=100;
begin
declare
num number(8):=1000;
begin
dbms_output.put_line(num);
end;
end;
/
四、注释
(1)‘—’单行注释。
(2)/*****************************/多行注释。