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一般是字符串拼接或者参数传入