PL/SQL学习笔记

declare 	--可选
--(声明部分)
	--变量名  变量类型      可选空值约束    可选默认值 | 可选赋值	分号结尾
	value1 NUMBER(2) not null default 0;
	v_ename emp.ename%TYPE;-->  %TYPE 先前已经声明的变量 | 表中字段 
	v_row emp%ROWTYPE;-->   table | cursor %ROWTYPE 与 数据库表 或 游标 的行具有相同类型的记录变量
	--自定义一个复合数据类型
	TYPE many_value IS RECORD (name v_ename%TYPE:='chen',eno number(2),job varchar2(20));-->括号内部定义和普通类型定义一致
	TYPE ps_table IS TABLE OF DATE INDEX BY BINARY_INTEGER;-->定义的是一个PL/SQL表 
	v_many many_value;
	v_ps_table ps_table;
begin	--必选
--(执行部分)
	--控制结构
	--IF 逻辑结构:IF-THEN-END IF      IF-THEN-ELSE-END IF       IF-THEN-ELSEIF-THEN-END IF
  	--对复合数据类型进行赋值
  v_many.eno:=10; 
  v_many.job:='programmer';
	--对PL/SQL表进行赋值
	v_ps_table(1) := SYSDATE;	-->对于PL/SQL表有	EXISTS(n) 判断PL/SQL表中指定元素是否存在
				-->		COUNT返回PL/SQL表当前包含元素的个数
				-->		FIRST | LAST  在PL/SQL中返回第一个 | 最后一个索引数字
				-->		DELETE | DELETE(n) | DELETE(n,m) 删除PL/SQL表中元素 | 删除第n个元素 | 删除第n到m个元素
	--连接变量		连接变量在sql plus中定义--> SQL>VARIABLE ret_val NUMBER
	--:ret_val:=1;	->在PL/SQL中引用连接变量,前面加一个冒号:  , 赋值之后可以在SQL PLUS中显示连接变量的值:SQL>PRINT ret_val;
  value1:=10;
	IF value1>0 THEN
		DBMS_OUTPUT.PUT_LINE('value is greater than 0');
	ELSE IF value1=0 THEN
		DBMS_OUTPUT.PUT_LINE('value is 0');
	ELSE
		DBMS_OUTPUT.PUT_LINE('value is less than 0');
  END IF;
  END IF;
	--CASE 逻辑结构:CASE-WHEN-THEN-;WHEN-THEN-....
	CASE value1
	WHEN  -1  THEN  DBMS_OUTPUT.PUT_LINE('value is less than 0');
	WHEN  0   THEN  DBMS_OUTPUT.PUT_LINE('value is 0');
	WHEN   1  THEN  DBMS_OUTPUT.PUT_LINE('value is greater than 0');
  ELSE DBMS_OUTPUT.PUT_LINE('value is '||value1);
  END CASE;
	--循环控制语句 LOOP 3种: BASIC LOOP | FOR LOOP | WHILE LOOP
	--BASIC LOOP
	LOOP
	     value1:=value1+1;
	     EXIT WHEN value1>0;
	END LOOP;
	--FOR LOOP
	FOR i IN 1..value1 LOOP
	     DBMS_OUTPUT.PUT_LINE('for ' || i);
	END LOOP;
	--WHILE LOOP
	WHILE value1>20 LOOP
      value1:=value1+1;
	END LOOP;
	--在PL/SQL中允许使用的SQL语句只有DML,事务控制语句,直接使用DDL是非法的
	--SELECT   只能返回一行数据   INTO子句必须有  -->将查询到的ename存放到v_ename中
	SELECT ename INTO v_ename FROM emp WHERE empno=7527;
  DBMS_OUTPUT.PUT_LINE('ename is '||v_ename);
exception	--可选
--(异常处理部分)
  WHEN OTHERS THEN --必须是最后一个错误处理语句
    DBMS_OUTPUT.PUT_LINE('something error!');
END;

 

