笔记081120----PL/SQL

来源:互联网 发布:济南php招聘 编辑:程序博客网 时间:2024/06/05 20:08
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
声明变量X 为VARCHAR2(20)类型 并将X打印在窗口

SQL>
  1  DECLARE
  2  X VARCHAR2(20);
  3  BEGIN
  4  X:='THIS IS ....';
  5  DBMS_OUTPUT.PUT_LINE('X的值为:'||X);
  6* END;
SQL> /
X的值为:THIS IS ....     
PL/SQL 过程已成功完。
                                                     
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~`
标准输出,也就是显示屏上输出。
打开输出就是set serveroutput on or dbms_output.enable(buffer_size in integer default 20000);
关闭输出就是set serveroutput off or dbms_output.disable;

SQL> SET SERVEROUTPUT ON SIZE 10000
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
SQL> /
X的值为:THIS IS ....                                                            

PL/SQL 过程已成功完成。
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
保持和执行脚本

SQL> SAVE E:/oracle/plsql_01.sql
已创建 file E:/oracle/plsql_01.sql
SQL> @ E:/oracle/plsql_01.sql
X的值为:THIS IS ....                                                          

PL/SQL 过程已成功完成。
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
写一个IF THEN ELSIF THEN ELSE END IF

SQL> edit
已写入 file afiedt.buf

  1  DECLARE
  2  A NUMBER;
  3  B VARCHAR2(10);
  4  BEGIN
  5  A:= 2;
  6  IF A = 1 THEN
  7  B := 'A';
  8  ELSIF A = 2 THEN
  9  B:='B';
 10  ELSE
 11  B:='C';
 12  END IF;
 13  DBMS_OUTPUT.PUT_LINE('B is :'||B);
 14* END;
SQL> /
B is :B                                                                        

PL/SQL 过程已成功完成。

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~`
写一个case的判断
SQL> DECLARE
  2  A NUMBER;
  3  B VARCHAR2(10);
  4  BEGIN
  5  A:= 3;
  6  CASE
  7  WHEN A = 1 THEN B:= 'A=1';
  8  WHEN A = 2 THEN B:= 'A=2';
  9  WHEN A = 3 THEN B:= 'A=3';
 10  ELSE B:='OTHER';
 11  END CASE;
 12  DBMS_OUTPUT.PUT_LINE('B IS : /N'||B);
 13  END;
 14  /
B IS : /NA=3                                                                   

PL/SQL 过程已成功完成。

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
LOOP 循环
SQL>      DECLARE
  2  X NUMBER;
  3  BEGIN
  4  X:=0;
  5  LOOP
  6  X:=X+1;
  7  IF X>=3 THEN
  8  EXIT;
  9  END IF;
 10  DBMS_OUTPUT.PUT_LINE('IN THE LOOP X= '|| X);
 11  END LOOP;
 12  DBMS_OUTPUT.PUT_LINE('OUT THE LOOP X=' || X);
 13  END;
 14  /
IN THE LOOP X= 1                                                               
IN THE LOOP X= 2                                                               
OUT THE LOOP X=3                                                               

PL/SQL 过程已成功完成。

_______________

SQL> DECLARE
  2  X NUMBER;
  3  BEGIN
  4  X:=0;
  5  LOOP
  6  X:=X+1;
  7  EXIT WHEN X>=3;
  8  DBMS_OUTPUT.PUT_LINE('IN THE LOOP'||X);
  9  END LOOP;
 10  DBMS_OUTPUT.PUT_LINE('OUT THE LOOP'||X);
 11  END;
 12  /
IN THE LOOP1                                                                   
IN THE LOOP2                                                                   
OUT THE LOOP3                                                                  

