dbms_output.put_line想要输出必须设置为on才能在控制台输出:
set serveroutput on;
一。pl/sql语句块:
1.语法:
DECLARE --可选项
定义变量、游标、用户异常
BEGIN --必须的
--sql语句
pl/sql语句
EXCEPTION --可选
当发生错误时的处理动作
END; --必须的
2.例子:
DECLARE
v_ename varchar2(10);
BEGIN
select ename
into v_ename
from emp
where empno=7788;
dbms_output.put_line('员工号为7788的名字是'|| v_ename);
END;
注意:
dbms_output.put_line();需要set serveroutput on支持。
3.变量:
在声明部分声明和创建变量;
在可执行部分为变量赋值,通过参数为pl/sql块传值;
通过输出变量查看结果;
①.变量类型:
pl/sql变量: 标量 、复合变量 、参考变量 、LOB(大对象)
非pl/sal变量: Bind 、 host
②.声明变量
Declare
v_hiredate DATE;
v_deptno number(2) not null :=10;
v_location varchar2(13) :='北京';
c_comm constant number :=1000;
其中,
constant表示程序运行不能改变他修饰的值。
也可以用default代替(:=)
通常用(v_列名)来声明某一列。
一行声明一个变量。
③.使用%type属性声明变量
v_name emp.ename%type;
v_banlance number(7,2);
v_min_banlance v_banlance%type :=10;
用%type会更灵活,但是牺牲的是性能。
④.给变量赋值:
v_hiredate :='31-DEC-19';
v_deptno :=20;
⑤绑定变量
在declare外面声明的变量。
如果要引用一个绑定变量,必须加一个冒号前缀。
variable g_salary number
declare
v_sal emp.sal%type;
begin
select sal
into v_sal
from emp
where empno=7369;
:g_salary :=v_sal;
end;
4.注释:
单行注释用”–“
多行注释用”/* … */“
5.块的嵌套及作用域
DECLARE
v_weight number(3) :=600;
v_message varchar2(255) :='product 2019';
v_new_locn varchar2(50) :='CHINA';
BEGIN
DECLARE
v_weight number(3) :=1;
v_message varchar2(255) :='product 2010';
BEGIN
v_weight :=v_weight+1;
v_new_locn :='Western ' || v_new_locn ;
dbms_output.put_line('v_weight 的值:' || v_weight );
dbms_output.put_line('v_new_locn 的值:' || v_new_locn );
END;
v_weight :=v_weight+1;
v_new_locn :='china ' || v_new_locn ;
dbms_output.put_line('v_weight 的值:' || v_weight );
dbms_output.put_line('v_new_locn 的值:' || v_new_locn );
dbms_output.put_line('v_message 的值:' || v_message );
END;
输出为:
v_weight 的值:2
v_new_locn 的值:Western CHINA
v_weight 的值:601
v_new_locn 的值:china Western CHINA
v_message 的值:product 2
二。pl/sql语句块中的SQL
使用select语句可以取出数据行,但只能返回一行数据。如果要返回多条数据,要用游标。
使用DML语句修改数据库的行。
使用commit、rollback或者savepoint语句来控制事务。
使用隐式游标检验DML语句的输出。
1.DML语句:
就是把SQL语句写在begin和end块中。
declare
v_sal emp.sal%type;
begin
select sal
into v_sal
from emp
where empno=7369;
end;
2.事务控制
一个事务以commit和rollback开始,用来初始化一个新的事务。
一个事务以commit和rollback结束。
三。练习
1.写一个pl/sql块,从dept表中找出最大的部门号,并保存到SQL plus变量中。打印出变量的值。
var G_max_deptno number
begin
select max(deptno)
into :G_max_deptno
from dept;
end;
/
print G_max_deptno
2.写一个pl/sql块,修改现在部门的位置。要求:客户输入需要修改的部门号,然后在输入新的部门地址。并显示出来修改后的信息。
declare
v_deptno dept.deptno%type;
v_dept_loc dept.loc%type;
begin
v_deptno :=&deptno;
v_dept_loc :='&localtion';
update dept set loc =v_dept_loc where deptno=v_deptno ;
select deptno, loc into v_deptno ,v_dept_loc from dept where deptno=v_deptno ;
dbms_output.put_line('部门:' || v_deptno || '修改后的地址:' || v_dept_loc );
end;