Oracle_PL-SQL_10

来源:互联网 发布:光启骗局知乎 编辑:程序博客网 时间:2024/05/16 18:25

PL-SQL: ProcedureLanguage

PL中的主要内容

java source、directory、procedure、function、package、trigger、view

1.   块结构

DECLARE  /*  *定义部分(定义变量、常量、复杂数据类型、游标)  */BEGIN  /*   执行部分(pl/sql语句)  */  excetpion WHENOTHERSTHEN  /*  异常处理部分(处理运行错误)  */END;

在PL SQL 中,在test window里面可以对PL-SQL进行调试、查看结果等操作 

注意点:

DECLAREBEGIN  dbms_output.put_line(2 ** 3);  dbms_output.put_line('''');END;

输出

 8

2.  变量和类型

PL-SQL中declare段申明的变量只能在内部使用。

PL-SQL中的类型和SQL中的类似,具体可以查看网上相关文档,这里不再赘述。

注意点:在PL中可以通过%TYPE关键字来定义变量的类型

Student_namestudens.username%TYPE;

3.  条件逻辑

在PL-SQL中,IF、THEN、ELSE、ELSIF和ENDIF等关键字是用于执行条件逻辑的。

例子:

DECLARE  counter INTEGER := 3;BEGIN  IF counter = 1THEN    dbms_output.put_line('嘻嘻');  ELSIF counter = 2THEN    dbms_output.put_line('哈哈');  ELSE    dbms_output.put_line('呵呵');  ENDIF;END;

CASE WHEN THENDECLARE  os INTEGER := 10;BEGIN  CASE    WHEN os = 10THEN      dbms_output.put_line('XP');    WHEN os = 20THEN      dbms_output.put_line('LINUX');  ENDCASE;END;

4.  循环

  •   简单循环

要结束简单循环,可以使用EXIT或EXIT WHEN语句。EXIT立即结束,EXIT WHEN语句在指定条件出现时,结束循环。

DECLARE  counter INTEGER := 0;BEGIN  LOOP    counter := counter + 1;    --当WHEN条件成立的时候,跳出循环    EXITWHEN counter = 5;  ENDLOOP;  dbms_output.put_line(counter);END;

  •   WHILE循环

DECLARE  counter INTEGER := 5;BEGIN  --当WHILE条件不满足时,跳出循环  WHILE counter > 0LOOP    counter := counter - 1;  ENDLOOP;  dbms_output.put_line(counter);END;

  •   FOR循环

DECLAREBEGIN  FOR num INREVERSE1 .. 5LOOP    dbms_output.put_line(num);  ENDLOOP;END;

  •    GOTO语句(NOT RECOMENDED)

PL/SQL中GOTO语句是无条件跳转到指定的标号去的意思。语法如下:

GOTO label;......<<label>> /*标号是用<< >>括起来的标识符 */

注意,在以下地方使用是不合法的,编译时会出错误。

(1)跳转到非执行语句前面。

(2) 跳转到子块中。

(3) 跳转到循环语句中。

(4)跳转到条件语句中。

(5) 从异常处理部分跳转到执行。

(6)从条件语句的一部分跳转到另一部分

NULL语句

在PL/SQL 程序中,NULL语句是一个可执行语句,可以用 null 语句来说明“不用做任何事情”的意思,相当于一个占位符或不执行任何操作的空语句,可以使某些语句变得有意义,提高程序的可读性,保证其他语句结构的完整性和正确性。如:


DECLARE    ...BEGIN    ...    IF v_num IS NULL THEN    GOTO labelPrint;    END IF;  …  <<labelPrint>>  NULL; --不需要处理任何数据。END;

DECLARE   v_emp_id employees.employee_id%TYPE;   v_first_name employees.first_name%TYPE;   v_salary employees.salary%TYPE;   v_sal_raise NUMBER(3,2);BEGIN   v_emp_id := &emp_id;   SELECT first_name, salary INTO v_first_name, v_salary   FROM employees WHERE employee_id = v_emp_id;   IF v_salary <= 3000 THEN      v_sal_raise := .10;      DBMS_OUTPUT.PUT_LINE(v_first_name||'的工资是'||v_salary                                       ||'、工资涨幅是'||v_sal_raise);   ELSE
   --使用NULL语句,增加程序的可读性,告诉程序员,IF ELSE外的业务逻辑。      NULL;   END IF;END;


看一个例子,分别用3中循环,求1+2+3。。。100的和。

--普通循环/*DECLARE  i         INTEGER := 1;  summation INTEGER:= 0;BEGIN  LOOP    summation :=summation + i;    i         := i + 1;    EXIT WHEN i> 100;  END LOOP; dbms_output.put_line(summation);END;*/--WHILE循环/*DECLARE  i         INTEGER := 1;  summation INTEGER:= 0;BEGIN  WHILE i < 101LOOP    summation :=summation + i;    i         := i + 1;  END LOOP; dbms_output.put_line(summation);END;*/--FOR循环/*DECLARE  summation INTEGER:= 0;BEGIN  FOR i IN 1 .. 100LOOP    summation :=summation + i;  END LOOP; dbms_output.put_line(summation);END;*/

5.      游标

DECLARE  --申明变量  vename emp.ename%TYPE;  vsal   emp.sal%TYPE;  --申明游标  CURSOR cur_emp IS    SELECT ename, sal FROM emp;BEGIN  --打开游标  OPEN cur_emp;  LOOP    --遍历提取    FETCH cur_emp      INTO vename, vsal;    EXITWHEN cur_emp%NOTFOUND;    dbms_output.put_line('vEname=' || vename || ',vSal=' || vsal);  ENDLOOP;  -- 关闭游标  CLOSE cur_emp;END; 

简化写法(利用FOR IN 语句)

DECLARE  CURSOR cur_ename IS    SELECT ename FROM emp;BEGIN  FOR cur_person IN cur_ename LOOP   dbms_output.put_line(cur_person.ename);  ENDLOOP;END;
DECLARE  CURSOR cur_ename IS    SELECT ename FROM emp;BEGIN  FOR cur_person IN cur_ename LOOP   dbms_output.put_line(cur_person.ename);  ENDLOOP;END;

原创粉丝点击