PL/SQL 过程已成功完成。
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
WHILE循环
SQL> DECLARE
  2  X NUMBER;
  3  BEGIN
  4  X:=0;
  5  WHILE X<3 LOOP
  6  X:=X+1;
  7  DBMS_OUTPUT.PUT_LINE('IN THE LOOP '||X);
  8  END LOOP;
  9  DBMS_OUTPUT.PUT_LINE('OUT THE LOOP ' ||X);
 10  END;
 11  /
IN THE LOOP 1                                                                  
IN THE LOOP 2                                                                  
IN THE LOOP 3                                                                  
OUT THE LOOP 3                                                                 

PL/SQL 过程已成功完成。
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
FOR循环
SQL> BEGIN
  2  FOR I IN 1..5 LOOP
  3  DBMS_OUTPUT.PUT_LINE('I = '||I);
  4  END LOOP ;
  5  DBMS_OUTPUT.PUT_LINE('END THE LOOP');
  6  END;
  7  /
I = 1                                                                          
I = 2                                                                          
I = 3                                                                          
I = 4                                                                          
I = 5                                                                          
END THE LOOP                                                                   

PL/SQL 过程已成功完成。

————————————
SQL> BEGIN
  2  FOR I IN REVERSE 1..5 LOOP
  3  DBMS_OUTPUT.PUT_LINE('I =  '||I);
  4  END LOOP;
  5  END;
  6  /
I =  5                                                                         
I =  4                                                                         
I =  3                                                                         
I =  2                                                                         
I =  1                                                                         

PL/SQL 过程已成功完成。

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~`
GOTO语句 用<<标记>>做标记
SQL> DECLARE
  2  X NUMBER;
  3  BEGIN
  4  X:=0;
  5  <<REPEATE_LOOP>>
  6  X:=X+1;
  7  DBMS_OUTPUT.PUT_LINE('X = '||X);
  8  IF X<3 THEN
  9  GOTO REPEATE_LOOP;
 10  END IF ;
 11  END;
 12  /
X = 1                                                                          
X = 2                                                                          
X = 3                                                                          

PL/SQL 过程已成功完成。

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
SELECT  .....INTO .......

SQL> DECLARE
  2  TEST VARCHAR2(10);
  3  BEGIN
  4  SELECT SNAME INTO TEST FROM STUDENT WHERE SNO = '01062106';
  5  DBMS_OUTPUT.PUT_LINE('THE NAME IS  '|| TEST);
  6  END ;
  7  /
THE NAME IS  张故乡                                                            

PL/SQL 过程已成功完成。

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~```````````````````
系统异常NO_DATA_FOUND

SQL> DECLARE
  2  TEST VARCHAR2(10);
  3  BEGIN
  4  SELECT SNAME INTO TEST FROM STUDENT WHERE SNO = '05062233';
  5  DBMS_OUTPUT.PUT_LINE('THE SNAME IS ' || TEST);
  6  EXCEPTION
  7  WHEN NO_DATA_FOUND THEN
  8  DBMS_OUTPUT.PUT_LINE('NO DATA FOUND');
  9  END;
 10  /
NO DATA FOUND                                                                  

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
系统异常

SQL> edit
已写入 file afiedt.buf

  1  DECLARE
  2  TEST VARCHAR2(10);
  3  BEGIN
  4  SELECT SNAME INTO TEST FROM STUDENT WHERE SNO = '01062108';
  5  DBMS_OUTPUT.PUT_LINE('THE SNAME IS ' || TEST);
  6  EXCEPTION
  7  WHEN NO_DATA_FOUND THEN
  8  DBMS_OUTPUT.PUT_LINE('NO DATA FOUND');
  9* END;
SQL> /
THE SNAME IS 张晔                                                              

PL/SQL 过程已成功完成。
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~````
自定义异常
   
