declare
   v_hello varchar(20);
begin
   v_hello := 'Hello Oracle';
   dbms_output.put_line(v_hello);
end;

begin
  dbms_output.put_line('hello');
end;
set serveroutput on;


begin
dbms_output.put('a1');
dbms_output.put('b2');
dbms_output.new_line();--输出缓存中的信息,新起一行
dbms_output.put_line('aaaaa');--会输出缓存中的信息和当前的信息,不会换行
end;

declare
 a number(3):=&请输入a;
 b number(3):=&请输入b;
 v_num number(3);
 begin
 a:=10;
 v_num:=a+b;
 dbms_output.put_line(v_num);
dbms_output.put_line(a||'+'||b||'='||v_num); --||符号进行拼接
 end;
 
 
 --绑定表字段类型%type
 --1.%type:变量和字段类型的绑定
 --2.%rowtype:表结构中的一条记录的绑定
 declare
 v_name student.name%type;
 v_sex varchar2(3);
 begin
 select name,sex into v_name,v_sex from student where id='901';
 dbms_output.put_line(v_name||v_sex);
 end;
 
 declare
  v_student student%rowtype;
  begin
  select *into v_student from student where id='901';
 dbms_output.put_line(v_student.name||v_student.sex);
  end;
  
  --控制语句
declare
 v_age number(3):=&请输入年龄;
begin
 dbms_output.put_line(v_age);
 if v_age =18 then
 dbms_output.put_line('刚成年');
    elsif v_age >18 then
  dbms_output.put_line('成年已久');
 else
 dbms_output.put_line('未成年');
 end if;
end;

--case语句
declare
 v_age number(3):=&请输入年龄;
begin
 dbms_output.put_line(v_age);
 case 
 when v_age =18 then
 dbms_output.put_line('刚成年');
 when v_age >18 then
  dbms_output.put_line('成年已久');
 else
 dbms_output.put_line('未成年');
 end case;
end;

--循环语句
--loop循环
declare
 v_i number(3):=0;
begin 
  loop
   dbms_output.put_line(v_i);
  exit when v_i>=10; --退出循环;
  v_i:=v_i+1;
  end loop;
 end;
 
 -- whlie
 declare
 v_i number(3):=0;
begin 
   while v_i<=10 loop
   dbms_output.put_line(v_i);
  v_i:=v_i+1;
  end loop;
 end;
 
 --for
 begin
 for i in 1..10 loop
    dbms_output.put_line(i);
 end loop;
 end;
 
 
--动态sql
declare
  v_sql varchar2(100);
  v_name student.name%type;
  v_id number(3):='901';
begin
  v_sql:='select name from student where id=:id';
  execute immediate v_sql
  into v_name --查询结果中绑定到对应变量中
  using v_id; --对sql中的占位符赋值
  dbms_moutput.put_line(v_name);
end;

declare
  v_name student.name%type :='&请输入姓名';
  v_sex student.sex%type :='&请输入性别';
  v_sql varchar2(200);
  v_row student%rowtype;
begin
  v_sql:='select * from student where 1=1';
  if v_name is not null then
  v_sql:=v_sql||'and name like ''%'||v_name||'%''';
  end if;
  
  if v_sex is not null then
  v_sql:=v_sql||'and sex ='''||v_sex||'''';
  end if;
  
  execute immediate v_sql into V_row;
  dbms_output.put_line(v_row.name||'---'||v_row.sex||'---'||v_row.department);
end;

/*
在运行程序时出现的错误叫做异常
发生异常后,语句将停止执行,控制权转移到PL/SQL块的异常处理部分
异常有两种类型
·预定义异常-当PL/SQL程序违反Oracle规则或超越系统限制时隐式引发
·用户定义异常-用户可以在PL/SQL块的声明部分定义异常,自定义的异常通过RAISE语句显式引发处理系统预定义异常:
*/
--异常应用
--系统预定义异常:
--too_many_rows 多行数据
--no_data_found 找不到
--others 其他异常

declare
    v_name student.name%type;
begin
     select name into v_name from student where id='900';
     dbms_output.put_line(v_name);
     --异常语句块
    exception
    when too_many_rows then
    dbms_output.put_line('返回行数太多');
    when on_date_found then
    dbms_output.put_line('找不到数据');
    when others then
    dbms_output.put_line('找不到数据');
end;


declare
    myException exception;
    v_name student.name%type:='张三1';
begin
    if v_name not in('张三','李四','王五') then
    --满足条件就抛出自定义异常
    raise myException;
    else
        dbms_output.put_line('--------');
    end if;
    dbms_output.put_line('---6666---');
    
    exception
    when MyException then
     dbms_output.put_line('----触发自定义异常----');
    when others then
    dbms_output.put_line('----其他异常----');
end;