-- 顺序控制,关键字:goto null

declare

  v_age number := '&输入年龄:';

begin

  if v_age < 18 then

    goto young; -- 跳到<<young>>,按顺序往后执行

  elsif v_age <30 then

    goto strong; -- 跳到<<strong>>,按顺序往后执行

  else

    goto older; -- 跳到<<older>>,按顺序往后执行

  end if;

  <<young>>

      null;

  <<strong>>

      dbms_output.put_line('strong');

  <<older>>

      dbms_output.put_line('older');

end;

--动态执行sql语句,关键字:execute immediate

declare

  v_sql varchar2(222);

  v_emp_rec emp%rowtype;

begin

  v_sql := 'select * from emp where empno =: num'; --'=:'为占位符,标示符不能用关键字,如number

  execute immediate v_sql into v_emp_rec

  using 7369;-- 给占位符绑定值

  dbms_output.put_line(v_emp_rec.ename);

end;

 

-- 异常,预定义异常,关键字 exception when then

declare

  v_emp emp%rowtype;

  v_sql varchar2(200);

  v_ename emp.ename%type;

begin

  v_sql := 'select * from emp';

  execute immediate v_sql into v_emp;

  --v_sql := 'select ename from emp where empno = 7396';

  --execute immediate v_sql into v_ename;

  exception

    when too_many_rows then  -- too_many_rows为异常类型,还有一个data

      dbms_output.put_line('太多行了!');

    --when data_not_found then

      --dbms_output.out_line('没有找到!');

end;

-- 异常,自定义异常,关键字:exception raise

declare

   v_ageException exception; -- 异常类型 exception

   v_age number := '&年龄:';

begin

  if v_age > 120 then

    raise v_ageException; -- 满足条件时,raise抛出异常

  else

    dbms_output.put_line(v_age);

  end if;

  exception

    when v_ageException then

      dbms_output.put_line('年龄太大了!');

end;