oracle_plsql_编程语法详解
- 格式:doc
- 大小:627.00 KB
- 文档页数:93
Oracle PL/SQL 编程手册(SQL大全) 一、SQL PLUS1引言SQL命令以下17个是作为语句开头的关键字:alter drop revokeaudit grant rollback*mit*insert selectment lock updatecreate noaudit validatedelete rename这些命令必须以“;”结尾带*命令句尾不必加分号,并且不存入SQL缓存区。
SQL中没有的SQL*PLUS命令这些命令不存入SQL缓存区define pause#del quit$describe remark/disconnect runaccept document saveappend edit setbreak exit showbtitle get spoolchange help sqlplusclear host startcolumn input timingpute list ttitleconnect newpage undefinecopy---------2数据库查询数据字典TAB用户创建的所有基表、视图和同义词清单DTAB构成数据字典的所有表COL用户创建的基表的所有列定义的清单CATALOG用户可存取的所有基表清单select*from tab;describe命令描述基表的结构信息describe deptselect*from emp;select empno,ename,jobfrom emp;select*from deptorder by deptno desc;逻辑运算符=!=或<>>>=<<=inbetween value1and value2like%_in nullnotno in,is not null谓词in和not in有哪些职员和分析员select ename,jobfrom empwhere job in('clerk','analyst');select ename,jobfrom empwhere job not in('clerk','analyst');谓词between和not between哪些雇员的工资在2000和3000之间select ename,job,sal from empwhere sal between2000and3000;select ename,job,sal from empwhere sal not between2000and3000;谓词like,not likeselect ename,deptno from empwhere ename like'S%';(以字母S开头)select ename,deptno from empwhere ename like'%K';(以K结尾)select ename,deptno from empwhere ename like'W___';(以W开头,后面仅有三个字母)select ename,job from empwhere job not like'sales%';(哪些雇员的工种名不以sales开头)谓词is null,is not null没有奖金的雇员(即mision为null)select ename,job from empwhere m is null;select ename,job from empwhere m is not null;多条件查询select ename,jobfrom empwhere deptno=20and job!='clerk';表达式+-*/算术表达式选择奖金高于其工资的5%的雇员select ename,sal,m,m/sal from empwhere m>.05*salorder by m/sal desc;日期型数据的运算add two days to6-Mar-876-Mar-87+2=8-Mar-87add two hours to6-Mar-876-Mar-87+2/24=6-Mar-87and2hrsadd15seconds to6-Mar-876-Mar-87+15/(24*60*60)=6-Mar-87and15secs列名的别名select ename employee from empwhere deptno=10;(别名:employee)select ename,sal,m,m/sal"C/S RATIO"from empwhere m>.05*salorder by m/sal desc;SQL命令的编辑list or l显示缓冲区的内容list4显示当前SQL命令的第4行,并把第4行作为当前行,在该行号后面有个*。
plsql存储过程写法存储过程是在数据库中创建的一种可重用的程序,它由一系列SQL语句和控制结构组成。
存储过程可以简化复杂的数据库操作,提高数据库的性能,并使数据库操作更加安全和可靠。
在Oracle数据库中,PL/SQL(Procedural Structured Query Language)是用于创建和管理存储过程的编程语言。
本文将介绍如何编写PL/SQL存储过程。
一、存储过程的创建要创建存储过程,首先需要打开Oracle数据库的PL/SQL开发环境,例如SQL Developer。
然后,可以使用以下语法创建一个简单的存储过程:```plsqlCREATE PROCEDURE procedure_name ISBEGIN-- SQL语句和过程逻辑END;```其中,`procedure_name`是你要创建的存储过程的名称。
在`BEGIN`和`END`之间的部分是存储过程的主体,其中可以包含SQL语句和控制结构。
二、参数和输入输出参数存储过程可以接受参数,以提高重用的灵活性和便利性。
可以使用`IN`和`OUT`关键字来定义输入和输出参数。
以下是一个带有输入和输出参数的存储过程的示例:```plsqlCREATE PROCEDURE procedure_name(IN parameter_name datatype, OUT parameter_name datatype) ISBEGIN-- 使用参数进行操作END;```在上述示例中,`parameter_name`是参数的名称,`datatype`是参数的数据类型。
在存储过程的主体中,可以访问和使用这些参数,而不需要从过程外部显式地传递它们。
输出参数可以用来将结果返回给调用者。
三、调用存储过程创建存储过程后,可以通过调用它来执行其中的SQL语句和控制结构。
可以使用以下语法调用存储过程:```sqlCALL procedure_name(parameter_value);```其中,`parameter_value`是传递给存储过程的参数值。
plsql + 的用法==========PlSql,全称为PL/SQL,是Oracle数据库中一种常用的编程语言。
本篇文章将详细介绍PlSql的用法,包括其基本语法、开发环境设置、常用函数和语句等。
一、基本语法-----PlSql的基本语法包括声明、赋值和执行语句。
以下是一个简单的PlSql程序示例:```sqlDECLAREv_name VARCHAR2(50);v_age NUMBER;BEGINv_name := '张三';v_age := 25;DBMS_OUTPUT.PUT_LINE('姓名: ' || v_name || ', 年龄: ' || v_age);END;```上述代码中,我们声明了两个变量v_name和v_age,并分别赋值为字符串和数字类型。
然后使用DBMS_OUTPUT.PUT_LINE语句输出结果。
在PlSql中,可以使用Oracle提供的输出函数来输出变量的值。
二、开发环境设置要编写和运行PlSql程序,需要安装Oracle数据库客户端,并配置开发环境。
具体步骤如下:1. 安装Oracle数据库客户端,并确保数据库服务已启动。
2. 打开Oracle SQL Developer或其他Oracle数据库管理工具。
3. 创建一个数据库连接,并选择要使用的数据库。
4. 在工具中打开一个新的PlSql编辑器窗口或创建一个新的PlSql文件。
三、常用函数和语句---------PlSql提供了许多内置函数和语句,用于处理数据、执行操作和生成结果。
以下是一些常用的函数和语句:* 数据类型转换函数:TO_CHAR、TO_NUMBER等。
* 字符串操作函数:SUBSTR、LENGTH、REPLACE等。
* 日期操作函数:YEAR、MONTH、DAY等。
* 控制语句:BEGIN...END、LOOP、WHILE、CASE等。
* 异常处理语句:EXCEPTION、RAISE等。
plsql用法,操作介绍PL/SQL是Oracle数据库中一种重要的编程语言,它提供了强大的数据处理和数据库操作能力。
本文将向大家介绍PL/SQL的用法和操作。
一、PL/SQL基础PL/SQL是一种过程化的编程语言,它可以在Oracle数据库中执行存储过程、函数、触发器和包等对象。
这些对象可以由用户自定义,并在数据库中存储,以供其他用户调用。
PL/SQL提供了丰富的数据类型、控制结构、函数和过程,使得开发者可以方便地编写复杂的数据库操作程序。
二、PL/SQL语法1. 声明语句:在PL/SQL中,需要先声明变量和常量,常见的声明语句有:变量声明(如:变量类型数据类型;),常量声明(如:CONST 常量名数据类型 = 值)。
2. 条件语句:PL/SQL支持多种条件语句,如IF-THEN-ELSE,CASE表达式等。
3. 循环语句:PL/SQL支持FOR循环、WHILE循环和LOOP循环等。
4. 异常处理:PL/SQL提供了异常处理机制,可以捕获和处理运行时出现的错误。
5. 函数和过程:PL/SQL支持定义函数和过程,可以对数据进行操作并返回结果。
三、PL/SQL操作1. 创建存储过程:可以使用CREATE PROCEDURE语句创建存储过程,指定过程的名称、参数和执行逻辑。
2. 调用存储过程:可以使用CALL语句调用存储过程,并传递参数。
3. 创建函数:可以使用CREATE FUNCTION语句创建函数,指定函数的名称、参数和返回值类型。
4. 调用函数:可以使用直接调用函数的方式或通过存储过程调用函数。
5. 创建触发器:可以使用CREATE TRIGGER语句创建触发器,用于在数据插入、更新或删除时触发特定的操作。
6. 修改和删除对象:可以使用ALTER PROCEDURE、DROP PROCEDURE、DROP FUNCTION等语句修改或删除已存在的PL/SQL对象。
四、示例以下是一个简单的PL/SQL程序示例,用于将输入的字符串转换为大写并输出:```plsqlDECLAREv_str VARCHAR2(100);v_upper VARCHAR2(100);BEGIN-- 获取输入字符串:in_str := 'hello world';v_str := :in_str;-- 将字符串转换为大写并输出v_upper := UPPER(v_str);DBMS_OUTPUT.PUT_LINE('转换后的字符串为: ' || v_upper);END;```在上述示例中,我们使用了DECLARE语句声明了两个变量v_str 和v_upper,分别用于存储输入的字符串和转换后的结果。
PLSQL语法Procedural Language和SQL的结合体。
通过增加变量、控制语句,使我们可以写些逻辑更加复杂的数据库操作语句框架组成declare – 可选声明各种变量或游标的地⽅。
begin – 必要开始执⾏语句。
--单⾏注释语句⽤两个连在⼀起的‘-’表⽰。
/*多⾏注释语句,可以换⾏*/exception – 可选出错后的处理。
end; – 必要(请注意end后⾯的分号)简单helloworld程序1declare2 v_temp number(6):=123; /* := 是⼀个赋值符号 */3begin4 dbms_output.put_line('middle');5 dbms_output.put_line(v_temp);6end;注意要想显⽰程序的东西需要设置环境set serveroutput off -->关闭输出(默认关闭)set serveroutput on -->打开输出基本数据类型Number 数字型Int 整数型Pls_integer 整数型,产⽣溢出时出现错误Binary_integer 整数型,表⽰带符号的整数Char 定长字符型,最⼤255个字符Varchar2 变长字符型,最⼤2000个字符Long 变长字符型,最长2GBDate ⽇期型Boolean 布尔型(TRUE、FALSE、NULL三者取⼀)%type 表⽰不需要知道具体的⼀个字段类型,与指定的字段类型⼀致即可。
例如:v_empno emp.empno%type;%rowtype 与表结构完全⼀致 %rowtype 举例:1declare2 v_tt emp%rowtype;3begin4select*into v_tt from emp where empno=7521;5 dbms_output.put_line(v_tt.job);6 dbms_output.put_line(v_tt.sal);7end;89输出:SALESMAN101250varray定义语法TYPE VARRAY NAMEIS VARRAY(SIZE) OF ELEMENT TYPE [NOT NULL];其中,varray name是VARRAY数据类型的名称,size是正整数,表⽰可以容纳的成员的最⼤数量,每个成员的数据类型是element typeo默认时,成员可以取空值,否则需要使⽤NOT NULL加以限制。
PL/SQL UPDATE语句1. 概述PL/SQL(Procedural Language/Structured Query Language)是一种为Oracle数据库设计的过程化编程语言。
它结合了SQL的数据操作能力和过程化语言的灵活性,可以用于编写存储过程、触发器、函数等数据库对象。
本文将深入探讨PL/SQL中的UPDATE语句的用法和相关技巧。
2. UPDATE语句基本语法UPDATE语句用于修改表中的数据。
其基本语法如下:UPDATE 表名SET 列名1 = 新值1, 列名2 = 新值2, ...[WHERE 条件];其中,表名是要更新数据的表的名称,列名是要更新的字段的名称,新值是要设置的字段的新值。
WHERE子句是可选的,用于指定更新的条件。
如果没有指定WHERE子句,将会更新表中的所有记录。
3. UPDATE语句示例下面通过一个示例来演示UPDATE语句的用法。
假设我们有一个名为employees的表,包含以下字段:employee_id、last_name、first_name和salary。
现在我们要将employee_id为1的员工的薪水增加10%。
UPDATE employeesSET salary = salary * 1.1WHERE employee_id = 1;执行以上UPDATE语句后,employee_id为1的员工的薪水将会增加10%。
4. UPDATE语句高级用法4.1 更新多个列UPDATE语句可以一次更新多个列的值。
只需在SET子句中指定多个列和对应的新值即可。
UPDATE employeesSET last_name = 'Smith', first_name = 'John'WHERE employee_id = 2;以上语句将会将employee_id为2的员工的last_name修改为’Smith’,first_name修改为’John’。
plsql使用技巧PL/SQL是Oracle数据库的一种编程语言,可以用于编写存储过程、触发器、函数等程序。
本文将从以下几个方面介绍PL/SQL的使用技巧:一、变量和常量的使用1.1 变量的定义在PL/SQL中,可以使用DECLARE语句来定义变量。
例如:DECLAREv_name VARCHAR2(100);BEGINv_name := 'John';END;1.2 常量的定义在PL/SQL中,可以使用CONSTANT关键字来定义常量。
例如:DECLAREc_pi CONSTANT NUMBER := 3.1415926;BEGINNULL;END;1.3 变量和常量的命名规则在PL/SQL中,变量和常量的命名规则与其他编程语言类似。
变量和常量的名称必须以字母开头,并且只能包含字母、数字和下划线。
二、条件语句的使用2.1 IF语句IF语句用于根据条件执行不同的代码块。
例如:DECLAREv_age NUMBER := 18;BEGINIF v_age >= 18 THENDBMS_OUTPUT.PUT_LINE('You are an adult.');ELSEDBMS_OUTPUT.PUT_LINE('You are a minor.');END IF;END;2.2 CASE语句CASE语句用于根据不同情况执行不同代码块。
例如:DECLAREv_day_of_week NUMBER := 5;BEGINCASE v_day_of_weekWHEN 1 THEN DBMS_OUTPUT.PUT_LINE('Monday');WHEN 2 THEN DBMS_OUTPUT.PUT_LINE('Tuesday');WHEN 3 THEN DBMS_OUTPUT.PUT_LINE('Wednesday'); WHEN 4 THEN DBMS_OUTPUT.PUT_LINE('Thursday'); WHEN 5 THEN DBMS_OUTPUT.PUT_LINE('Friday');ELSE DBMS_OUTPUT.PUT_LINE('Weekend');END CASE;END;三、循环语句的使用3.1 FOR循环FOR循环用于执行一组代码块一定次数。
plsql使用教程PL/SQL是Oracle数据库的过程式编程语言,它结合了SQL的强大查询能力和程序设计语言的灵活性。
以下是一个简单的PL/SQL使用教程:1. 定义变量在PL/SQL中,可以使用DECLARE语句来定义变量。
例如:DECLAREnum INTEGER;name VARCHAR2(50);2. 使用SELECT查询数据可以使用SELECT语句从表中检索数据。
例如:SELECT * INTO num, name FROM employees WHERE employee_id = 100;3. 使用IF-THEN-ELSE进行条件判断PL/SQL提供了IF-THEN-ELSE语句来进行条件判断。
例如:IF num > 0 THENDBMS_OUTPUT.PUT_LINE('Number is positive');ELSEDBMS_OUTPUT.PUT_LINE('Number is negative');END IF;4. 使用FOR循环可以使用FOR循环来对一个集合进行迭代。
例如:FOR i IN 1..10 LOOPDBMS_OUTPUT.PUT_LINE('The value of i is: ' || i);END LOOP;5. 创建存储过程可以使用CREATE PROCEDURE语句来创建存储过程。
例如:CREATE PROCEDURE get_employee_details (p_employee_idIN NUMBER) ISv_employee_name VARCHAR2(50);BEGINSELECT employee_name INTO v_employee_name FROM employees WHERE employee_id = p_employee_id;DBMS_OUTPUT.PUT_LINE('Employee name is: ' ||v_employee_name);END;6. 调用存储过程可以使用EXECUTE语句来调用存储过程。
玩转Oracle-PLSQL定义并使用变量Oracle是一种关系型数据库管理系统,提供了一种称为PLSQL的编程语言,用于在数据库中定义和处理数据。
PLSQL具有许多功能,包括变量的定义和使用。
本文将介绍在Oracle-PLSQL中定义和使用变量的方法和注意事项。
在Oracle-PLSQL中,可以使用DECLARE语句来定义变量。
DECLARE语句用于在PLSQL块中声明一个或多个变量。
变量可以是任何合法的数据类型,例如整数、字符串、日期等。
下面是一个简单的示例:```DECLAREv_name VARCHAR2(50):='John';v_age NUMBER:=30;BEGIN--此处可以使用变量进行数据处理DBMS_OUTPUT.PUT_LINE('Name: ',v_name);DBMS_OUTPUT.PUT_LINE('Age: ',v_age);END;```在上述示例中,使用DECLARE语句定义了两个变量:v_name和v_age。
v_name是一个VARCHAR2类型的变量,v_age是一个NUMBER类型的变量。
这两个变量分别被初始化为'John'和30。
然后,可以在BEGIN和END之间使用这些变量进行数据处理。
在PLSQL中,可以使用变量进行各种操作,例如赋值、数学运算和条件判断等。
以下是一些使用变量的示例:```DECLAREv_num1 NUMBER:=10;v_num2 NUMBER:=5;v_result NUMBER;BEGIN--将两个变量相加,并将结果赋值给另一个变量v_result:=v_num1+v_num2;DBMS_OUTPUT.PUT_LINE('Sum: ',v_result);--使用IF语句根据变量的值执行不同的操作IF v_result>15 THENDBMS_OUTPUT.PUT_LINE('Result is greater than 15');ELSEDBMS_OUTPUT.PUT_LINE('Result is less than or equal to 15');ENDIF;```在上述示例中,使用变量v_num1和v_num2存储了两个数字,并使用变量v_result存储了它们的和。
Ⅰ、介绍:在编写pl/sql程序时候,可以定义变量和常量,在pl/sql中包括有:标量类型(scalar)复合类型(composite)参照类型(reference)lob(large object);㈠、标量:(scalar)常用的类型:在编写pl/sql的时候,如果要使用变量,需要在定义部分定义变量;pl/sql中定义变量和常量的语法如下:identifier [constant] datatype [ not null ] [:=|default expt]identifier :名称;constant :指定常量,需要指定他的初始值,而且他的值是不能够改变的;datatype:数据类型;not null ;指定变量不能为null;:= 给变量或是常量指定初始值;default:用于指定初始值;expr:指定初始值的pl/sql表达式,可以是文本、其他变量、函数等;①定义一个变长字符串:v_ename varchar2(20);②定义一个数:v_sal number(6,3);③定义一个数并给定初始值:v_sal number(5,3):=5.4④定义一个日期类型的数据:v_hitedate date;⑤定义一个bool变量,不能为null,初始值为false;v_valid boolean not null default false;㈡、标量:使用标量在定义好变量后就可以使用这些边玲了,这里需要说明的是pl/sql块为变量赋值不同于其他编程语言,需要使用:=符号;SQL> --下面以输入员工号,显示员工姓名等信息;SQL> declare2 c_tax_rate number(3,2):=0.03;3 --用户名;4 v_name varchar2(5);5 v_sal number(6,2);6 v_tax_sal number(6,2);7 begin8 --执行910 select ename ,sal into v_name , v_sal from emp where empno=&no;11 --计算所得税‘12 v_tax_sal:=v_sal*c_tax_rate;13 --输出;14 dbms_output.put_line('Name is : ' || v_name || ' sal is '||v_sal||' tax is '||v_tax_sal);15 end;16 /Enter value for no: 7788old 10: select ename ,sal into v_name , v_sal from emp where empno=&no; new 10: select ename ,sal into v_name , v_sal from emp where empno=7788; Name is : SCOTT sal is 3000 tax is 90PL/SQL procedure successfully completed.㈢、标量:使用%type类型;对于上面的pl/sql块有一个问题:如果员工的姓名操过了5个字符的话救护出错,为了降低pl/sql程序的维护工作量,可以使用%type属性定义变量,这样他会按照数据库列来确定你定义的变量类型和长度;标识符名称表明.列名%type;SQL> --下面以输入员工号,显示员工姓名等信息;SQL> declare2 c_tax_rate number(3,2):=0.03;3 --用户名;4 v_name emp.ename%type;5 v_sal emp.sal%type;6 v_tax_sal number(6,2);7 begin8 --执行910 select ename ,sal into v_name , v_sal from emp where empno=&no;11 --计算所得税‘12 v_tax_sal:=v_sal*c_tax_rate;13 --输出;14 dbms_output.put_line('Name is : ' || v_name || ' sal is '||v_sal||'tax is '||v_tax_sal);15 end;16 /Enter value for no: 7788old 10: select ename ,sal into v_name , v_sal from emp where empno=&no; new 10: select ename ,sal into v_name , v_sal from emp where empno=7788; Name is : SCOTT sal is 3000 tax is 90PL/SQL procedure successfully completed.SQL>Ⅱ、复合变量(composite);㈠、介绍:用于存放多个值的变量。
plsql 使用手册(最新版)目录1.PL/SQL简介2.PL/SQL的基本语法3.数据类型与变量4.控制结构5.函数与过程6.触发器与存储过程7.异常处理8.PL/SQL与SQL的交互9.PL/SQL的应用实例10.PL/SQL的优缺点及发展前景正文【PL/SQL 简介】PL/SQL(Procedural Language/Structured Query Language)是一种过程式编程语言,它是为了与 SQL(结构化查询语言)协同工作而设计的。
PL/SQL 通常用于 Oracle 数据库中,用于编写存储过程、触发器、函数等,从而实现对数据库的高级操作和控制。
【PL/SQL 的基本语法】PL/SQL的基本语法包括变量声明、数据类型、控制结构(条件语句、循环语句等)、函数与过程、触发器与存储过程等。
【数据类型与变量】PL/SQL的数据类型与SQL的数据类型基本一致,包括数字类型、字符串类型、日期类型等。
在PL/SQL中,需要先声明变量,再进行使用。
【控制结构】PL/SQL的控制结构包括条件语句(IF-THEN、IF-THEN-ELSE)、循环语句(WHILE、FOR)等,用于实现复杂的逻辑控制。
【函数与过程】函数是一种返回某个值的过程,过程则是一种不返回值的操作。
在PL/SQL 中,函数与过程可以通过参数传递数据,并返回结果。
【触发器与存储过程】触发器是一种在对表执行 INSERT、UPDATE 或 DELETE 操作时自动执行的存储过程。
存储过程是一组预先编译的 SQL 语句,可以实现复杂的业务逻辑。
【异常处理】PL/SQL中可以处理异常,通过EXCEPTION和WHEN子句可以捕获和处理异常情况。
【PL/SQL 与 SQL 的交互】PL/SQL可以与SQL进行交互,例如在PL/SQL过程中调用SQL语句,或者在SQL语句中调用PL/SQL过程。
【PL/SQL 的应用实例】一个典型的PL/SQL应用实例是编写一个存储过程,用于实现数据的增、删、改、查等操作。
SQL PL/SQL语法手册第一部分 SQL语法部分Create table 语句语句: CREATE TABLE [schema.]table_name( { column datatype [DEFAULT expr] [column_constraint] ... | table_constraint}[, { column datatype [DEFAULT expr] [column_constraint] ... | table_constraint} ]...)[ [PCTFREE integer] [PCTUSED integer][INITRANS integer] [MAXTRANS integer][TABLESPACE tablespace][STORAGE storage_clause][ RECOVERABLE | UNRECOVERABLE ][ PARALLEL ( [ DEGREE { integer | DEFAULT } ][ INSTANCES { integer | DEFAULT } ])| NOPARALLEL ][ CACHE | NOCACHE ]| [CLUSTER cluster (column [, column]...)] ][ ENABLE enable_clause| DISABLE disable_clause ] ...[AS subquery]表是Oracle中最重要的数据库对象,表存储一些相似的数据集合,这些数据描述成若干列或字段.create table 语句的基本形式用来在数据库中创建容纳数据行的表.create table 语句的简单形式接收表名,列名,列数据类型和大小.除了列名和描述外,还可以指定约束条件,存储参数和该表是否是个cluster的一部分.Schema 用来指定所建表的owner,如不指定则为当前登录的用户.Table_name 用来指定所创建的表名,最长为30个字符,但不可以数字开头(可为下划线),但不可同其它对象或Oracle的保留字冲突.Column 用来指定表中的列名,最多254个.Datatype 用来指定列中存储什么类型的数据,并保证只有有效的数据才可以输入.column_constraint 用来指定列约束,如某一列不可为空,则可指定为not null.table_constraint 用来指定表约束,如表的主键,外键等.Pctfree 用来指定表中数据增长而在Oracle块中预留的空间. DEFAULT为10%,也就是说该表的每个块只能使用90%,10%给数据行的增大时使用. Pctused 用来指定一个水平线,当块中使用的空间低于该水平线时才可以向该中加入新数据行.Parallel 用来指定为加速该表的全表扫描可以使用的并行查询进程个数. Cache 用来指定该表为最应该缓存在SGA数据库缓冲池中的候选项. Cluster 用来指定该表所存储的 cluster.Tablespace 用来指定用数据库的那个分区来存储该表的数据. Recoverable|Unrecoverable 用来决定是否把对本表数据所作的变动写入Redo 文件.以恢复对数据的操作.As 当不指定表的各列时,可利用As子句的查询结果来产生数据库结构和数据.例:1) create table mytab1e(mydec decimal,myint inteter)tablespace user_datapctfree 5pctused 30;2) create table mytable2as ( select * from mytable1);create sequence语句语句: CREATE SEQUENCE [schema.]sequence_name[INCREMENT BY integer][START WITH integer][MAXVALUE integer | NOMAXVALUE][MINVALUE integer | NOMINVALUE][CYCLE | NOCYCLE][CACHE integer | NOCACHE][ORDER | NOORDER]序列用来为表的主键生成唯一的序列值.Increment by 指定序列值每次增长的值Start with 指定序列的第一个值Maxvalue 指定产生的序列的最大值Minvalue 指定产生的序列的最小值Cycle 指定当序列值逵到最大或最小值时,该序列是否循环.Cache 指定序列生成器一次缓存的值的个数Order 指定序列中的数值是否按访问顺序排序.例:1) create sequence myseqincrement by 4start with 50maxvalue 60minvalue 50cyclecache 3;2)sql> create sequence new_s;sql>insert into new (new_id,last_name,first_name)values(new_s.nextval,’daur’,’permit’);create view语句语句: CREATE [OR REPLACE] [FORCE | NOFORCE] VIEW [schema.]view_name [(alias [,alias]...)]AS subquery[WITH CHECK OPTION [CONSTRAINT constraint]]视图实际上是存储在数据库上旳 select语句.每次在sql语句中使用视图时,表示该视图的select语句就用来得到需要的数据.Or replace 创建视图时如果视图已存在,有此选项,新视图会覆盖旧的视图.Force 如有此选项,当视图基于的表不存在或在该模式中没有创建视图的权限时,也可以建立视图.As subquery 产生视图的select查询语句With check option 如果视图是基于单表的且表中所有的非空列都包含在视图中时,该视图可用于insert和update语句中,本选项保证在每次插入或更新数据后,该数据可以在视图中查到例:create or place view new_vasselect substr(d.d_last_name,1,3),d.d_lastname,d.d_firstname,b.b_start_date,b.b_locationfrom new1 d,new2 bwhere d.d_lastname=b.b_lastname;INSERT语句:语法INSERT INTO [schema.]{table | view | subquery }[@dblink][ (column [, column] ...) ]{VALUES (expr [, expr] ...) | subquery}[WHERE condition]插入单行使用VALUES关键词为新行的每一列指定一个值.如果不知道某列的值,可以使用NULL关键词将其值设为空值(两个连续的逗号也可以表示空值,也可使用NULL关键词)插入一行时试图为那些NOT NULL的列提供一个NULL值,会返回错误信息.举例:插入一条记录到DEPARTMENT表中INSERT INTO DEPARTMENT(DEPARTMENT_ID,NAME,LOCATION_ID)VALUES (01,’COMPUTER’,167)插入多行将SELECT语句检索出来的所有数据行都插入到表中.这条语句通常在从一个表向另一个表快速复制数据行.举例:INSERT INTO ORDER_TEMPSELECTA.ORDER_ID,B.ITEM_ID,,E.FIRST_NAME||'.'||ST_NAME,A.ORDER_DATE,A.SHIP_DATE,D.DESCRIPTION,B.ACTUAL_PRICE,B.QUANTITY,B.TOTALFROM SALES_ORDER A, ITEM B, CUSTOMER C,PRODUCT D, EMPLOYEE EWHERE MONTHS_BETWEEN(TO_DATE(A.ORDER_DATE),TO_DATE('01-7月-91'))>0AND A.CUSTOMER_ID=C.CUSTOMER_IDAND C.SALESPERSON_ID=E.EMPLOYEE_IDAND A.ORDER_ID=B.ORDER_IDAND B.PRODUCT_ID=D.PRODUCT_ID从其它表复制数据:要快速地从一个表向另一个尚不存在的表复制数据,可以使用CREATE TABLE语句定义该表并同时将SELECT语句检索的结果复制到新表中. CREATE TABLE EMPLOYEE_COPYASSELECT *FROM EMPLOYEEUPDATE语句:语法UPDATE [schema.]{table | view | subquery}[@dblink] [alias]SET { (column [, column] ...) = (subquery)| column = { expr | (subquery) } }[, { (column [, column] ...) = (subquery)| column = { expr | (subquery) } } ] ...[WHERE condition]UPDATE语句更新所有满足WHERE子句条件的数据行.同样,该语句可以用SELECT语句检索得到.但SELECT必须只检索到一行数据值.否则报错.而且每更新一行数据,均要执行一次SELECT语句.举例:UPDATE EMPLOYEE_COPSET SALARY=SALARY-400WHERE TO_NUMBER(TO_CHAR(HIRE_DATE,'YYMMDD'))<850101UPDATE ITEM_COP ASET A.ACTUAL_PRICE=(SELECT B.LIST_PRICEFROM PRICE B,SALES_ORDER CWHERE A.PRODUCT_ID=B.PRODUCT_ID ANDA.ORDER_ID=C.ORDER_ID ANDTO_NUMBER(TO_CHAR(C.ORDER_DATE,'YYYYMMDD')) BETWEEN TO_NUMBER(TO_CHAR(B.START_DATE,'YYYYMMDD')) ANDNVL(TO_NUMBER(TO_CHAR(END_DATE,'YYYYMMDD')),29991231))DELETE语句:语法DELETE [FROM] [schema.]{table | view}[@dblink] [alias][WHERE condition]DELETE语句删除所有满足WHERE子句条件的数据行.举例:DELETE FROM itemWHERE ORDER_ID=510TRUNCATE语句:语法TRUNCATE [schema.]table各类Functions:转换函数:函數:TO_CHAR语法:TO_CHAR(number[,format])用途:将一个数值转换成与之等价的字符串.如果不指定格式,将转换成最简单的字符串形式.如果为负数就在前面加一个减号.语法:TO_CHAR(date[,format])用途:将按format参数指定的格式将日期值转换成相应的字符串形式.同样,Oracle提供许多的格式模型,用户可以用它们的组合来表示最终的输出格式.唯一限制就是最终的掩码不能超过22个字符.下表列出了部分日期格式化元素.函數:TO_DATE语法:TO_DATE(string,format)用途:根据给定的格式将一个字符串转换成Oracle的日期值.该函数的主要用途是用来验证输入的日期值.在应用程序中,用户必须验证输入日期是否有效,如月份是否在1~12之间和日期中的天数是否在指定月份的天数内.函數:TO_NUMBER语法:TO_NUMBER(string[,format])用途:该函数将一个字符串转换成相应的数值.对于简单的字符串转换数值(例如几位数字加上小数点).格式是可选的.日期函数函數:ADD_MONTHS语法:ADD_MONTHS(date,number)用途:在日期date上加指定的月数,返回一个新日期.如果给定为负数,返回值为日期date之前几个月的日期.number应当是个整数,如果是小数,正数被截为小于该数的最大整数,负数被截为大于该数的最小整数.例如:SELECT TO_CHAR(ADD_MONTHS(sysdate,1),'DD-MON-YYYY') "Next month"FROM dualNext month-----------19-FEB-2000函數:LAST_DAY语法:LAST_DAY(date)用途:返回日期date所在月份的最后一天的日期.例如:SELECT SYSDATE, LAST_DAY(SYSDATE) "Last",LAST_DAY(SYSDATE) - SYSDATE "Days Left"FROM DUALSYSDATE Last Days Left--------- --------- ----------19-JAN-00 31-JAN-00 12函數:MONTHS_BETWEEN语法:MONTHS_BETWEEN(date1,date2)用途:返回两个日期之间的月份.如果两个日期月份内的天数相同(或者都是某个月的最后一天),返回值是整数.否则,返回值是小数,每于1/31月来计算月中剩余天数.如果第二个日期比第一个日期还早,则返回值是负数.例如:SELECT MONTHS_BETWEEN(TO_DATE('02-02-1992', 'MM-DD-YYYY'), TO_DATE('01-01-1992', 'MM-DD-YYYY'))"Months"FROM DUALMonths----------1.03225806SELECT MONTHS_BETWEEN(TO_DATE('02-29-1992', 'MM-DD-YYYY'), TO_DATE('01-31-1992', 'MM-DD-YYYY'))"Months"FROM DUALMonths----------1函數:NEXT_DAY语法:NEXT_DAY(date,day)用途:该函数返回日期date指定若天后的日期.注意:参数day必须为星期,可以星期几的英文完整拼写,或前三个字母缩写,或数字1,2,3,4,5,6,7分别表示星期日到星期六.例如,查询返回本月最后一个星期五的日期.例如:SELECT NEXT_DAY((last_day(sysdate)-7),'FRIDAY')FROM dualNEXT_DAY(---------28-JAN-00函數:ROUND语法:NEXT_DAY(date[,format])用途:该函数把一个日期四舍五入到最接近格式元素指定的形式.如果省略format,只返回date的日期部分.例如,如果想把时间(24/01/00 14:58:41)SELECT to_char(ROUND(sysdate,'HH'),'DD-MON-YY HH24:MI:SS')FROM dualTO_CHAR(ROUND(SYSDATE,'HH'),'DD-MON-YYHH24:MI:SS')-----------------------------------------------------------------24-JAN-00 15:00:00函數:TRUNC语法:TRUNC(date[,format])用途:TRUNC函数与ROUND很相似,它根据指定的格式掩码元素,只返回输入日期用户所关心的那部分,与ROUND有所不同,它删除更精确的时间部分,而不是将其四舍五入.例如:SELECT TRUNC(sysdate)FROM dualTRUNC(SYS---------24-JAN-00FLOOR函数:求两个日期之间的天数用;select floor(sysdate - to_date('20080805','yyyymmdd')) from dual;字符函数函數:ASCII语法:ASCII(character)用途:返回指定字符的ASCII码值.如果为字符串时,返回第一个字符的ASCII码值.例如:SELECT ASCII('Z')FROM dualASCII('Z')----------90函數:CHR语法:CHR(number)用途:该函数执行ASCII函数的反操作,返回其ASCII码值等于数值number的字符.该函数通常用于向字符串中添加不可打印字符.例如:SELECT CHR(65)||'BCDEF'FROM dualCHR(65------ABCDEF函數:CONCAT语法:CONCAT(string1,string2)用途:该函数用于连接两个字符串,将string2跟在string1后面返回,它等价于连接操作符(||).例如:SELECT CONCAT(‘This is a’,’ computer’)FROM dualCONCAT('THISISA','------------------This is a computer它也可以写成这样:SELECT ‘This is a’||’ computer’FROM dual'THISISA'||'COMPUT------------------This is a computer这两个语句的结果是完全相同的,但应尽可能地使用||操作符.函數:INITCAP语法:INITCAP(string)用途:该函数将字符串string中每个单词的第1个字母变成大写字母,其它字符为小写字母.例如:SELECT INITCAP(first_name||'.'||last_name)FROM employeeWHERE department_id=12INITCAP(FIRST_NAME||'.'||LAST_N-------------------------------Chris.AlbertsMatthew.FisherGrace.RobertsMichael.Douglas函數:INSTR语法:INSTR(input_string,search_string[,n[,m]])用途:该函数是从字符串input_string的第n个字符开始查找搜索字符串的第m 次出现,如果没有找到搜索的字符串,函数将返回0.如果找到,函数将返回位置.例如:SELECT INSTR('the quick sly fox jumped over thelazy brown dog','the',2,1)FROM dualINSTR('THEQUICKSLYFOXJUMPEDOVERTHELAZYBROWNDOG','THE',2,1)----------------------------------------------------------31函數:INSTRB语法:INSTRB(input_string,search_string[,n[,m]])用途:该函数类似于INSTR函数,不同之处在于INSTRB函数返回搜索字符串出现的字节数,而不是字符数.在NLS字符集中仅包含单字符时,INSTRB函数和INSTR函数是完全相同的.函數:LENGTH语法:LENGTH(string)用途:该函数用于返回输入字符串的字符数.返回的长度并非字段所定义的长度,而只是字段中占满字符的部分.以列实例中,字段first_name定义为varchar2(15).语法:SELECT first_name,LENGTH(first_name)FROM employeeFIRST_NAME LENGTH(FIRST_NAME)--------------- ------------------JOHN 4KEVIN 5函數:LENGTHB语法:LENGTHB(string)用途:该函数用于返回输入字符串的字节数.对于只包含单字节字符的字符集来说LENGTHB函数和LENGTH函数完全一样.函數:LOWER语法:LOWER(string)用途:该函数将字符串string全部转换为小写字母,对于数字和其它非字母字符,不执行任何转换.函數:UPPER语法:UPPER(string)用途:该函数将字符串string全部转换为大写字母,对于数字和其它非字母字符,不执行任何转换.函數:LPAD语法:LPAD(string,length[,’set’])用途:在字符串string的左边加上一个指定的字符集set,从而使串的长度达到指定的长度length.参数set可以是单个字符,也可以是字符串.如果string的长度小于length时,取string字符串的前length个字符.语法:SELECT first_name,LPAD(first_name,20,' ')FROM employeeFIRST_NAME LPAD(FIRST_NAME,20,'')--------------- -----------------------------------------JOHN JOHNKEVIN KEVIN函數:RPAD语法:RPAD(string,length[,’set’])用途:在字符串string的右边加上一个指定的字符集set,从而使串的长度达到指定的长度length.参数set可以是单个字符,也可以是字符串.如果string的长度小于length时,取string字符串的前length个字符.例如:SELECT first_name,rpad(first_name,20,'-')FROM employeeFIRST_NAME RPAD(FIRST_NAME,20,'-')--------------- -----------------------------------------JOHN JOHN----------------KEVIN KEVIN---------------函數:LTRIM语法:LTRIM(string[,’set’])用途:该函数从字符串的左边开始,去掉字符串set中的字符,直到看到第一个不在字符串set中的字符为止.例如:SELECT first_name,ltrim(first_name,'BA')FROM employeeWHERE first_name='BARBARA'FIRST_NAME LTRIM(FIRST_NAM--------------- ---------------BARBARA RBARA函數:RTRIM语法:RTRIM(string[,’set’])用途:该函数从字符串的右边开始,去掉字符串set中的字符,直到看到第一个不在字符串set中的字符为止.具有NULL值的字段不能与具有空白字符的字段相比较.这是因为空白字符与NULL字符是完全不同的两种字符.该函数的另外一个用途是当进行字段连接时去掉不需要的字符.函數:SUBSTR语法:SUBSTR(string,start[,length])用途:该函数从输入字符串中取出一个子串,从start字符处开始取指定长度的字符串,如果不指定长度,返回从start字符处开始至字符串的末尾.函數:REPLACE语法:REPLACE(string,search_set[,replace_set])用途:该函数将字符串中所有出现的search_set都替换成replace_set字符串.可以使用该函将字符串中所有出现的符号都替换成某个有效的名字.如果不指定replace_set,则将从字符串string中删除所有的搜索字符串search_set.例如:SELECT REPLACE('abcdefbdcdabc,dsssdcdrd','abc','ABC')FROM dualREPLACE('ABCDEFBDCDABC,-----------------------ABCdefbdcdABC,dsssdcdrd函數:TRANSLATE语法:TRANSLATE(string,search_set,replace_set)用途:该函数用于将所有出现在搜索字符集search_set中的字符转换成替换字符集replace_set中的相应字符.注意:如果字符串string中的某个字符没有出现在搜索字符集中.则它将原封不动地返回.如果替换字符集replace_set比搜索字符集search_set小,那么搜索字符集search_set中后面的字符串将从字符串string中删除.例如:SELECTTRANSLATE('GYK-87M','0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ',9999999999xxxxxxxxxxxxxx')FROM dualTRANSL------xx-99x数值函数函數:ABS语法:ABS(number)用途:该函数返回数值number的绝对值.绝对值就是一个数去掉符号的那部分.函數:SQRT语法:SQRT(number)用途:该函数返回数值number的平方根,输入值必须大于等于0,否则返回错误.函數:CEIL语法:CEIL(number)用途:该函数返回大于等于输入值的下一个整数.函數:FLOOR语法:FLOOR(number)用途:该函数返回小于等于number的最大整数.语法:MOD(n,m)用途:该函数返回n除m的模,结果是n除m的剩余部分.m,n可以是小数,负数.函數:POWER语法:POWER(x,y)用途:该函数执行LOG函数的反操作,返回x的y次方.函數:ROUND语法:ROUND(number,decimal_digits)用途:该函数将数值number四舍五入到指定的小数位.如果decimal_digits为0,则返回整数.decimal_digits可以为负数.函數:TRUNC语法:TRUNC(number[,decimal_pluces])用途:该函数在指定的小数字上把一个数值截掉.如果不指定精度,函数预设精度为0. decimal_pluces可以为负数.语法:SIGN(number)用途:该函数返回number的符号,如果number为正数则返回1,为负数则返回-1,为0则返回0.函數:SIN语法:SIN(number)用途:该函数返回弧度number的正弦值.函數:SINH语法:SINH(number)用途:该函数返回number的返正弦值.函數:COS语法:COS(number)用途:该函数返回弧度number的三角余弦值.要用角度计算余弦,可以将输入值乘以0.01745转换成弧度后再计算.语法:COSH(number)用途:该函数返回输入值的反余弦值.函數:TAN语法:TAN(number)用途:该函数返回弧度number的正切值.函數:TANH语法:TANH(number)用途:该函数返回数值number的反正切值.函數:LN语法:LN(number)用途:该函数返回number自然对数.函數:EXP语法:EXP(number)用途:该函数返回e(2.71828183)的number次方.该函数执行自然对数的反过程.函數:LOG语法:LOG(base,number)用途:该函数返回base为底,输入值number的对数.单行函数:单行函数中可以对任何数据类型的数据进行操作.函數:DUMP语法:DUMP(expression[,format[,start[,length]]])用途:.SELECT DUMP('FARRELL',16)FROM dualDUMP('FARRELL',16)----------------------------------Typ=96 Len=7: 46,41,52,52,45,4c,4c函數:GREATEST语法:GREATEST(list of values)用途:该函数返回列表中项的最大值.对数值或日期来说,返回值是最大值或最晚日期,如果列表中包含字符串,返回值是按字母顺序列表中的最后一项.例如:SELECT GREATEST(123,234,432,112)FROM dualGREATEST(123,234,432,112)-------------------------432函數:LEAST语法:LEAST(list of values)用途:该函数返回列表中项的最小值.对数值或日期来说,返回值是最小值或最早日期,如果列表中包含字符串,返回值是按字母顺序列表中的第一项.例如:SELECT LEAST(sysdate,sysdate-10)FROM dualLEAST(SYS---------10-JAN-00函數:NVL语法:NVL(expression,replacement_value)用途:如果表达式不为空值,函数返回该表达式的值,如果是空值,就返回用来替换的值.例如:SELECT last_name,NVL(TO_CHAR(COMMISSION),'NOT APPLICABLE')FROM employeeWHERE department_id=30LAST_NAME NVL(TO_CHAR(COMMISSION),'NOTAPPLICABLE')--------------- ----------------------------------------ALLEN 300WARD 500MARTIN 1400BLAKE NOT APPLICABLE多行函数组函数可以对表达式的所有值操作,也可以只对其中不同值进行操作,组函数的语法如下所示:function[DISTINCT|ALL expression]如果既不指定DISTINCT,也不指定ALL,函数将对查询返回的所有数据行进行操作.不能在同一个SELECT语句的选择列中同时使用组函数和单行函数.函數:AVG语法:AVG([DISTINCT|ALL] expression)用途:对查询返回的数据行求平均值.例如:SELECT AVG(sal) "Average"FROM empAverage----------2073.21429函數:COUNT语法:COUNT([DISTINCT|ALL] expression)用途:计算表达式的个数.要计算EMP表中雇员的个数.例如:SELECT COUNT(deptno)FROM empCOUNT(DEPTNO)-------------14SELECT COUNT(distinct deptno)FROM empCOUNT(DISTINCTDEPTNO)---------------------3函數:MAX语法:MAX([DISTINCT|ALL] expression)用途:对查询返回的行集求最大值.如果有多个最大值,将所有均返回.要检索公司中最高工资的雇员.语法:SELECT ename,salFROM empWHERE sal=(select max(sal)FROM emp)ENAME SAL---------- ---------KING 5000函數:MIN语法:MIN([DISTINCT|ALL] expression)用途:对查询返回的行集求最小值.如果有多个最小值,将所有均返回.例如:SELECT MIN(last_name)FROM employeeMIN(LAST_NAME)---------------ADAMS函數:SUM语法:SUM([DISTINCT|ALL] expression)用途:计算查询返回的所有非空数值的总和.如果返回的数据都是空值,则该函数也返回空值.例如:SELECT SUM(salary)"Total"FROM employeeWHERE department_id=10Total---------8750函數:VARIANCE语法:VARIANCE([DISTINCT|ALL] expression)用途:该函数计算返回所有行的统计方差.例如:SELECT VARIANCE(salary)FROM employeeVARIANCE(SALARY)----------------TABLE: LOCATION 部门地址表 -------------------- -------- ----LOCATION_ID NOT NULL NUMBER(3) 地址IDREGIONAL_GROUP VARCHAR2(20) 地址名TABLE: DEPARTMENT 部门名称表 -------------------- -------- ----DEPARTMENT_ID NOT NULL NUMBER(2) 部门IDNAME VARCHAR2(14) 部门名称 LOCATION_ID NUMBER(3) 地址ID(LOCATION.LOCATION_ID)TABLE: JOB 工种表-------------------- -------- ----JOB_ID NOT NULL NUMBER(3) 工种IDFUNCTION VARCHAR2(30) 工种名称 TABLE: EMPLOYEE 雇员信息表 -------------------- -------- ----EMPLOYEE_ID NOT NULL NUMBER(4) 雇员IDLAST_NAME VARCHAR2(15)FIRST_NAME VARCHAR2(15)MIDDLE_INITIAL VARCHAR2(1)JOB_ID NUMBER(3) 工种ID(JOB.JOB_ID)MANAGER_ID NUMBER(4) 领导ID(EMPLOYEE.EMPLOYEE_ID)HIRE_DATE DATE 雇佣日期 SALARY NUMBER(7,2) 薪水COMMISSION NUMBER(7,2) 佣金DEPARTMENT_ID NUMBER(2) 部门ID(DEPARTMENT.DEPARTMENT_ID)TABLE: SALARY_GRADE 薪资等级表 -------------------- -------- ----GRADE_ID NOT NULL NUMBER(3) 等级IDLOWER_BOUND NUMBER(7,2) 最低工资 UPPER_BOUND NUMBER(7,2) 最高工资 TABLE: PRODUCT 产品信息表 -------------------- -------- ----PRODUCT_ID NOT NULL NUMBER(6) 品号DESCRIPTION VARCHAR2(30) 品名TABLE: PRICE 产品价格表 -------------------- -------- ----PRODUCT_ID NOT NULL NUMBER(6) 品号(PRODUCT.PRODUCT_ID)LIST_PRICE NUMBER(8,2) 价格MIN_PRICE NUMBER(8,2) 最低价格 START_DATE NOT NULL DATE 生效日期 END_DATE DATE 失效日期 TABLE: CUSTOMER 客户信息表 -------------------- -------- ----CUSTOMER_ID NOT NULL NUMBER(6) 客户ID(CUSTOMER.CUSTOMER_ID)NAME VARCHAR2(45) 客户名ADDRESS VARCHAR2(40) 客户地址 CITY VARCHAR2(30) 城市STATE VARCHAR2(2) 州ZIP_CODE VARCHAR2(9) 邮编AREA_CODE NUMBER(3) 区号PHONE_NUMBER NUMBER(7) 电话号码 SALESPERSON_ID NUMBER(4) 销售员ID(EMPLOYEE.EMPLOYEE_ID)CREDIT_LIMIT NUMBER(9,2) 信用限制 COMMENTS LONG 备注TABLE: SALES_ORDER 订单单头表 -------------------- -------- ----ORDER_ID NOT NULL NUMBER(4) 订单IDORDER_DATE DATE 订单日期 CUSTOMER_ID NUMBER(6) 客户ID(CUSTOMER.CUSTOMER_ID)SHIP_DATE DATE 出货日期 TOTAL NUMBER(8,2) 总金额TABLE: ITEM 订单单身表 -------------------- -------- ----ORDER_ID NOT NULL NUMBER(4) 订单ID(SALES_ORDER.ORDER_ID)ITEM_ID NOT NULL NUMBER(4) 订单行号 PRODUCT_ID NUMBER(6) 品号(PRODUCT.PRODUCT_ID)ACTUAL_PRICE NUMBER(8,2) 实际价格 QUANTITY NUMBER(8) 订单数量 TOTAL NUMBER(8,2) 总金额第二部分 PL/SQL语法部分PL/SQL语言简介(本讲义之所有程序均调式通过)首先我们看一个简单之例子,下面这个例子是统计从1至100的总和. declarei number:=0; /*声明变量井给初值*/t number:=1;error_message exception; /*声明一个出错处理*/beginfor t in 1..100 loopi:=i+t;end loop;if i>=5050 thenraise error_message; /*引发错误处理*/elseinsert into c_nt(c_t) values(i);end if;exceptionwhen error_message theninsert into c_nt(c_t) values(0);end;从上例中可以看出PL/SQL语法的一般规则.PL/SQL中语句以分号(;)结尾.开始程序块的PL/SQL语句(如IF…或BEGIN语句)没有分句.文本值括在单引号(‘ ‘)内,而不是(“ “).过程只允许最后有一个出口..PL/SQL程序可以分为三个部分DECLARE部分用于变量、常量、函数、过程、Cursor.BEGIN部分包含PL/SQL块中要执行的代码用于程序处理,其中可以调用函数、过程.Exception 部分用于出错处理.下面我们再看一个例子:declarei number :=1;t number :=1;p number :=1;/*create table c_ny(c_t number,cou_t number);*/function aa(xx number)return number is /* define function*/tt number;ct number:=1;j number:=1;beginwhile j<=xx loopct:=ct+j;j:=j+1;end loop;return ct;end aa;begin/*create table c_nt(c_t number,cou_t number);*/commit;while i<=200 loopt:=t+i;i:=i+1;p:=aa(i); /* calling function*/insert into c_nt values(t,p);commit;end loop;end;/说明:1.在定义变量可以赋初值,赋初值有两种方法,一为上程序所示,另一种为如下所示:DeclareI number default 92;T number default 0;2.定义常量DeclareI constant number:=1;T constant number:=9;3.定义函数function function_name(parameter type)return type is …declare variantbegin……end function_name;在上面的例子中我们定义了一个函数aa,在begin模块部分引用了此函数aa().4.定义过程procedure procedure_name(parameter IN type) is…declare variantbegin……exception……end procedure_name;见下例:declare/*t_emp c_nt%rowtype;*/i number:=1;t number:=1;procedure te_t(t_t number) is /*定义一个函数*/begininsert into c_nt1(t_1) values(t_t);end te_t;beginfor i in 1..100 loopte_t(i);調用函數end loop;end;/5.定义Cursordeclare/*t_emp c_nt%rowtype;*/t_emp1 number;t_emp2 number;cursor tes_t1is select * from c_nt;beginopen tes_t1;delete from c_nt1;commit;loopfetch tes_t1 into t_emp1,t_emp2;exit when tes_t1%notfound;insert into c_nt1 values(t_emp1,t_emp2);aend loop;close tes_t1;commit;end;/我们在open 一个cursor时,可能会存在一种情况,即我们不需要cursor 中所有之记录,我们该如何处理:1.在定义一个cursor时,可以附带参数如下所示declaecursor c1(p_emp_id) isselect emp_no,emp_name from dept_no where emp_id = p_emp_id; demp_pt c1%rowtype;……beginopen c1(123);loopfetch c1(123) into demp_pt…2.在将cursor中之记录项转到变量中时进行控制,如下所示:declarecursor isselect empt_no,empt_name from dept_no;p_no number;p_name number;beginloopfetch c1 into (p_no,p_name);if condition1 then……end if end;用於到cursor中變量進行控制注意:因为PL/SQL 不支持I/O,所以程序所有结果都是放在数据档中.Delete from accts where status=’bad debt’If sql%rowcount>10 thenRaise out_of_bounds;End if;另:在声明一个变量时,PL/SQL 提供两种变量类型:%TYPE,%ROWTYPE.1.%TYPE使用%TYPE 时,可以有种用法:一用法见下例:declareBalance number(7,2);Minimum_balance balance%type:=10.00;在上例中,minimum_balance 数据类型为number(7,2)具默认值为10.00. 二用法见下例(将数据类型与table 中一column datatype 相对应起来,如果table 中column datatype 变更,则在运行时,上数据类型会自动的变换上):declaremy_dname empc.empto%type;2.%rowtype使用%rowtype 数据类型用于将table 和cursor 中一数据行相对起来. 见下例:DeclareCursor my_cursor is select sal+nvl(comm,0) salcomm,wages,ename from emp;My_rec my_cursor%rowtype; Begin Open my_cursor; loopFetch my_cursor into my_rec ; Exit when my_cursor%notfound; If my_rec.wages>200 thenInsert into temp values (null,my_rec.wages,my_rec.ename); End if;End loop;Close my_cursor;End;定義一個%rowtype 類型,與my_cursor 中記錄行對應. 將my_cursor 中之記錄寫到my_rec 變量中去.变量说明在PL/SQL 中包括以下几种常见的变量类型:CHAR-存储定长的ASCII 字符串,允许存储数字,文本文符等,最长可255个字符.VARCHAR2-存储变长的字符串,尽管伋按符串的最大长度来定义,但VARCHAR2和CHAR 的区别在于如果达不到定义的长度,下的空间不会自动的填写为空格,VARCHAR2最大可以放入2000个字符.DATE-实际上是存储时间信息的日期/时间戳,在使用日期时,应考虑怎样使用日期函数.有关日期函数的格式见函数说明部分.NUMBER-存储数值数据,包括整数和浮点数、数据范围可以从110 到3810 ,而且,你有很大的数据空间. BOOLENA-存储布尔值.它表示是/否,真/假,1/0之类的东西.LONG-这是一种文本字符串,其长度大于VARCHAR2字段的2000个字符.该类最多可储存2 GB 个字符,与原始二进制数据相比,它只能存储字符信息. RAW-用来存储操作系统使用的原始二进制数据,可用于存储像图像或声音记录这样的信息,但这种数据长度最长度只有255字节.LONG RAW-与LONG 类型等价,但存储二进制数据,最长可达2GB 个字节. BINARY_INTEGER-这个字段按计算器使用的二进制格式存储信息,从 -2 到2 -1. 另:PL/SQL 提位两种复合类型:TABLE 和RECORD1.TABLE要定义一个数组,你使用表类型定义语句,例如要定义Last_name 数组,可以使用下述语句:type last_name_list is table of varchar2(22)index by binary_integer;last_name last_name_list;当定义一个长类型时,就涉及到一个删除表的问题,PL/SQL 表不能用Delete 语句来删除,但可以将每一行空值如下所示:sal_tab(3):=null;另一种法是定义两个相同类型的表类型,如果要将另一表清空,只需将空表给要清空的表即可.如下所示.declaretype numtabtype is table of numberindex by binary_integer;sal_tab numbertype;empty_tab numbertype;begin127 31 31for I in 1..100 loopsal_tab(I):=I;end loop;….End;2.RECORDDeclareType deptrectype is record(deptno number(2),dname char(14),loc char(14),);dept_rec deptrectype;beginselect deptno,dname,loc into dept_rec from dept where deptno=30; ……end;与所有的编程语言一样,定义一个变量时,同样存在变量作用范围问题: 如下所示:declarex real;function function_name(variant type)return type isdeclarex char;begin…end function_name;……beginx:=expression1……end;如果想引用另一block 之变量时,可以加上block label,如下所示:<<outer>> declarebirthdate date;begin變量x 為 real 類型. 在此範圍之內變量x 為char 變量x 為real 類型 Block label;…declarebirthdate date; begin….If birthdate=outer.birthdate then ….End if;End;End outer;引用outer block塊所定義之變量.PL/SQL控制程序流IF …THEN…ELSIF…ELSE…….END IF IF … THENSTATMENT1;elseif…then…statment2elseif…then…statment3ELSESTATMENT4;end if;例:<<outer>>for ctr in 1..20 loop…<<inner>>for ctr in 1..10 loopif outer.ctr>ctr then……end loop inner;end loop outer;2.loop…exit…end looploopsequence_of_statement;…exit;end loop;例:loopfetch c1 into …exit when c1%notfound;…end loop;close c1;另:加loop label;例:<<outer>>loop……exit outer when…end loop;…end loop outer;3.while…loop…end loop结构如下所示:例while total<=25000 loop….Select sa1 into salary from emp where…Total:=total+salary;End loop;4.for…loop…例1.select count(empno) into emp_count from emp; for L in 1..emp_count loop…end loop;例2.<<outer>>for step in 1..25 loopfor step in 1..10 loop…if outer.step>15 then…end loop;end loop outer;cursor….loopdeclaresursor c1 is select ename from emp;name varchar2(100);beginfor p_c1_rec in c1 loopname := p_c1_rec.ename;end loop;要创建存储过程,可以使用下面的SQL和PL/SQL语句:CREATE OR REPLACE PROCEDURE PROCEDURE_NAME(parameter list)AS…BEGIN…(SQL AND PL/SQL COMMANDS)END;存储函数create or replace function function_name (parameter list) return type is….Begin……end;PackagePackage分为两部分:Specific and Body在包说明部分中,主要将此包中所含的过程和Function的调用参数说明清楚,如:CREATE OR REPLACE PACKAGE ZDL_JOB_PKGASPROCEDURE ZDL_INSERT_JOB(p_bkc_id in number,p_item_id in number,p_job_number in out varchar2,p_group_id in number,p_lead_day in number,p_load_type in number,P_STATUS_TYPE IN NUMBER,P_USER_ID IN NUMBER,P_JOB_TYPE IN VARCHAR2);PROCEDURE ZDL_UPDATE_JOB(P_BKC_ID IN NUMBER,P_GROUP_ID IN NUMBER,P_STATUS_TYPE IN NUMBER,P_USER_ID IN NUMBER);FUNCTION WIP_MASS_LOAD(P_GROUP_ID IN NUMBER,P_USER_ID IN NUMBER) RETURN NUMBER;PROCEDURE ZDL_PRE_UPDATE;FUNCTION ZDL_UPDATE_ORACLE_WIP(P_USER_ID IN NUMBER) RETURN NUMBER; FUNCTION ZDL_JOB_STATUS (P_JOB_NUMBER IN VARCHAR2) RETURN NUMBER; END ZDL_JOB_PKG;在包体部分,主要将包说明部分之过程及Function之代码写出来,如:CREATE OR REPLACE PACKAGE BODY ZDL_JOB_PKGASPROCEDURE ZDL_INSERT_JOB (p_bkc_id in number, p_item_id in number,p_job_number in out varchar2,p_group_id in number,p_lead_day in number,P_LOAD_TYPE IN NUMBER,P_STATUS_TYPE IN NUMBER,P_USER_ID IN NUMBER,P_JOB_TYPE IN VARCHAR2)is…………begin…………end ZDL_INSERT_JOB;PROCEDURE ZDL_UPDATE_JOB(P_BKC_ID IN NUMBER,P_GROUP_ID IN NUMBER,P_STATUS_TYPE IN NUMBER,P_USER_ID IN NUMBER)AS…………BEGIN…………END ZDL_UPDATE_JOB;FUNCTION WIP_MASS_LOAD(P_GROUP_ID IN NUMBER,P_USER_ID IN NUMBER) RETURN NUMBERas…………begin…………END WIP_MASS_LOAD;PROCEDURE ZDL_PRE_UPDATE IS…………begin…………end ZDL_PRE_UPDATE;FUNCTION ZDL_UPDATE_ORACLE_WIP(P_USER_ID IN NUMBER) RETURN NUMBER IS…………begin…………end ZDL_UPDATE_ORACLE_WIP;FUNCTION ZDL_JOB_STATUS (P_JOB_NUMBER IN VARCHAR2) RETURN NUMBER AS…………BEGIN…………END ZDL_JOB_STATUS;END ZDL_JOB_PKG;所需系统权限要为某表创建触发器,必须能改变这个表,因此不仅要拥有表,并且要具有这个表的 alter权限,或者具有alter any table系统权限,除此之外,必须有create triger系统权限,若要在另一个用户账号(account)(也称之为模式(schema))上创建触发器,就必具有create any trigger系统权限.所需表权限触发器可以引用的表并不是初始化触发事件的表.触发器触发器有十二种类型.一个触发器的类型由执行触发器的层次位置和触发事务的类型定义.行级触发器在某个事务中,行级触发器行执行,对于上述ledger表中记例子而言,触发器.行级触发器是在create trigger命令中通过用for each row 子句创建的.合法的触发器类型当两种不同类型之触发动作相结合时,有十二种可能的配置:Before insert 行级触发器before insert 语句级触发器after insert 行级触发器after insert 语句级触发器before update 行级触发器before update 语句级触发器after update 行级触发器after update 语句级触发器before delete 行级触发器before delete 语句级触发器after delete 行级触发器after delete 语句级触发器例:CREATE OR REPLACE TRIGGER "APPS"."ZDL_BKC_JOB_BODY_AFI"AFTER INSERT ON "APPS"."ZDL_BKC_JOB_BODY"REFERENCING OLD AS OLD NEW AS NEW FOR EACH ROWBEGINInsert into audit_tbl values(:new.id,:new……);UPDATE ZDL_BKC_JOB_HEAD SET UPDATE_DATE = SYSDATEWHERE ZDL_BKC_JOB_HEAD_ID = :NEW.ZDL_BKC_JOB_BODY_ID; END;。
--修改表的内容 DDLselect*from emp;--使用insert添加行insert into emp(ename,job,empno)values('WANGYI','DBA','2000');commit;--忽略列的的列表insert into emp values(3000,'ZHANG','DBA',1000,to_date('1990-07-15','yyyy-mm-dd'),2000,null,10); commit;--为列指定空值insert into emp values(3001,'ZHANG1','DBA',1000,to_date('1990-07-15','yyyy-mm-dd'),null,null,null); rollback;--在列值中使用单引号和双引号单引号里面的双引号表示单引号,例如插入 O’nal insert into emp(ename,empno)values('O''nal',2222);--复制一个表create table emp2 as select*from emp ;truncate table emp2;--从一个表向另外一个表复制行insert into emp2(empno,ename,sal)select empno,ename,sal from emp where empno=7369;rollback;insert into emp2 select*from emp where empno=7369;--使用update修改行update emp set ename='KKKK'where ename='WANGYI';--如果有两个WANG则两个都修改COMMIT;--returning 子句variable sk numberupdate emp set sal=3000where ename='KKKK'returning avg(sal)into: sk;----有问题--使用delete 删除行delete from emp where ename='KKKK';commit;--jdbc_lobselect*from emp;drop table JDBCTEST;SELECT*FROM jdbct1;alter table jdbct1 add(comm number(10));alter table jdbct1 drop(comm);--包:规范+包体--创建包规范create or replace package emp2_package as --指定包的用户可以使用的过程和函数的列表(同时包括变量,类型定义,游标)function func_sum(n number,m number) return number ;end emp2_package;--创建包体create or replace package body emp2_package as --实现声明中的方法 function func_sum(n number, m number) return number assums number;beginsums:=n+m;return sums;end func_sum;end emp2_package;--调用包中的函数和过程select emp2_package.func_sum(1,2) from dual;--获取包中函数和过程的信息select * from user_procedures ;--删除包drop package emp2_package;--触发器--创建触发器(简单的)create or replace trigger trigger_testbefore insert on emp2for each row when (new.sal>10000) --行级触发器begin-- raise_application_error('-20011','工资不能超过1W!');dbms_output.put_line('工资不能超过1W!');end trigger_test;--测试触发器insert into emp2(empno,ename,sal) values (9527,'gggg',11111);--创建触发器create or replace trigger trigger_test3after insert or update of sal on empfor each row when (new.sal>old.sal*0.75)begin--update emp set sal=:old.sal;dbms_output.put_line(:old.sal);end trigger_test3;--创建触发器(insert)create or replace trigger trigger_2before insert or update on empfor each row when (new.sal<100)begininsert into emp(empno,ename,sal) values(1111,'tttttt',:new.sal*10);end;--测试触发器insert into emp(empno,ename,sal) values(2312,'rrrr',1000);update emp set sal=9999 where ename='rrrr';select * from emp;select * from dual;--dual是oracle 中的一张虚表,用于测试函数用--大小写转换select upper('abc') from dual; --转换为大写select upper(DUMMY) from dual;select lower(DUMMY) from dual; --转换为小写select lower(dummy) from dual; --字段不区分大小写select initcap('this is a test') from dual; --单词首字母大写--字符操作select concat('aaa', 'bbb') from dual; --连接两个字符串select 'aaa' || 'bbb' from dual; --也可以用||连接字符串select substr('abcdef', 3) from dual; --拆分字符串。
plsql使用方法PL/SQL是Oracle数据库的一种编程语言,它是Procedural Language/Structured Query Language(过程性语言/结构化查询语言)的缩写。
PL/SQL的主要作用是用于开发Oracle数据库应用程序,它可以在Oracle数据库内部直接执行存储过程、函数以及触发器等。
PL/SQL的使用方法1、PL/SQL语言的基本元素:变量、常量、运算符、条件语句和循环语句。
2、PL/SQL程序的结构:声明段、执行段和异常处理段。
3、定义变量和常量:DECLAREx NUMBER := 10; --定义变量x,并初始化为10y CONSTANT NUMBER := 20; --定义常量y,并初始化为20 BEGINNULL;END;/4、条件语句:IF boolean_expression THEN--执行一系列语句ELSEIF boolean_expression THEN--执行一系列语句ELSE--执行一系列语句END IF;5、循环语句:FOR loop_index IN [REVERSE] lower_limit..upper_limit LOOP --执行一系列语句END LOOP;WHILE boolean_expression LOOP--执行一系列语句END LOOP;LOOP--执行一系列语句EXIT WHEN boolean_expression; END LOOP;6、异常处理:BEGIN--执行一系列语句EXCEPTIONWHEN exception_name1 THEN --处理异常方式1WHEN exception_name2 THEN --处理异常方式2WHEN OTHERS THEN--处理所有其他异常情况END;7、使用游标:DECLARECURSOR cursor_name ISSELECT ...FROM ...WHERE ...;local_variable datatype;BEGINOPEN cursor_name;LOOPFETCH cursor_name INTO local_variable;EXIT WHEN cursor_name%NOTFOUND;--执行一系列语句END LOOP;CLOSE cursor_name;END;8、使用存储过程和函数:CREATE [OR REPLACE] PROCEDURE procedure_name [ (parameter [,parameter]) ]ISvariable datatype;...BEGIN--执行一系列语句EXCEPTION--处理异常END;CREATE [OR REPLACE] FUNCTION function_name [ (parameter [,parameter]) ]RETURN datatypeISvariable datatype;...BEGIN--执行一系列语句EXCEPTION--处理异常END;PL/SQL是Oracle数据库中非常实用的编程语言,它可以帮助我们开发高效、可靠和可重用的应用程序。
SQL PL/SQL语法手册目录第一部分 SQL语法部分 ...................................................................................................... 错误!未定义书签。
一、CREATE TABLE语句 .................................................................................. 错误!未定义书签。
二、CREATE SEQUENCE语句 .............................................................................. 错误!未定义书签。
三、CREATE VIEW语句...................................................................................... 错误!未定义书签。
四、INSERT语句:.............................................................................................. 错误!未定义书签。
五、UPDATE语句:.............................................................................................. 错误!未定义书签。
六、DELETE语句:.............................................................................................. 错误!未定义书签。
plsql limit用法PL/SQL是Oracle数据库的编程语言之一,它扩展了SQL语言的功能,提供了更复杂和灵活的编程能力。
在PL/SQL中,LIMIT是一种用于限制结果集返回行数的关键字。
本文将逐步回答关于PL/SQL LIMIT用法的相关问题,并详细讨论其用法、语法和示例。
1. 什么是PL/SQL的LIMIT?在PL/SQL中,LIMIT是用于限制结果集返回行数的关键字。
它可以与SELECT语句一起使用,通常用于分页查询或返回固定数量的记录。
2. 如何在PL/SQL中使用LIMIT?在PL/SQL中,我们使用ROWNUM函数来实现LIMIT功能。
ROWNUM 是一个伪列,它返回从1开始递增的唯一序号。
下面是使用LIMIT的基本语法:sqlSELECT columnsFROM tableWHERE conditionsAND ROWNUM <= n;这里的n表示要返回的最大行数。
通过将ROWNUM与行数进行比较,我们可以限制返回的结果集行数。
3. 如何使用LIMIT进行分页查询?分页查询是使用LIMIT最常见的用法之一。
通过将LIMIT与OFFSET结合使用,我们可以分割结果集并按页返回数据。
下面是一个简单的分页查询示例:sqlSELECT *FROM employeesOFFSET (page_number - 1) * page_size ROWSFETCH NEXT page_size ROWS ONLY;这里的page_number表示要查询的页数,page_size表示每页返回的行数。
4. 如何使用LIMIT返回Top N个记录?利用LIMIT,我们可以轻松地返回结果集中前N个记录。
下面是一个返回前N个记录的示例:sqlSELECT *FROM employeesWHERE ROWNUM <= NORDER BY salary DESC;在这个例子中,我们首先根据salary字段降序排序,然后将结果集限制在前N个记录。
plsql insert语句PL/SQL是Oracle公司开发的一种过程化编程语言,其具有丰富的语言特性和基础函数,可以用于开发存储过程、触发器、函数等数据库操作管理模块。
在PL/SQL中,INSERT语句用于向表中插入数据,下面我将介绍PL/SQL INSERT语句的语法和用法。
PL/SQL INSERT语句的语法如下:INSERT INTO table_name(column1, column2, ……)VALUES (value1, value2, ……);其中,table_name指定要插入数据的表名,column1, column2, ……指定要插入数据的列名,VALUES关键字后面的value1, value2, ……指定要插入的具体数据。
在实际使用中,我们可以使用变量或者直接传入值来构造INSERT语句,具体示例如下:-- 使用变量来构造INSERT语句DECLAREv_empno NUMBER(4) := 1001;v_ename VARCHAR2(10) := 'John';v_job VARCHAR2(9) := 'Manager';v_hiredate DATE := to_date('20220101','YYYYMMDD');v_sal NUMBER(7,2) := 5000.25;BEGININSERT INTO emp(empno,ename,job,hiredate,sal)VALUES (v_empno,v_ename,v_job,v_hiredate,v_sal);END;-- 直接传入值来构造INSERT语句INSERT INTO emp(empno,ename,job,hiredate,sal)VALUES(1002,'Kate','Clerk',to_date('20220301','YYYYMMDD'),2500.75);在以上示例中,第一个INSERT语句通过DECLARE声明变量,并在VALUES中使用变量来构建INSERT语句,第二个INSERT语句直接在VALUES中传入值来构建INSERT语句。
PL/SQL程序设计目录第一章PL/SQL 程序设计简介 (4)§1.2SQL与PL/SQL (4)§1.2.1 什么是PL/SQL? (4)§1.2.1 PL/SQL的好处 (4)§1.2.2 PL/SQL 可用的SQL语句 (5)§1.3运行PL/SQL程序 (5)第二章PL/SQL块结构和组成元素 (6)§2.1PL/SQL块 (6)§2.2PL/SQL结构 (6)§2.3标识符 (6)§2.4PL/SQL变量类型 (7)§2.4.1 变量类型 (7)§2.4.2 复合类型 (9)§2.4.3 使用%ROWTYPE (11)§2.4.4 LOB类型* (11)§2.4.5 BIND 变量 (12)§2.4.6 INDEX BY TABLES (12)§2.4.7 数据类型的转换* (13)§2.5运算符和表达式(数据定义) (14)§2.5.1 关系运算符 (14)§2.5.2 一般运算符 (14)§2.5.3 逻辑运算符 (14)§2.6变量赋值 (14)§2.6.1 字符及数字运算特点 (15)§2.6.2 BOOLEAN 赋值 (15)§2.6.3 数据库赋值 (15)§2.6.4 可转换的类型赋值 (15)§2.7变量作用范围及可见性 (16)§2.8注释 (17)§2.9简单例子 (17)§2.9.1 简单数据插入例子 (17)§2.9.2 简单数据删除例子 (18)第三章PL/SQL流程控制语句 (19)§3.1条件语句 (19)§3.2CASE表达式 (20)§3.3循环 (20)§3.3标号和GOTO (22)§3.4NULL语句 (22)第四章游标的使用 (24)§4.1.1 处理显式游标 (24)§4.1.2 处理隐式游标 (28)§4.1.3 关于NO_DATA_FOUND 和%NOTFOUND的区别 (28)§4.1.4 游标修改和删除操作 (28)§4.2游标变量 (29)§4.2.1 声明游标变量 (29)§4.2.2 游标变量操作 (30)§4.2.3 游标变量应用.......................................................................... 错误!未定义书签。
第五章异常错误处理 (33)§5.1异常处理概念 (33)§5.1.1 预定义的异常处理 (33)§5.1.2 非预定义的异常处理 (34)§5.1.3 用户自定义的异常处理 (35)§5.1.4 用户定义的异常处理 (36)§5.2异常错误传播 (38)§5.2.1 在执行部分引发异常错误 (38)§5.2.2 在声明部分引发异常错误 (38)§5.3异常错误处理编程 (39)§5.4在PL/SQL中使用SQLCODE,SQLERRM (39)第六章存储函数和过程 (41)§6.1引言 (41)§6.2创建函数 (41)§6.3存储过程 (44)§6.3.1 创建过程 (44)§6.3.2 调用存储过程 (46)§6.3.3 开发存储过程步骤 (50)§6.3.4 与过程相关数据字典 (51)第七章包的创建和应用 (53)§7.1引言 (53)§7.2包的定义 (53)§7.3包的开发步骤 (54)§7.4包定义的说明 (54)§7.5子程序重载 (62)§7.6删除过程、函数和包 (64)§7.7包的管理 (64)第八章触发器 (65)§8.1触发器类型 (65)§8.1.1 DML触发器 (65)§8.1.2 替代触发器 (65)§8.1.3 系统触发器 (65)§8.2.1 触发器触发次序 (67)§8.2.2 创建DML触发器 (67)§8.2.3 创建替代(INSTEAD OF)触发器 (68)§8.2.3 创建系统事件触发器 (69)§8.2.4 系统触发器事件属性 (70)§8.2.5 使用触发器谓词 (71)§8.2.6 重新编译触发器 (71)§8.3删除和使能触发器 (71)§8.4触发器和数据字典 (72)§8.5数据库触发器的应用举例 (72)§8.6数据库触发器的应用实例 (82)第九章ORACLE提供的常用包 (86)§9.1使用DBMS_SQL软件包 (86)§9.2使用EXECUTE IMMEDIATE语句 (87)§9.3使用DBMS_DDL软件包 (88)§9.4使用DBMS_JOB软件包编制工作调度 (89)§9.5使用DBMS_OUTPUT软件包 (92)§9.6使用UTL_FILE软件包 (92)第一章PL/SQL 程序设计简介PL /SQL是一种高级数据库程序设计语言,该语言专门用于在各种环境下对ORACLE数据库进行访问。
由于该语言集成于数据库服务器中,所以PL/SQL代码可以对数据进行快速高效的处理。
除此之外,可以在ORACLE数据库的某些客户端工具中,使用PL/SQL语言也是该语言的一个特点。
本章的主要内容是讨论引入PL/SQL语言的必要性和该语言的主要特点,以及了解PL/SQL语言的重要性和数据库版本问题。
还要介绍一些贯穿全书的更详细的高级概念,并在本章的最后就我们在本书案例中使用的数据库表的若干约定做一说明。
本章主要重点:●PL/SQL概述●PL/SQL块结构●PL/SQL流程●运算符和表达式●游标●异常处理●数据库存储过程和函数●包●触发器§1.2 SQL与PL/SQL§1.2.1 什么是PL/SQL?PL/SQL是Procedure Language & Structured Query Language 的缩写。
ORACLE 的SQL是支持ANSI(American national Standards Institute)和ISO92 (International Standards Organization)标准的产品。
PL/SQL是对SQL语言存储过程语言的扩展。
从ORACLE6以后,ORACLE的RDBMS附带了PL/SQL。
它现在已经成为一种过程处理语言,简称PL/SQL。
目前的PL/SQL包括两部分,一部分是数据库引擎部分;另一部分是可嵌入到许多产品(如C语言,JAVA语言等)工具中的独立引擎。
可以将这两部分称为:数据库PL/SQL和工具PL/SQL。
两者的编程非常相似。
都具有编程结构、语法和逻辑机制。
工具PL/SQL另外还增加了用于支持工具(如ORACLE Forms)的句法,如:在窗体上设置按钮等。
本章主要介绍数据库PL/SQL内容。
§1.2.1 PL/SQL的好处§1.2.1.1 有利于客户/服务器环境应用的运行对于客户/服务器环境来说,真正的瓶颈是网络上。
无论网络多快,只要客户端与服务器进行大量的数据交换。
应用运行的效率自然就回受到影响。
如果使用PL/SQL进行编程,将这种具有大量数据处理的应用放在服务器端来执行。
自然就省去了数据在网上的传输时间。
§1.2.1.2 适合于客户环境PL/SQL由于分为数据库PL/SQL部分和工具PL/SQL。
对于客户端来说,PL/SQL可以嵌套到相应的工具中,客户端程序可以执行本地包含PL/SQL部分,也可以向服务发SQL 命令或激活服务器端的PL/SQL程序运行。
§1.2.2 PL/SQL 可用的SQL语句PL/SQL是ORACLE系统的核心语言,现在ORACLE的许多部件都是由PL/SQL写成。
在PL/SQL中可以使用的SQL语句有:INSERT,UPDATE,DELETE,SELECT INTO,COMMIT,ROLLBACK,SAVEPOINT。
提示:在PL/SQL中只能用SQL语句中的DML 部分,不能用DDL 部分,如果要在PL/SQL中使用DDL(如CREATE table 等)的话,只能以动态的方式来使用。
●ORACLE 的PL/SQL 组件在对PL/SQL 程序进行解释时,同时对在其所使用的表名、列名及数据类型进行检查。
●PL/SQL 可以在SQL*PLUS 中使用。
●PL/SQL 可以在高级语言中使用。
●PL/SQL可以在ORACLE的开发工具中使用。
●其它开发工具也可以调用PL/SQL编写的过程和函数,如Power Builder 等都可以调用服务器端的PL/SQL过程。
§1.3 运行PL/SQL程序PL/SQL程序的运行是通过ORACLE中的一个引擎来进行的。
这个引擎可能在ORACLE的服务器端,也可能在ORACLE 应用开发的客户端。
引擎执行PL/SQL中的过程性语句,然后将SQL语句发送给数据库服务器来执行。
再将结果返回给执行端。
第二章PL/SQL块结构和组成元素§2.1 PL/SQL块PL/SQL程序由三个块组成,即声明部分、执行部分、异常处理部分。
PL/SQL块的结构如下:DECLARE/* 声明部分: 在此声明PL/SQL用到的变量,类型及游标,以及局部的存储过程和函数*/ BEGIN/* 执行部分: 过程及SQL 语句, 即程序的主要部分*/EXCEPTION/* 执行异常部分: 错误处理*/END;其中执行部分是必须的。
PL/SQL块可以分为三类:1. 无名块:动态构造,只能执行一次。
2. 子程序:存储在数据库中的存储过程、函数及包等。
当在数据库上建立好后可以在其它程序中调用它们。
3. 触发器:当数据库发生操作时,会触发一些事件,从而自动执行相应的程序。
§2.2 PL/SQL结构●PL/SQL块中可以包含子块;●子块可以位于PL/SQL中的任何部分;●子块也即PL/SQL中的一条命令;§2.3 标识符PL/SQL程序设计中的标识符定义与SQL 的标识符定义的要求相同。