declare  --可选
--(声明部分)
      --变量名  变量类型      可选空值约束    可选默认值 | 可选赋值 分号结尾
           value1  NUMBER(2)   not null            default 0  | :=13  ;
           v_ename  value1%TYPE | emp.ename%TYPE   -->  %TYPE 先前已经声明的变量 | 表中字段
           v_row emp%ROWTYPE   ->   table | cursor %ROWTYPE 与 数据库表 或 游标 的行具有相同类型的记录变量
      --自定义一个复合数据类型
       TYPE many_value IS RECORD (ename value1%TYPE , eno number(2) , job varcahr2(10) ); -->括号内部定义和普通类型定义一致
       TYPE ps_table IS TABLE OF DATE /*或者 value1%TYPE 都行*/  INDEX BY BINARY_INTEGER;-->定义的是一个PL/SQL表
       v_many many_value ;
       v_ps_table ps_table;
       --对复合数据类型进行赋值
       v_many.ename := 'chen'; v_many.eno:=10; v_many.job:='programmer';
 --对PL/SQL表进行赋值
      v_ps_table(1) := SYSDATE; -->对于PL/SQL表有 EXISTS(n) 判断PL/SQL表中指定元素是否存在
                                                    -->                            COUNT返回PL/SQL表当前包含元素的个数
                                                    -->                            FIRST | LAST  在PL/SQL中返回第一个 | 最后一个索引数字
                                                   -->                             DELETE | DELETE(n) | DELETE(n,m) 删除PL/SQL表中元素 | 删除第n个元素 | 删除第n到m个元素
     --连接变量  连接变量在sql plus中定义--> SQL>VARIABLE ret_val NUMBER
     :ret_val:=1;        ->在PL/SQL中引用连接变量,前面加一个冒号:  , 赋值之后可以在SQL PLUS中显示连接变量的值:SQL>PRINT ret_val;
begin --必选
--(执行部分)
     --控制结构
     --IF 逻辑结构:IF-THEN-END IF      IF-THEN-ELSE-END IF       IF-THEN-ELSEIF-THEN-END IF
   IF value1 > 0 THEN
       DBMS_OUTPUT.PUT_LINE('value is greater than 0');
   ELSE IF value1=0 THEN
       DBMS_OUTPUT.PUT_LINE('value is 0');
   ELSE
       DBMS_OUTPUT.PUT_LINE('value is less than 0');
   --CASE 逻辑结构:CASE-WHEN-THEN-;WHEN-THEN-....
    CASE value1
    WHEN  -1  THEN  DBMS_OUTPUT.PUT_LINE('value is less than 0');
    WHEN  0   THEN  DBMS_OUTPUT.PUT_LINE('value is 0');
    WHEN   1  THEN  DBMS_OUTPUT.PUT_LINE('value is greater than 0');

   --最好加个ELSE

END CASE;
   --循环控制语句 LOOP 3种: BASIC LOOP | FOR LOOP | WHILE LOOP
   --BASIC LOOP
   LOOP
       value1:=value1+1;
       EXIT WHEN value1>0;
   END LOOP;
   --FOR LOOP
   FOR i IN 1..value1 LOOP
      DBMS_OUTPUT.PUT_LINE('for ' || i);
   END LOOP;
   --WHILE LOOP
   WHILE value1>10 LOOP
   value1:=value1+1
   END LOOP;

   --在PL/SQL中允许使用的SQL语句只有DML,事务控制语句,直接使用DDL是非法的
   --SELECT   只能返回一行数据   INTO子句必须有  -->将查询到的ename存放到v_ename中
   SELECT ename INTO v_ename FROM emp WHERE no=1;
exception --可选
--(异常处理部分)
  WHEN exception1 THEN
  WHEN OTHERS THEN --必须是最后一个错误处理语句
end --必选

 

 


注:
在处理潜在的二义性SQL语句时:
--局部变量和形式参数优先于数据库表名
--数据库的列名优先于局部变量和形式参数名字
控制语句IF中的ELSEIF没有匹配的END IF;
处理NULL值:
--使用is null 来处理null值的表达式
--任何包含null值的逻辑表达式,其值为null,不为true或false
--用null值来进行字符串连接时,null被当成空字符串来处理
循环可以嵌套:
--循环允许多层嵌套
--标签用于区别PL/SQL块和循环
--使用exit语句退出到循环的外层
oracle服务预定义异常:
--CASE_NOT_FOUND  (ORA-06592)
--NO_DATA_FOUND  (ORA-1403)
--TOO_MANY_ROWS  (ORA-1422)
--DUP_VAL_ON_INDEX     (ORA-0001)
--ZERO_DIVIDE (ORA-1476)
--INVALID_CURSOR  (ORA-1001)
--VALUE_ERROR (ORA-6502)

 

你可能感兴趣的:(pl/sql)