set serveroutput on;//可以输出,原来是关闭的,环境变量
begin
dbms_output.put_line('helloworld!');
end;
/
变量声明规则
1、 变量名不能使用保留字
2、 第一个字符必须是字母 默认变量要以v_开头
3、 变量名最多包含30个字符
4、 不要与数据库的表或者列同名
5、 第一行只能声明一个变量
常用变量类型
1、 binary_integer: 整数,主要用来计数而不是用来表示字段类型
2、 number: 数字类型
3、 char: 定长字符串
4、 varchar2: 变长字符串
5、 date: 日期
6、 long: 长字符串,最长2G
7、 boolean: 布尔类型,可取值为true,false,null
--Table变量类型 表示一个数组
declare
--type定义一个新类型 type_table_emp_empno 类型名 binary_integer;下标类型
type type_table_emp_empno is table of emp.empno%type index by binary_integer;
v_empnos type_table_emp_empno ;
begin
v_empnos(0) := 7369;
v_empnos(2) := 8888;
v_empnos(-1) := 9999;
dbms_output.put_line(v_empnos(-1));
end;
--Record变量类型, 相当于类
declare
type type_record_dept is record
(
deptno dept.deptno%type,
dname dept.dname%type,
loc dept.loc%type
);
v_temp type_record_dept;
begin
v_temp.deptno := 50;
v_temp.dname := 'aaaa';
v_temp.loc := 'bbb';
dbms_output.put_line(v_temp.deptno||v_temp.dname||v_temp.loc);
end;
--使用%rowtype声明record变量
declare
v_temp dept%rowtype; --把dept表里面的列给添加到v_temp record中
begin
v_temp.deptno := 50;
v_temp.dname := 'aaaa';
v_temp.loc := 'bbb';
dbms_output.put_line(v_temp.deptno||v_temp.dname||v_temp.loc);
end;
--变量声明,使用xtype属性 -- /* */ 代表注释
declare
v_empno number(4);
v_empno2 emp.empno%type; --%type类型与emp表中的empno类型一样
v_empno3 v_empno2%type;
begin
dbms_output.put_line('test');
end;
--PL/SQL中SQL语句的运用
declare
v_ename emp.ename%type;
v_sal emp.sal%type;
begin
--select 必须和into一起用,并且返回有且只有一条记录
select ename,sal into v_ename,v_sal from emp where empno = 7369;
dbms_output.put_line(v_ename||''||v_sal);
end;
declare
v_emp emp%rowtype;
begin
select * into v_emp from emp where empno = 7369;
dbms_output.put_line(v_emp.ename||''||v_emp.sal);
end;
declare
v_deptno dept.deptno%type := 50;
v_dname dept.dname%type := 'aaaa';
v_loc dept.loc%type := 'cccc';
begin
insert into dept2 values (v_deptno,v_dname,v_loc);
dbms_output.put_line(sql%rowcount||'条记录被影响');--sql%rowcount返回影响的行数
commit;
end;
begin
--创建表时要写execute immediate
execute immediate 'create table T (nnn varchar2(20) default ''aaa'')';
end;
--if语句
declare
v_sal emp.sal%type;
begin
select sal into v_sal from emp where empno = 7369;
if (v_sal < 1200) then
dbms_output.put_line('low');
elsif (v_sal < 2000) then --elsif = else if
dbms_output.put_line('middle');
else
dbms_output.put_line('high');
end if;
end;
--循环
declare
i binary_integer := 1;
begin
loop
dbms_output.put_line(i);
i := i + 1;
exit when (i >= 11);
end loop;
end;
declare
i binary_integer := 1;
begin
while i < 11 loop
dbms_output.put_line(i);
i := i + 1;
end loop;
end;
declare
i binary_integer := 1;
begin
for i in 1..10 loop
dbms_output.put_line(i);
end loop;
end;
declare
i binary_integer := 1;
begin
for i in reverse 1..10 loop
dbms_output.put_line(i);
end loop;
end;
//exception异常
declare
v_num number := 0;
begin
v_num := 2/v_num;
dbms_output.put_line(v_num);
exception
when others then
dbms_output.put_line('error');
end;
/
too_many_rows
no_data_found
others
--创建一个异常表,保存异常信息
create table errorlog
(
id number primary key,
errcode number,
errmsg varchar2(1024),
errdate date
);
create sequence seq_errorlog_id start with 1 increment by 1;
declare
v_deptno dept.deptno%type := 10;
v_errcode number;
v_errmsg varchar2(1024);
begin
delete from dept where deptno = v_deptno;
commit;
exception
when others then
rollback;
v_errcode := SQLCODE;
v_errmsg := SQLERRM;
insert into errorlog values (seq_errorlog_id.nextval,v_errcode,v_errmsg,sysdate);
commit;
end;