6 1 PLSQL l PLSQL Procedure Language Structured

  • Slides: 48
Download presentation

6. 1 PL/SQL程序概述 l PL/SQL是 Procedure Language & Structured Query Language 的缩写。 l Oracle的SQL是支持ANSI(American

6. 1 PL/SQL程序概述 l PL/SQL是 Procedure Language & Structured Query Language 的缩写。 l Oracle的SQL是支持ANSI(American national Standards Institute)和 ISO 92(International Standards Organization)标准的产品。 l PL/SQL是对SQL语言存储过程语言的扩展。 从Oracle 6以后,Oracle的RDBMS附带了 PL/SQL。 l 它现在已经成为一种过程处理语言,简称 PL/SQL(发音:pea ell sequel)。 辽宁 程技术大学 软件 程系

6. 1 PL/SQL程序概述 l PL/SQL是Oracle系统的核心语言,现在Oracle的许 多部件都是由PL/SQL写成。在PL/SQL中可以使用的 SQL语句有: n INSERT n UPDATE n DELETE n

6. 1 PL/SQL程序概述 l PL/SQL是Oracle系统的核心语言,现在Oracle的许 多部件都是由PL/SQL写成。在PL/SQL中可以使用的 SQL语句有: n INSERT n UPDATE n DELETE n SELECT INTO n COMMIT n ROLLBACK n SAVEPOINT 辽宁 程技术大学 软件 程系

6. 4 PL/SQL 变量类型 �型 子� Character,String,Rowid, Nchar Varchar 2 Binary_integer Number(p, s) Varchar,String,Nvarchar

6. 4 PL/SQL 变量类型 �型 子� Character,String,Rowid, Nchar Varchar 2 Binary_integer Number(p, s) Varchar,String,Nvarchar 2 Dec,Double precision,Integer Int,Numeric,Real,Small int Long Date Boolean ROWID 辽宁 程技术大学 软件 程系

6. 4 PL/SQL 变量类型 l 使用%type 引用数据库列 l PL/SQL 可以声明与数据库行有相同类型的记录。使用 %ROWTYPE l 例: l

6. 4 PL/SQL 变量类型 l 使用%type 引用数据库列 l PL/SQL 可以声明与数据库行有相同类型的记录。使用 %ROWTYPE l 例: l declare l v_empno empno%type; l V_ename emp. ename%type; l begin l select empno, ename into v_empno , v_ename from emp where empno=7369; l dbms_output. put_line(v_empno||’ ‘ ||v_ename); l end; 辽宁 程技术大学 软件 程系

l 使用%rowtype 引用数据库行 l declare l v_emp emp%rowtype; l begin l select * into

l 使用%rowtype 引用数据库行 l declare l v_emp emp%rowtype; l begin l select * into v_emp from emp where empno=7369; l dbms_output. put_line(v_emp. empno||’ ‘ ||v_emp. ename); l end; 辽宁 程技术大学 软件 程系

l 用户自定义数据类型 l 语法格式:type_name is/as system_data_type 注意: system_data_type是自定义类型依赖的基类型 例子:定义一个记录类型 Create type zj_rec as object

l 用户自定义数据类型 l 语法格式:type_name is/as system_data_type 注意: system_data_type是自定义类型依赖的基类型 例子:定义一个记录类型 Create type zj_rec as object ( xh number, Xm char(8) ); Create table tt (tno number not null, Trec zj_rec); Insert into tt values(101, zj_rec(11, 'hong')); 辽宁 程技术大学 软件 程系

数据类型转换: To_char: 将number和date类型转换成varchar 2类型 To_date: 将char转换成date类型 To_number: 将char转换成number类型 例如: 若将求得的最大 值赋给一个字符 型变量呢? l declare

数据类型转换: To_char: 将number和date类型转换成varchar 2类型 To_date: 将char转换成date类型 To_number: 将char转换成number类型 例如: 若将求得的最大 值赋给一个字符 型变量呢? l declare v_salscott. emp. sal%type; varchar 2(8); v_sal l begin select to_char(max(sal)) into v_sal select max(sal) into v_sal from scott. emp; end; l end; 辽宁 程技术大学 软件 程系

l set serveroutput on l declare l eno varchar(10); l ename varchar(20); l is.

l set serveroutput on l declare l eno varchar(10); l ename varchar(20); l is. Existed boolean default(默认的) false; l emp. Name constant varchar(10): ='Mike'; l 注意 : 定义的常量只能在声明中赋值 l begin l eno: ='7890'; l ename: ='smith'; l DBMS_output. put_line('eno='||eno||' '||'ename='||ename); l end; l 如何从其他的表中得到数据, 来进行赋值呢 l begin l select empno, ename into eno, ename from emp where empno=7369; l DBMS_output. put_line('eno='||'ename='||ename); 辽宁 程技术大学 软件 程系

6. 6 变量赋值 l set serveroutput on l declare l eno varchar(10); l ename

6. 6 变量赋值 l set serveroutput on l declare l eno varchar(10); l ename varchar(20); l is. Existed boolean default(默认的) false; l emp. Name constant varchar(10): ='Mike'; l 注意 : 定义的常量只能在声明中赋值 l begin l eno: ='7890'; l ename: ='smith'; l DBMS_output. put_line('eno='||eno||' '||'ename='||ename); l end; 辽宁 程技术大学 软件 程系

6. 6 变量赋值 l 例如:declare l eno varchar(10); l ename varchar(20); l is. Existed

6. 6 变量赋值 l 例如:declare l eno varchar(10); l ename varchar(20); l is. Existed boolean default(默认的) false; l emp. Name constant varchar(10): ='Mike'; l 注意 : 定义的常量只能在声明中赋值 l begin l l select empno, ename into eno, ename from emp where empno=7369; DBMS_output. put_line('eno='||'ename='||ename); l End; 辽宁 程技术大学 软件 程系

6. 6 变量赋值 l 使用%type 引用数据库列 l 例: l declare l v_empno empno%type; l

6. 6 变量赋值 l 使用%type 引用数据库列 l 例: l declare l v_empno empno%type; l V_ename emp. ename%type; l begin l select empno, ename into v_empno , v_ename from emp where empno=7369; l dbms_output. put_line(v_empno||’ ‘ ||v_ename); l end; 辽宁 程技术大学 软件 程系

6. 6 变量赋值 l 示例: l 使用%rowtype 引用数据库行 l declare l v_emp emp%rowtype; l

6. 6 变量赋值 l 示例: l 使用%rowtype 引用数据库行 l declare l v_emp emp%rowtype; l begin l select * into v_emp from emp where empno=7369; l dbms_output. put_line(v_emp. empno||’ ‘ ||v_emp. ename); l end; 辽宁 程技术大学 软件 程系

l declare thisday date; l begin 最后用个函数把字符转 换成日期型的。如何 进行? thisday: =sysdate; if thisday>'3 -11月-08'

l declare thisday date; l begin 最后用个函数把字符转 换成日期型的。如何 进行? thisday: =sysdate; if thisday>'3 -11月-08' then dbms_output. put_line('您查询的已经过期!'); else dbms_output. put_line('欢迎您进入!'); end if; l end; 辽宁 程技术大学 软件 程系

条件控制 l CASE 语句用于根据单个变量或表达式与多个值进 行比较 l 执行 CASE 语句前,先计算选择器的值 BEGIN CASE ‘&grade’ WHEN ’A’

条件控制 l CASE 语句用于根据单个变量或表达式与多个值进 行比较 l 执行 CASE 语句前,先计算选择器的值 BEGIN CASE ‘&grade’ WHEN ’A’ THEN DBMS_OUTPUT. PUT_LINE(’优异’); WHEN ’B’ THEN DBMS_OUTPUT. PUT_LINE (优秀’); WHEN ’C’ THEN DBMS_OUTPUT. PUT_LINE (’良好’); WHEN ’D’ THEN DBMS_OUTPUT. PUT_LINE (’一般’); WHEN ’F’ THEN DBMS_OUTPUT. PUT_LINE (’较差’); ELSE DBMS_OUTPUT. PUT_LINE (’没有此成绩’); END CASE; END; 辽宁 程技术大学 软件 程系

l eg. 从1加到 100 l declare icount integer: =0; isum integer: =0; l begin

l eg. 从1加到 100 l declare icount integer: =0; isum integer: =0; l begin loop icount: =icount+1; exit when icount>100; isum: =isum+icount; end loop; dbms_output. put_line('1+2+3. . . +100='||to_char (isum)); l end; 辽宁 程技术大学 软件 程系

l declare icount integer: =0; isum integer: =0; l begin while icount<100 loop icount:

l declare icount integer: =0; isum integer: =0; l begin while icount<100 loop icount: =icount+1; isum: =isum+icount; end loop; dbms_output. put_line('1+2+3. . . +100='|| to_char(isum)); l end; 辽宁 程技术大学 软件 程系

l declare isum integer: =0; 循环变量i,不需 要提前声明 l begin for i in 1. .

l declare isum integer: =0; 循环变量i,不需 要提前声明 l begin for i in 1. . 100 loop isum: =isum+i; end loop; dbms_output. put_line('1+2+3. . . +100='|| to_char(isum)); l end; 辽宁 程技术大学 软件 程系

6. 10 DBMS_OUTPUT的使用 DECLARE v_Data DBMS_OUTPUT. CHARARR; v_Num. Lines NUMBER; BEGIN DBMS_OUTPUT. ENABLE(1000000); DBMS_OUTPUT.

6. 10 DBMS_OUTPUT的使用 DECLARE v_Data DBMS_OUTPUT. CHARARR; v_Num. Lines NUMBER; BEGIN DBMS_OUTPUT. ENABLE(1000000); DBMS_OUTPUT. PUT_LINE('Line One'); DBMS_OUTPUT. PUT_LINE('Line Two'); DBMS_OUTPUT. PUT_LINE('Line Three'); v_Num. Lines : = 3; DBMS_OUTPUT. GET_LINES(v_Data, v_Num. Lines); FOR v_Counter IN 1. . v_Num. Lines LOOP INSERT INTO scott. emp 1 (ename) VALUES (v_Data(v_Counter)); --DBMS_OUTPUT. PUT_LINE(v_data); END / LOOP; END; 辽宁 程技术大学 软件 程系

例子: l declare empjob emp. job%type; begin select job into empjob from emp where

例子: l declare empjob emp. job%type; begin select job into empjob from emp where empno=9999; dbms_output. put_line('employee job is'||empjob); Exception when NO_Data_Found then dbms_output. put_line(‘错误了!没有 查到这样的 数据!'); end; 辽宁 程技术大学 软件 程系

l declare empname emp. ename%type; empno empno%type; icount int: =0; empjob emp. job%type; l

l declare empname emp. ename%type; empno empno%type; icount int: =0; empjob emp. job%type; l begin empno: =7369; empname: ='smith'; dbms_output. put_line('employee no is'||empno||'employee name if'||empname); 辽宁 程技术大学 软件 程系

select count(*) into icount from emp where sal>3000; if icount>0 then dbms_output. put_line('有 资达到要求的人!');

select count(*) into icount from emp where sal>3000; if icount>0 then dbms_output. put_line('有 资达到要求的人!'); else dbms_output. put_line('没有这样的符合要求的人'); end if; select job into empjob from emp where empno=9999; dbms_output. put_line('employee job is'||empjob); l exception l when no_data_found then l dbms_output. put_line('错误!没有这样的记录。'); l end; 辽宁 程技术大学 软件 程系

l declare dup_value exception; icount int: =0; l begin select count(*) into icount from

l declare dup_value exception; icount int: =0; l begin select count(*) into icount from emp where empno=7369; if icount>0 then raise dup_value; end if; l exception when dup_value then dbms_output. put_line('表中已经有这条记 录'); l end; 辽宁 程技术大学 软件 程系

l 用自定义异常来替代服务器已经定义好的异常 l 这里不需要手动引发异常 l declare dup_value exception; pragma exception_init(dup_value, -1); --覆盖系 统的异常 l

l 用自定义异常来替代服务器已经定义好的异常 l 这里不需要手动引发异常 l declare dup_value exception; pragma exception_init(dup_value, -1); --覆盖系 统的异常 l begin insert into emp(empno, ename) values(7369, 'beibei'); l exception when dup_value then dbms_output. put_line('表中已经有这条记录'); l end; 辽宁 程技术大学 软件 程系

覆盖系统预定义的异常 l declare dup_value exception; pragma exception_init(dup_value, -1); l begin insert into emp(empno, ename)

覆盖系统预定义的异常 l declare dup_value exception; pragma exception_init(dup_value, -1); l begin insert into emp(empno, ename) values(7369, 'gg'); l exception when dup_value then raise_application_error(-20001, ‘ 表中已经有这条记录!'); l end; 辽宁 程技术大学 软件 程系