PL/SQL基础学习(3)

1、–helloworld程序

--/
BEGIN
  DBMS_OUTPUT.PUT_LINE('Hello World!!!');
END;
/


2、–定义变量
–变量名 类型

--/
DECLARE
  A NUMBER(5, 2) := -1;
  B NUMBER(5, 2) := 3;
  C NUMBER(5, 2);
BEGIN
  C := A * B / (A + B);
  DBMS_OUTPUT.PUT_LINE('c=' || C);
EXCEPTION
  WHEN ZERO_DIVIDE THEN
    DBMS_OUTPUT.PUT_LINE('除数不能为0!');
END;
/


3、–定义常量

--/
DECLARE
a CONSTANT NUMBER := 100;
BEGIN
DBMS_OUTPUT.PUT_LINE(a);
END;
/



4、–使用%type声明变量 使用另外一个变量的数据类型

--/
DECLARE
v_a NUMBER := 10;
v_b v_a%type := 20;
v_c v_b%type;
BEGIN
v_c := v_a + v_b;
DBMS_OUTPUT.PUT_LINE(v_c);
END;
/


5、–%rowtype声明绑定到一整行的所有列类型
–select * into只返回一条记录

--/
DECLARE
v_emp emp%rowtype;
BEGIN
SELECT * INTO v_emp FROM emp where empno = 101;
DBMS_OUTPUT.PUT_LINE(v_emp.empno || ' ' || v_emp.ename || ' ' || v_emp.job);
END;
/


6、–使用type定义一个数据类型
–使用record定义记录一行数据的数据类型

--/
DECLARE
TYPE my_emp IS RECORD (
empno emp.empno%type,
ename emp.ename%type,
job emp.job%type,
mgr emp.mgr%type,
hiredate emp.hiredate%type,
sal emp.sal%type,
comm emp.comm%type,
deptno emp.deptno%type
);
v_emp my_emp;
BEGIN
select 
  empno,
  ename,
  job,
  mgr,
  hiredate,
  sal,
  comm,
  deptno
  into v_emp from emp where empno = 103;
DBMS_OUTPUT.PUT_LINE(v_emp.empno || ' ' || v_emp.ename || ' ' || v_emp.job || ' ' || v_emp.mgr || ' ' || v_emp.hiredate || ' ' || 
v_emp.sal || ' ' || v_emp.comm || ' ' || v_emp.deptno);
END;
/


7、–使用table定义记录一列数据的数据类型
–table类似于高级语言中的数组

--/
DECLARE
TYPE v_empname IS TABLE OF VARCHAR2(40) INDEX BY BINARY_INTEGER;
v_emp v_empname;
BEGIN
v_emp(1) := 'aaa';
v_emp(2) := 'bbb';
v_emp(3) := 'ccc';
v_emp(4) := 'ddd';
FOR loop_index in 1 .. 4
LOOP
DBMS_OUTPUT.PUT_LINE(v_emp(loop_index));
END LOOP;
END;
/


8、–if条件判断
–if then end if 和 if then else end if 和 if then elsif then endif 三种

--/
DECLARE
  COLOR VARCHAR2(10) := '&INPUTCOLOR';
BEGIN
  IF COLOR = 'red' THEN
    DBMS_OUTPUT.PUT_LINE('红色');
  ELSIF COLOR = 'yellow' THEN
    DBMS_OUTPUT.PUT_LINE('黄色');
  ELSIF COLOR = 'orange' THEN
    DBMS_OUTPUT.PUT_LINE('橘黄色');
  ELSIF COLOR = 'pink' THEN
    DBMS_OUTPUT.PUT_LINE('粉色');
  ELSE
    DBMS_OUTPUT.PUT_LINE('我也不知道你输入的是什么颜色');
  END IF;
END;
/


9、–case条件判断
–CASE语句类似于我们C语言中的SWITCH选择语句,用来一次性的检查多个条件的值
–CASE选择器由一系列的WHEN语句块组成

--/
DECLARE
color VARCHAR2(10) :='&inputcolor';
BEGIN
CASE color
WHEN 'red' THEN
DBMS_OUTPUT.PUT_LINE('红色');
WHEN 'blue' THEN
DBMS_OUTPUT.PUT_LINE('蓝色');
WHEN 'yellow' THEN
DBMS_OUTPUT.PUT_LINE('黄色');
ELSE
DBMS_OUTPUT.PUT_LINE('没找到这个颜色');
END CASE;
END;
/


10、–while循环条件

--/
DECLARE
v_number NUMBER := 0;
v_n NUMBER;
BEGIN
WHILE v_number < 5 
LOOP
v_n := v_number * v_number;
v_number := v_number + 1; --注意plsql中没有自加自减,要用赋值来完成
DBMS_OUTPUT.PUT_LINE(v_n);
END LOOP;
END;
/


11、–for循环条件
–FOR循环和WHILE循环不同的地方在于,在FOR的一开始就知道了循环的次数,而WHILE循环则不一定

--/
DECLARE
  v_count NUMBER := 0;
BEGIN
  FOR v_count IN REVERSE 1..10 LOOP --REVERSE表示从大到小循环
    IF v_count=5 THEN
      continue; --11g新增
    end if;
    IF mod(v_count,3)=0 THEN
      dbms_output.put_line('当前的循环值可以被三整除:' || v_count);
    ELSE 
      dbms_output.put_line('当前的循环值是:' || v_count);
    END IF;
  END LOOP;
END;
/


12、–for循环遍历表

--/
DECLARE
BEGIN
for txn_re in (select * from emp where rownum < 10)
LOOP
  dbms_output.put_line(txn_re.empno);
END LOOP;
END;
/


13、–exception异常处理

--/
DECLARE
  v_emp emp%rowtype;
BEGIN
  select * into v_emp from emp where empno = '2';
  dbms_output.put_line(v_emp.empno);
EXCEPTION
  WHEN NO_DATA_FOUND THEN --注意不是not_data_found
    dbms_output.put_line('未找到记录');
  WHEN OTHERS THEN
    dbms_output.put_line('其它异常');
END;
/


— no_data_found和sql%notfound的区别
— no_data_found 是一个exception,用在 select into
— 而sql%notfound 是一个隐式游标变量,用在 update, delete

— EXECUTE IMMEDIATE 一般用于执行动态SQL
— 这个SQL一般是字符串拼接或者参数传入