oracle学习笔记(四)高级特性

 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;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值