SQL> EDIT
已写入 file afiedt.buf

  1  DECLARE
  2  NAME VARCHAR2(10);
  3  E EXCEPTION;     --声明变量
  4  BEGIN
  5  SELECT SNAME INTO NAME FROM STUDENT WHERE SNO = '01062108';
  6  IF NAME <> 'CHINA' THEN
  7  RAISE E;         -----引发异常E
  8  END IF;
  9  DBMS_OUTPUT.PUT_LINE('NAME IS ' || NAME);
 10  EXCEPTION     ----------------------
 11  WHEN E THEN
 12  DBMS_OUTPUT.PUT_LINE('ERROR    ');
 13* END;
SQL> /
ERROR                                                                          

PL/SQL 过程已成功完成。
——————————————————
SQL> edit
已写入 file afiedt.buf

  1  DECLARE
  2  NAME VARCHAR2(10);
  3  E EXCEPTION;
  4  BEGIN
  5  SELECT SNAME INTO NAME FROM STUDENT WHERE SNO = '01062108';
  6  IF NAME <> '张晔' THEN
  7  RAISE E;
  8  END IF;
  9  DBMS_OUTPUT.PUT_LINE('NAME IS ' || NAME);
 10  EXCEPTION
 11  WHEN E THEN
 12  DBMS_OUTPUT.PUT_LINE('ERROR    ');
 13* END;
SQL> /
NAME IS 张晔                                                                   

PL/SQL 过程已成功完成。


~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~``
复合变量:
记录
什么是记录呢, 记录是有几个相关值构成的复合变量,常用于支持SELECT语句的返回值

使用记录可以将一行数据看成一个单元进行处理, 而不必经没一列单独处理。

SQL> EDIT
已写入 file afiedt.buf

  1  DECLARE
  2  TYPE STUDENTRECORD IS RECORD(
  3  SNO CHAR(8),
  4  SNAME VARCHAR2(10)
  5  );
  6  MYRECODE STUDENTRECORD;
  7  BEGIN
  8  SELECT S.SNO , S.SNAME INTO MYRECODE FROM STUDENT S WHERE SNO = '01062108';
  9  DBMS_OUTPUT.PUT_LINE('SNAME IS '|| MYRECODE.SNAME ||'SNO IS '|| MYRECODE.SNO);
 10* END;
SQL> /
SNAME IS 张晔SNO IS 01062108                                                   

PL/SQL 过程已成功完成。
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
和表中字段类型相同的记录变量

SQL> L
  1  DECLARE
  2  TYPE STUDENTRECORD IS RECORD(
  3  SNO STUDENT.SNO%TYPE,
  4  SNAME STUDENT.SNAME%TYPE
  5  );
  6  MYRECODE STUDENTRECORD;
  7  BEGIN
  8  SELECT S.SNO , S.SNAME INTO MYRECODE FROM STUDENT S WHERE SNO = '01062108';
  9  DBMS_OUTPUT.PUT_LINE('SNAME IS '|| MYRECODE.SNAME ||'SNO IS '|| MYRECODE.SNO);
 10* END;
SQL> /
SNAME IS 张晔SNO IS 01062108                                                   

PL/SQL 过程已成功完成。
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~`
和表结构相同的记录

SQL> EDIT
已写入 file afiedt.buf

  1  DECLARE
  2  MYRECODE STUDENT%ROWTYPE;
  3  BEGIN
  4  SELECT * INTO MYRECODE FROM STUDENT S WHERE SNO = '01062108';
  5  DBMS_OUTPUT.PUT_LINE('SNAME IS '|| MYRECODE.SNAME ||'SNO IS '|| MYRECODE.SNO);
  6* END;
SQL> L
  1  DECLARE
  2  MYRECODE STUDENT%ROWTYPE;
  3  BEGIN
  4  SELECT * INTO MYRECODE FROM STUDENT S WHERE SNO = '01062108';
  5  DBMS_OUTPUT.PUT_LINE('SNAME IS '|| MYRECODE.SNAME ||'SNO IS '|| MYRECODE.SNO);
  6* END;
SQL> /
SNAME IS 张晔SNO IS 01062108                                                   

PL/SQL 过程已成功完成。

原创粉丝点击