首页 > 代码库 > PL/SQL学习笔记_01_基础

PL/SQL学习笔记_01_基础

PL/SQL语句可以在Oracle客户端的 SQL窗口或者 command  窗口中运行

在SQL窗口中运行步骤同 SQL语句

在command  窗口中运行的步骤如下:

1)File—new command window,出现下图

技术分享

 

 2)输入命令:set serveroutput on    ,回车执行            

       作用:开启输出服务

技术分享

3)输入命令:ed   ,回车执行

      作用:打开PL/SQL文本编辑器,可以在此文本编辑器中写PL/SQL语句

技术分享

4)输入命令:/   ,回车执行

      作用:执行PL/SQL语句

 

1.PL/SQL语法格式

[语法格式]--declare              --声明的变量、记录类型、游标begin               --程序的执行部分(类似于java里的main()方法)  dbms_output.put_line(helloworld);--exception              --针对begin块中出现的异常,提供处理的机制  --when .... then ...  --when  .... then ...end;              --其中begin,end 必不可少

 

2.变量命名规则

技术分享

3.声明变量类型

3.1常规变量

char,varchar2,date,number,boolean,long

declare  --声明变量  v_name varchar2(25);  v_email varchar2(25);  v_salary number(8, 2);  v_job_id varchar2(10);begin  --通过 select ... into ... 语句为变量赋值  --被赋值的变量与SELECT中的列名要一一对应 select last_name, email, salary, job_id into v_name, v_email, v_salary, v_job_id from employees where employee_id = 186;  -- 打印变量的值 dbms_output.put_line(v_name || ,  || v_email || ,  ||  v_salary || ,  ||  v_job_id);end;

 

3.2记录类型

 记录类型类似于java 的类

 语法格式:

TYPE record_type IS RECORD(   Field1 type1 [NOT NULL] [:= exp1 ],   Field2 type2 [NOT NULL] [:= exp2 ],   . . . . . .   Fieldn typen [NOT NULL] [:= expn ] ) ;

自定义记录类型示例:

declare  --定义一个记录类型  type emp_record is record(    v_name varchar2(25),    v_email varchar2(25),    v_salary number(8, 2),    v_job_id varchar2(10)
);
--声明自定义记录类型的变量 v_emp_record emp_record;begin --通过 select ... into ... 语句为变量赋值 select last_name, email, salary, job_id into v_emp_record from employees where employee_id = 186; -- 打印变量的值 dbms_output.put_line(v_emp_record.v_name || , || v_emp_record.v_email || , || v_emp_record.v_salary || , || v_emp_record.v_job_id);end;

 

3.3 %type

 使用 %type 定义变量,动态的获取数据的声明类型

     定义一个变量,其数据类型与已经定义的某个数据变量的类型相同,或者与数据库表的某个列的数据类型相同,这时可以使用%TYPE

declare  --定义一个记录类型  type emp_record is record(    v_name employees.last_name%type,        --使v_name的类型与employees表中last_name类型保持一致    v_email employees.email%type,    v_salary employees.salary%type,    v_job_id employees.job_id%type  );      --声明自定义记录类型的变量  v_emp_record emp_record;begin  --通过 select ... into ... 语句为变量赋值 select last_name, email, salary, job_id into v_emp_record from employees where employee_id = 186;  -- 打印变量的值 dbms_output.put_line(v_emp_record.v_name || ,  || v_emp_record.v_email || ,  ||                                          v_emp_record.v_salary || ,  ||  v_emp_record.v_job_id);end;

 

3.4 %rowtype

 PL/SQL 提供%ROWTYPE 操作符, 返回一个记录类型, 其数据类型和数据库表的数据结构相一致

declare--声明一个记录类型的变量  v_emp_record employees%rowtype;begin  --通过 select ... into ... 语句为变量赋值 select * into v_emp_record from employees where employee_id = 186;  -- 打印变量的值 dbms_output.put_line(v_emp_record.last_name || ,  || v_emp_record.email || ,  ||                                          v_emp_record.salary || ,  ||  v_emp_record.job_id  || ,  ||                                          v_emp_record.hire_date);end;

 

4. 变量赋值

4.1 :=

:=    赋值号   (赋值操作)

 =    等于       (判断操作)

=>                 (用于参数赋值)

语法格式:

variable := expression ;--variable 是一个 PL/SQL 变量, expression 是一个 PL/SQL 表达式.

 

4.2 数据库赋值

数据库赋值是通过 SELECT语句来完成,每次执行 SELECT语句就赋值一次, 一般要求被赋值的变量与SELECT中的列名要一一对应

 

如: 通过变量实现查询语句

declare  v_emp_record employees%rowtype;  v_employee_id employees.employee_id%type;begin  --使用赋值符号为变量进行赋值  v_employee_id := 186;  --通过 select ... into ... 语句为变量赋值 select * into v_emp_record from employees where employee_id = v_employee_id;  -- 打印变量的值 dbms_output.put_line(v_emp_record.last_name || ,  || v_emp_record.email || ,  ||                                          v_emp_record.salary || ,  ||  v_emp_record.job_id  || ,  ||                                          v_emp_record.hire_date);end;

 

5. 通过变量实现DELETE、INSERT、UPDATE等操作

declare  v_emp_id employees.employee_id%type;begin  v_emp_id := 109;  delete from employees  where employee_id = v_emp_id;  --commit;end; 

 

6.流程控制之条件语句(2种)

6.1  IF 语句 ;

IF <布尔表达式>  THEN    PL/SQL 和 SQL 语句;ELSIF < 其它布尔表达式> THEN    其它语句;ELSIF < 其它布尔表达式> THEN    其它语句;ELSE    其它语句;END IF;-- ELSIF 不能写成 ELSEIF

示例:

/*要求: 查询出 150号 员工的工资, 若其工资大于或等于 10000 则打印 ‘salary >= 10000‘; 若在 5000 到 10000 之间, 则打印 ‘5000<= salary < 10000‘; 否则打印 ‘salary < 5000‘*/declare     v_emp_name employees.last_name%type;     v_emp_sal employees.salary%type;     v_emp_sal_level varchar2(20);begin     select last_name,salary into v_emp_name,v_emp_sal from employees where employee_id = 150;          if(v_emp_sal >= 10000)   then v_emp_sal_level := salary >= 10000;     elsif(v_emp_sal >= 5000) then v_emp_sal_level := 5000<= salary < 10000;     else v_emp_sal_level := salary < 5000;     end if;          dbms_output.put_line(v_emp_name||,||v_emp_sal||,||v_emp_sal);end;

 

6.2  CASE 语句

语法格式:

CASE selectorWHEN expression1 THEN result1WHEN expression2 THEN result2WHEN expressionN THEN resultN[ ELSE resultN+1]END;

示例:

/*要求: 查询出 122 号员工的 JOB_ID, 若其值为 ‘IT_PROG‘, 则打印 ‘GRADE: A‘;                         ‘AC_MGT‘, 打印 ‘GRADE B‘,                         ‘AC_ACCOUNT‘, 打印 ‘GRADE C‘;                         否则打印 ‘GRADE D‘*/declare       --声明变量       v_grade char(1);       v_job_id employees.job_id%type;begin       select job_id into v_job_id       from employees       where employee_id = 122;              dbms_output.put_line(job_id:  || v_job_id);              --根据 v_job_id 的取值, 利用 case 字句为 v_grade 赋值       v_grade :=                 case v_job_id when IT_PROG then A                             when AC_MGT then B                             when AC_ACCOUNT then C                             else D                end;                       dbms_output.put_line(GRADE:  || v_grade);end; 

 

7.流程控制之循环语句(3种)

7.1  LOOP 循环

语法格式:

declare    --初始化条件    v_i number(3) := 1;begin    loop         --循环体         dbms_output.put_line(v_i);         --循环条件         exit when v_i = 100;         --迭代条件         v_i := v_i + 1;    end loop;end;

 

7.2 WHILE 循环

语法格式;

declare       --初始化条件       v_i number(3) := 1;begin       --循环条件       while v_i <= 100 loop             --循环体             dbms_output.put_line(v_i);             --迭代条件             v_i := v_i + 1;       end loop;end; 

 

示例:

/*综合使用 if, while 语句, 打印 1 - 100 之间的所有素数(素数: 有且仅用两个正约数的整数, 2, 3, 5, 7, 11, 13, ...).*/declare  v_flag number(1):=1;  v_i number(3):=2;  v_j number(2):=2;begin  while (v_i<=100) loop        while v_j <= sqrt(v_i) loop              if (mod(v_i,v_j)=0) then v_flag:= 0;          end if;                       v_j :=v_j +1;        end loop;            if(v_flag=1) then dbms_output.put_line(v_i);    end if;        v_flag :=1;        v_j := 2;        v_i :=v_i +1;   end loop;end;

 

7.3  FOR 循环

语法格式:

FOR 循环计数器  IN  [ REVERSE ]  下限 ..  上限  LOOP     要执行的语句;END  LOOP;

 

示例:

--使用for循环实现1-100之间的素数的输出declare  --标记值, 若为 1 则是素数, 否则不是  v_flag number(1) := 0;begin   for i in 2 .. 100 loop       v_flag := 1;                     for j in 2 .. sqrt(i) loop           if i mod j = 0 then              v_flag := 0;               end if;               end loop;              if v_flag = 1 then           dbms_output.put_line(i);       end if;          end loop;end;

 

8. 标号和 GOTO

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

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

 

示例:

--打印1——100的自然数,当打印到50时,跳出循环,输出“打印结束”begin  for i in  1..100  loop      dbms_output.put_line(i);      if(i = 50) then       goto label;      end if;  end loop;            <<label>>      dbms_output.put_line(打印结束);end;

 

PL/SQL学习笔记_01_基础