plsql笔记

plsql笔记
plsql笔记

PLSQL(Procedural Language/SQL)

在甲骨文数据库管理方面,plsql是对结构化查询语言(SQL)的过程语言扩展。

在标准的SQL的基础上增加了过程化处理的语言()。

目的:

联合数据库语言和过程语言,用于数据库的编程语言。

与数据库有关的数据库编程语言:

ODBC 微软(用C来编程)

JDBC SUN

++++++++++++++++++++++++++++++++++++++++++++++++++++++

plsql的基本单位叫做一个区段,由三个部份组成:

一个申明部份,

一个可执行部份

异常处理部分。

因为plsql允许混合SQL申明和过程结构,因此可以在将申明发送到甲骨文系统去执行之前使用plsql 区段和副程序来组合SQL申明,没有plsql,甲骨文需要就每次处理SQL申明,在网络环境中,这将影响交通流量,而且增加响应时间。plsql区段只被编译一次并且以可运行的形式储存,以降低响应时间。++++++++++++++++++++++++++++++++++++++++++++++++++

PL/SQL的优点

从版本6开始PL/SQL就被可靠的整合到ORACLE中了,一旦掌握PL/SQL的优点以及其独有的数据管理的便利性,那么你很难想象ORACLE缺了 PL/SQL的情形。PL/SQL 不是一个独立的产品,他是一个整合到ORACLE 服务器和ORACLE工具中的技术,可以把PL/SQL看作ORACLE服务器内的一个引擎,sql语句执行者处理单个的sql语句,PL/SQL引擎处理PL/SQL程序块。当PL/SQL程序块在PL/SQL引擎处理时,ORACLE服务器中的SQL语句执行器处理pl/sql程序块中的SQL语句。

PL/SQL的优点如下:

1、PL/SQL是一种高性能的基于事务处理的语言,能运行在任何ORACLE环境中,支持所有数据处理

命令。通过使用PL/SQL程序单元处理SQL的数据定义和数据控制元素。

2、PL/SQL支持所有SQL数据类型和所有SQL函数,同时支持所有ORACLE对象类型

3、PL/SQL块可以被命名和存储在ORACLE服务器中,同时也能被其他的PL/SQL程序或SQL命令调

用,任何客户/服务器工具都能访问PL/SQL程序,具有很好的可重用性。

4、可以使用ORACLE数据工具管理存储在服务器中的PL/SQL程序的安全性。可以授权或撤销数据

库其他用户访问PL/SQL程序的能力。

5、PL/SQL代码可以使用任何ASCII文本编辑器编写,所以对任何ORACLE能够运行的操作系统都是

非常便利的

6、对于SQL,ORACLE必须在同一时间处理每一条SQL语句,在网络环境下这就意味作每一个独立、

的调用都必须被oracle服务器处理,这就占用大量的服务器时间,同时导致网络拥挤。而PL/SQL 是以整个语句块发给服务器,这就降低了网络拥挤。

+++++++++++++++++++++++++++++++++++++++++++

PLSQL是SQL的扩展

------- 变量和类型

------- 控制结构

------- 过程与函数

------- 对象类型与方法

PL/SQL块结构

PL/SQL是一种块结构的语言,组成PL/SQL程序的单元是逻辑块,一个PL/SQL 程序包含了一个或多个逻辑块,每个块都可以划分为三个部分。与其他语言相同,变量在使用之前必须声明,PL/SQL提供了独立的专门用于处理异常的部分。

++++++++++++++++++++++++++++++++++++++++++++

下面描述了PL/SQL块的不同部分:

A 声明部分(Declaration section)

声明部分包含了变量和常量的数据类型和初始值。这个部分是由关键字DECLARE开始,如果不需要声明变量或常量,那么可以忽略这一部分;需要说明的是游标的声明也在这一部分。

B 执行部分(Executable section)

执行部分是PL/SQL块中的指令部分,由关键字BEGIN开始,所有的可执行语句都放在这一部分,其他的PL/SQL块也可以放在这一部分。

C 异常处理部分(Exception section)

这一部分是可选的,在这一部分中处理异常或错误,对异常处理的详细讨论我们在后

++++++++++++++++++++++++++++++++++++++++++++++

PL/SQL块语法结构

[DECLARE] (声明区)

---declaration statements

BEGIN (执行区)

---executable statements

[EXCEPTION] (异常处理)

---exception statements

END

注意点:

1、PL/SQL块中的每一条语句都必须以分号结束

2、SQL语句可以使多行的,但分号表示该语句的结束

3、一行中可以有多条SQL语句,他们之间以分号分隔。

4、每一个PL/SQL块由BEGIN或DECLARE开始,以END结束。

5、注释由--标示。

++++++++++++++++++++++++++++++++++++++++++++++++++++

简单的列子:

Begin

Dbms_output.put_line('hello world');

End;

+++++++++++++++++++++++++++++++++++++++++++++++++++++

PL/SQL开发环境:

Sqlplus

GUI Develop tools

SQL Navigator

SQL programmer

++++++++++++++++++++++++++++++++++++++++++++++++++++++

PL/SQL字符集(大小写不敏感)

字母:A -- Z , a -- z

数字:0 -- 9

空白:tab space 回车

符号:+ - * / <> ; : @ " % // & -- /* */

+++++++++++++++++++++++++++++++

标识符:(用来给对象命令)变量,游标,类型,子程序

命名规则:

字母开头

后面可跟任意:(非空格字符)数字,$,下划线,#

最长长度为30个字符,不能有保留字除非用双引号引起

++++++++++++++++++++++++++++++++

一些符号:

分界符: + - * / ** (2**3 即是2的3次方)

= ,> , < ,<= ,>= 不等于(三个): <> != ^=

:= (赋值)

|| 字符串的连接 ------------‘ABC’||‘RR’结果为: ABCRR

(); % ‘。”:

《标号》 ------------------成对出现,里面写标号

表示空格

-- (单行注释) /**/ 多行注释

文字:

字符型:(单引号引起) 'AFC' '345'

’Tom''s pen' (中间的两个单应) ------------结果是Tom's pen

数字类型文字:

123、-7、+12、0、-27。1、1.345E7、9.28E-3

布尔类型文字:

可能取值:TRUE FALSE NULL

++++++++++++++++++++++++++++

Set serveroutput on

Set serveroutput on 该命令会在sqlplus 的控制台显示我们要显示的语句,而不只是在内存里(若不写则只在内存中操作)

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

PLSQL文件的执行操作:

进入SQLPLUS控制台 --------命令:sqlplus 用户名/密码

切换到SHELL环境用 --------命令:!

编辑 XXX.sql 文件(在VI中)

切换到 SQLPLUS环境 --------命令:EXIT

执行XXX.Sql 文件 --------命令:@XXX.Sql

--------命令: /

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

数据类型

A 标量类型:数字,字符,布尔,日期

B 组合类型: RECORD TABLE

C 参考类型: REF CURSOR ,REFOBJECT_TYPE

D LOB

+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 标量类型

标量(scalar)数据类型没有内部组件,他们大致可分为以下四类:

number

character

date/time

Boolean

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 举例:

表1显示了数字数据类型;

表2显示了字符数据类型;

表3显示了日期和布尔数据类型。

+++++++++++++++++++

表1显示了数字数据类型

Datatype(数据类型): BINARY_INTEGER (保存整数)

Range(范围):-214748-2147483647

Subtypes(子类型):NATURAL NPOSITIVE POSITIVEN SIGNTYPE

description(描述):

用于存储单字节整数。

要求存储长度低于NUMBER值。

用于限制范围的子类型(SUBTYPE):

NATURAL:用于非负数

POSITIVE:只用于正数

NATURALN:只用于非负数和非NULL值

POSITIVEN:只用于正数,不能用于NULL值

SIGNTYPE:只有值:-1、0或1.

--------------------

Datatype(数据类型):NUMBER(保存整数,也可以保存小数)

Range(范围): 1.0E-130-9.99E125

Subtypes(子类型):DEC DECIMAL DOUBLE PRECISION FLOAT INTEGERIC INT NUMERIC REAL SMALLINT

description(描述):

存储数字值,包括整数和浮点数。可以选择精度和刻度方式,

语法:number[([,])]缺省的精度是38,scale是0.

+++++++++++++++++++++++

number(

,)

精度p取值范围1~38

有效位s取值范围-84~127

最高整数位数=p-s

s正数,小数点右边指定位置开始四舍五入

s负数,小数点左边指定位置开始四舍五入

s是0或者未指定,四舍五入到最近整数

当p小于s时候,表示数字是绝对值小于1的数字,且从小数点右边开始的前s-p 位必须是0,保留s位小数。

NUMBER, 123.3333 197.9333 ------> 123.3333 197.9333

NUMBER(5,2) 123.3333 197.9333 ------> 123.33 197.93

NUMBER(5,-2) 123.3333 197.9333 ------> 100 200

NUMBER(5,0) 123.3333 197.9333 ------> 123 198

NUMBER(5) 123.3333 197.9333 ------> 123 198

NUMBER(2,5) -0.0003 0.00012567 ------> -0.00030 0.00013

----------------------

Datatype(数据类型):PLS_INTEGER

Range(范围): -2147483647-2147483647

Subtypes(子类型):

description(描述):

与BINARY_INTEGER基本相同,但采用机器运算时,PLS_INTEGER提供更好的性能。

+++++++++++++++++++++++++++++++++++++

表2 字符数据类型

Datatype(数据类型):

Range(范围):

Subtypes(子类型):

description(描述):

CHAR --------- 最大长度32767字节

CHARACTER ------------ 存储定长字符串,如果长度没有确定,缺省是1

LONG ---------------- 最大长度2147483647字节存储可变长度字符串

RAW -------------- 最大长度32767字节,用于存储二进制数据和字节字符串,当在两个

数据库之间进行传递时,RAW数据不在字符集之间进行转换。

LONGRAW --------- 最大长度2147483647

与LONG数据类型相似,同样他也不能在字符集之间进行转换。

ROWID ------------- 18个字节

与数据库ROWID伪列类型相同,能够存储一个行标示符

可以将行标示符看作数据库中每一行的唯一键值。

VARCHAR2 ------------ 最大长度32767字节

STRINGVARCHAR ------------- 与VARCHAR数据类型相似,存储可变长度的字符串。

++++++++++++++++++++++++++++++++

字符类型:char varchar varchar2 string 等

Char

A char(5)

A='xy' 为 false ,因为A后面还有空格。

Varchar

A varchar(100)

A='xy' 为true,100 是A的最大长度,不可以超过该长度。

声明方法与VARCHAR相同

++++++++++++++++++++++++++++++++++

表3 DATE和BOOLEAN

Datatype(数据类型):BOOLEAN

Range(范围): TRUE/FALSE

Subtypes(子类型):

description(描述):存储逻辑值TRUE或FALSE,无参数

-------------------------

Datatype(数据类型): DATE

Range(范围): 01/01/4712 BC

Subtypes(子类型):

description(描述):

存储固定长的日期和时间值,日期值中包含时间

---------------代码---------------

DECLARE

--v_Date DATE;

v_Date VARCHAR2(20);

BEGIN

v_Date := to_char(sysdate, 'yyyy-mm-dd');

DBMS_OUTPUT.PUT_LINE(v_Date);

END;

------------- 变量的声明 ---------

格式:

Var_name type [CONSTANT] [NOT NULL] [=value];

变量名 + 类型;

在声明常量的时候格式为:变量名 + CONSTANT+ 类型;

在用NOT NULL 后,必须给变量初始化

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ PLSQL 块结构:

DECLARE --- 可选

变量声明定义

BEGIN ---- 必选

SQL 和PLSQL 语句

EXCEPTION ---- 可选

错误处理

END;---- 必选

实例:

Declare

变量名 + 类型

vjob varchar(9);

v_count number:=0;

vtotal date:=sysdate +7;

c_tax constant number(3,2):=8.25;

v_valid boolean not null:=true;

begin

select sysdate into vtotal from dual;

end;

--------------------------------------------------------------------------------------

变量一般都在PL/SQL块的声明部分声明,PL/SQL是一种强壮的类型语言,这就是说在引用变量前必须首先声明,要在执行或异常处理部分使用变量,那么变量必须首先在声明部分进行声明。

声明变量的语法如下:

+++++++++++++++++++++++++

语法:变量名 + 类型 Var_name [constan] datatype [not null] [:= value]

注意:可以在声明变量的同时给变量强制性的加上NOT NULL约束条件,此时变量在初始化时必须赋值。

例: v_num number := 45; -------变量v_num变量值为45

v_resc VARCHAR(50); --------变量v_resc变量值为null

++++++++++++++++++++++++

%TYPE的属性

%TYPE:

声明一个变量使之与数据库某个列的定义相同或与另一个已经定义过的变量相同.

例如:

v_last_name s_https://www.360docs.net/doc/4c803303.html,st_name%TYPE;

v_first_name s_emp.first_name%TYPE

++++++++++++++++++++++++

声明布尔类型的变量

1 只有TRUE、FALSE、NULL可以赋值给BOOLEAN变量

2 此变量可以接逻辑运算符NOT、AND、OR。

3、变量只能产生TRUE、FALSE、NULL。

实例:

VSAL1:=50000;

VSQL2:=60000;

VCOMMSAL BOOLEAN:=(VSAL1

++++++++++++++++++++++++++

LOB 类型的变量

共有CLOB、BLOB、BFILE、NCLOB几种

Blob:存储二进制;

Clob: 存储大字符

+++++++++++++++++++++++++++

RECORD类型(自己定义类型)

步骤:1、定义类型

2、声明变量

实例:

DECLARE

TYPE t_emp IS RECORD( -----------定义类型

Id s_emp.id%TYPE,

Fname s_emp.first_name%TYPE);

v_emp t_emp ; -----------声明变量

BEGIN

SELECT id ,first_name INTO v_emp.Id,v_emp.Fname

FROM s_emp WHERE id=1;

END;

++++++++++++++++++++++++++++++++

%ROWTYPE 类型

%ROWTYPE

返回一个基于数据库表定的类型。(注意:与TABLE类型的区别)

(返回一行)

实例:

DECLARE

v_emp student%ROWTYPE;

BEGIN

SELECT * INTO v_emp from s_emp

WHERE id=1;

DBMS_OUT.PUT_LINE(v_emp.First_name||' '||v_emp.dept_id||' '||v_emp.Salary);

END;

+++++++++++++++++++++++++++++++++++

TABLE类型:

PL/SQL tables are PL/SQL’s way of providing arrays. Arrays are like temporary

tables in memory and thus are processed very quickly. It is important for you to realize that they are not database tables, and DML statements cannot be issued against them. This type of table is indexed by a binary integer counter (it cannot be indexed by another type of number) whose value can be referenced using the number of the index. Remember that PL/SQL tables exist in memory only, and therefore don’t exist in any persistent way, disappearing after the session ends.

A PL/SQLTABLE DECLARATION

There are two steps in the declaration of a PL/SQL table:

First, you must define the table structure using the TYPE statement.

Second, once a tabletype is created, you then declare the actual table.

------------------------------------------------------------------------

实例:

DECLARE

TYPE t_emp IS TABLE of s_emp%ROWTYPE INDEX BY BINARY_INTEGER;

v_emp t_emp;

BEGIN

Select * into v_emp(100) from s_emp where id=1;

-------------- 放到第100的位置上

Select * into v_emp(10) from s_emp where id=2;

------------ 放到第10的位置上

DBMS_OUTPUT.PUT_LINE(v_emp(100).first_name);

DBMS_OUTPUT.PUT_LINE(v_emp(10).first_name);

END;

++++++++++++++++++++++++++++++++++++++++

变量的作用域与可见性

《outer》 ------------- 标号

DECLARE

v_num number :=10;

BEGIN

DBMS_OUTPUT.PUT_LINE('v_num:'||v_num);

《inner》 --------------------- 标号

DECLARE

v_num number :=20; /* v_inner number :=100; */

BEGIN

DBMS_OUTPUT.PUT_LINE('v_num:'||v_num); 结果: 20

DBMS_OUTPUT.PUT_LINE('v_num:'||outer.v_num); 结果:10

END;

/* DBMS_OUTPUT.PUT_LINE('v_inner:'||v_inner); */ 在外面不可访问内部变量END;

+++++++++++++++++++++++++++++++++++++++

PL/SQL控制语句

if语句

IF boolean_expresion THEN

ELSE IF boolean_expresion THEN

ELSE

..........

END IF;

条件为NULL 与 FALSE 相同;

Expression isNULL 用来判断表达式是否为NULL

Expression is not null 用来判断表达式是否不为NULL

LOOP循环

LOOP

.....

IF boolean_expression THEN

EXIT;

END IF;

END LOOP;

Loop

......

Exit when boolean_expression;

Exit loop;

WHILE 循环

WHILE boolean_expression LOOP

END LOOP;

FOR 循环

FOR loop_counter IN REVERSE low_bound high_lownd

LOOP.....

END LOOP;

----------- 有REVERSE 循环从高位开始,没有则从低位开始

实例:

DECLARE

CURSOR cur_emp IS SELECT a.id From s_emp a ,s_dept b where

b.id=a.Dept_id AND b.Region_id=1;

BEGIN

For v_emp IN cur_emp LOOP ----- v_emp不需要声明

DMS_OUTPUT.PUT_LINE(v_emp.Id);

END LOOP;

CLOSE cur_emp;

GOTO语句

只能由内部的语句块跳往外部块,注意要设置标签。

空语句NULL

目的是为了补充语句的完整性

注意:DML(insert / update / select)和事物控制语句在PLSQL中可以直接用。

ORACLE中有内置DBMS_SQL包,可以执行动态的SQL。

本地动态SQL:用EXECUTE IMMEDIATE命令来执行SQL的方式。

+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 本地动态SQL执行DDL语句

DECLARE

v_Str VARCHAR2(400);

BEGIN

v_Str := 'create table temp(id number, col1 varchar2(20))';

EXECUTE IMMEDIATE v_Str;

END;

+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ SQL语句:

1、数据控制语句(Data Manipulation Language)DML

Select insert delete set transaction

2、数据定义语句(data definition language)

Drop create alter grant revoke

3、事物控制(transaction control)

Commit roolback savepoint

4、session control

Alert session set role

5、系统控制

Alert system

6、EQL

Connect declare cursor allocate

注意:

1、只有DML SQL可以直接在PL/SQL中使用

2、使用ORACLE 内置的DBMS_SQL包,可以使用动态的SQL语句

3、动态SQL语句是在运行时生成一个SQL的事,将该串提交给DBMS_SQL包来执行。+++++++++++++++++++++++++++++++++

游标(cursor)

用于提取多行数据集。分为隐式游标和显式游标,显式游标专门用于查寻结果的处理(即处理select语句)。

++++++++++++++++++++++++++++++++++

游标的使用:

1、声明游标

2、为查询打开游标

3、将结果提取出来,存入PL/SQL变量中

4、关闭游标

注意点:1、由于游标处理的是查询结果集,则必定与固定的查询语句绑定在一起,并且这里的查询语句中不可以有into语句。

2、若游标的声明中要使用到一个变量,则必须在声明游标前先声明该变量。

++++++++++++++++++++++++++

游标的声明格式

Cursor (游标的名字) IS select * from s_emp(某张表的表名) where id = ...; ------------------------------------------------------------

实例:

DECLARE

v_emp s_emp%ROWTYPE;

v_deptid s_emp.Dept_id%TYPE :=31;

Cursor cur_emp IS select * from s_emp where dept_id = v_dptid;

------- 声明游标

BEGIN

/*若要改变v_dptid的值必须在打开游标前赋值

如:v_dptid :=33;

*/

OPEN cur_emp; ------ 打开游标(会将游标指向结果集的顶部,

在OPEN游标的时候才真正的去执行SELECT语句)FETCH cur_emp INTO v_emp; ---- 提取结果(每FETCH后游标会自动指向后面一条数据,

若数据不只一条,可以重复提取)

DBMS_OUTPUT.PUT_LINE(v_emp.First_name||v_emp.dept_id);

CLOSE cur_emp; --------- 关闭游标(一旦关闭了游标就不可以FETCH,

这样会出错,但可以OPEN这样如重新打开来查询)END;

+++++++++++++++++++++++++++++++++++

带参数的游标

DECLARE

v_emp s_emp%ROWTYPE;

v_did s_dept%TYPE;

CURSOR cur_emp (p_did,s_dept.Id%TYPE) IS select * from s_emp where

---若多个参数就用逗号分隔

dept_id=p_did;

BEGIN

Open cur_eno(31);

LOOP

FECTH cur_emp INTO v_emp;

EXIT WHEN cur_emp%NOTFOUND;

DBMS_OUTPUT.PUT_LINE(....);

END LOOP;

CLOSE cur_emp;

END;

+++++++++++++++++++++++++++++++++++++

DECLARE

v_emp s_emp%ROWTYPE;

CURSOR cur_emp(p_did s_emp.dept_id%TYPE) IS SELECT * FROM s_emp WHERE dept_id = p_did; BEGIN

-------------p_did s_emp.dept_id%TYPE 参数的类型若为number varchar2时只给类型,不需要给约束如number(7),varchar(10),会出错。

OPEN cur_emp(31);

LOOP

FETCH cur_emp INTO v_emp;

EXIT WHEN cur_emp%NOTFOUND;

DBMS_OUTPUT.PUT_LINE(v_emp.id||' '||v_emp.first_name);

END LOOP

CLOSE cur_emp;

FOR v_emp IN cur_emp(31) LOOP

DBMS_OUTPUT.PUT_LINE(v_emp.id||' '||v_emp.first_name);

END LOOP;

END;

++++++++++++++++++++

游标的属性

%NOTFOUND :来检查上次FETCH语句的结果:(若上次FETCH提取到了数据了为false,若没有提取到则为true)

%FOUND:(同%NOTFOUND相反)

%ISOPEN:判断游标是否打开

%ROWCOUNT:指当前游标的指针位移量

游标的属性的使用:游标明:%属性名

实例

DECLARE

v_deptId s_emp.dept_id%TYPE := 31;

C URSOR cur_emp IS SELECT * FROM s_emp WHERE dept_id = v_deptId;

BEGIN

F OR v_emp IN cur_emp LOOP ------------ 用FOR语句游标的打开,取值,关闭都不需要

我们来写(而且v_emp不需要声明,它会根

据游标来自动定义)

D BM _OUTPUT.PUT_LINE(v_emp.id||' '||v_emp.first_name);

E ND LOOP;

END;

+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 异常

声明格式:异常名 + EXCEPTION

抛异常格式:RAISE + 异常名

处理异常格式:WHEN + 异常名 + THEN

+++++++++++++++++++++++++

DECLAREE

E_Toomarystudents EXCEPTION; -------------- 声明异常

BEGIN

RAISE E_Toomarystudents; ------------- 抛出异常

EXCEPTION

WHEN E_Toomarystudents THEN -------------- 处理异常

END;

+++++++++++++++++++++++++

实例

DECLARE

e_MyException EXCEPTION; --------- 自定义异常

v_emp s_emp%ROWTYPE;

BEGIN

S ELECT * INTO v_emp FROM s_emp WHERE id = 17;

I F v_emp.salary < 1000 THEN RAISE e_MyException;

E ND IF;

D BMS_OUTPUT.PUT_LINE('emp: '||v_emp.id||' '||v_emp.salary);

EXCEPTION

W HEN NO_DATA_FOUND THEN DBMS_OUTPUT.PUT_LINE('emp: no data in emp');

W HEN e_MyException THEN DBMS_OUTPUT.PUT_LINE('emp: salary is too low');

U PDATE s_emp SET salary = 1000 WHERE id = v_emp.id;

W HEN OTHERS THEN DBMS_OUTPUT.PUT_LINE('emp: other exception');

END;

++++++++++++++++++++++++++++++++++++++++++++

PL/SQL块的命名和匿名

PL/SQL程序块可以是一个命名的程序块也可以是一个匿名程序块。

匿名程序块可以用在服务器端也可以用在客户端。

命名程序块可以出现在其他PL/SQL程序块的声明部分,这方面比较明显的是子程序,子程序可以在执行部分引用,也可以在异常处理部分引用。

匿名块

匿名块不存在于数据块

每次使用时都会编译

不能再其它块中相互调用

带名块

可以存在于数据块中

PL/SQL程序块可背独立编译并存储在数据库中,任何与数据库相连接的应用程序都可以访问这些存储的PL/SQL程序块。ORACLE提供了四种类型的可存储的程序:

. 函数

. 过程

. 包

. 触发器

++++++++++++++++++++++++++++++++

过程

存储过程是一个PL/SQL程序块,接受零个或多个参数作为输入(INPUT)或输出(OUTPUT)、或既作输入又作输出(INOUT),与函数不同,存储过程没有返回值,存储过程不能由SQL语句直接使用,只能通过EXECUT命令或PL/SQL程序块内部调用,定义存储过程的语法如下:

三种模式:IN OUT INOUT

创建存储过程:

CREATE OR REPLACE PROCEDUER 存储过程名(参数) AS

..........

BEGIN

...........

END

--------------------------------

CREATE OR REPLACE PROCEDURE name [(parameter[,parameter,...])] IS(AS)

[local declarations]

BEGIN

execute statements

[EXCEPTION

exception handlers ]

END [name]

例1:

创建一个存储过程

CREATE OR REPLACE PROCEDURE pro_hello(,p_id IN s_emp.id%TYPE := 1) AS

v_emp s_emp%ROWTYPE; ------------ IN模式要从调用者那里拿到参数传给存储过程BEGIN

SELECT * INTO v_emp FROM s_emp WHERE id = p_id;

DBMS_OUTPUT.PUT_LINE('hello, '||v_emp.first_name);

END;

-----------------调用存储过程

DECLARE

v_ret NUMBER;

BEGIN

pro_hello;

pro_hello(1);

DBMS_OUTPUT.PUT_LINE(v_ret);

END;

++++++++++++++++++++++++++++++++++++++

例2:

创建一个存储过程

CREATE OR REPLACE PROCEDURE pro_hello(p_name OUT s_emp.first_name%TYPE,p_id IN s_emp.id%TYPE := 1) AS ---------- OUT模式从存储过程中得到数据传给调用者

v_emp s_emp%ROWTYPE;

BEGIN

SELECT * INTO v_emp FROM s_emp WHERE id = p_id;

p_name := v_emp.first_name;

DBMS_OUTPUT.PUT_LINE(p_name);

-----DBMS_OUTPUT.PUT_LINE('hello, '||v_emp.first_name);

END;

调用存储过程

DECLARE

v_name s_emp.first_name%TYPE := 'zhangsan';

v_ret NUMBER;

BEGIN

--pro_hello;

--pro_hello(1);

p ro_hello(1, v_name); --------- 参数位置标示法(按照顺序)

p ro_hello(p_name=>v_name, p_id=>1);

-------- (传参数的时候顺序可以颠倒,但要用名字表示法

p_name=>v_name 表示存储过程中的p_name对应调用过程中的v_name

p_id=>1表示存储过程中的p_id对应调用过程中的1。)

p ro_hello(1, p_name=>v_name);

-------- 两种混用时第一个必须为位置标示法,后面就没事。

D BMS_OUTPUT.PUT_LINE('hello, '||v_name);

END;

实参:实际的参数,如调用的过程中所传的参数。

形参:存储过程定义的时候的参数。

模式为IN OUT 和OUT 参数的实际参数必须为变量,而不可以是常量。

只有IN模式参数才有缺省值。

+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

SQL>exce 存储过程名 ------ 执行存储过程

Select text from user_source where name="PROC1"; ---- 从数据库中查看存储过程名为PROC1的源码+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

create or replace procedure proc1

(p_n1 varchar2 , p_n2 out varchar2,p_n3 in out varchar2)

参数传入参数传出参数传出

is

v_n1 varchar2(10);

begin

--p_n1 := p_n1 || 'd';

v_n1 := p_n1;

p_n2 := p_n2 || 'd';

p_n3 := p_n3 || 'd';

dbms_output.put_line(v_n1);

dbms_output.put_line(p_n1);

dbms_output.put_line(p_n2);

dbms_output.put_line(p_n3);

end;

+++++++++++++++++++++++++++++++++++++++++++++++++

declare

v_n1 varchar2(10) := 'abc';

v_n2 varchar2(10) := 'abc';

v_n3 varchar2(10) := 'abc';

begin

proc1(v_n1,v_n2,v_n3);

dbms_output.put_line(v_n1);

dbms_output.put_line(v_n2);

dbms_output.put_line(v_n3);

end;

+++++++++++++++++++++++++++++++++++++++

Desc +过程名 ------ 查看存储过程的结构

++++++++++++++++++++++++++++++++++++++++

函数

函数是命名了的、存储在数据库中的PL/SQL程序块。函数接受零个或多个输入参数,有一个返回值,返回值的数据类型在创建函数时定义。定义函数的语法如下:

FUNCTION name [{parameter[,parameter,...])] RETURN datatypes IS

------- datatypes为返回值的类型

[local declarations]

BEGIN

execute statements

[EXCEPTION

exception handlers]

END [name]

++++++++++++++++++++++++++++++++

创建函数

CREATE OR REPLACE FUNCTION fun_add(p_a NUMBER,p_b NUMBER) RETURN NUMBER IS v_ret NUMBER;

BEGIN

v_ret := p_a + p_b;

RETURN v_ret;

END;

+++++++++++++++++++++++++++++++

调用函数

DECLARE

v_ret NUMBER;

BEGIN

v_ret := fun_add(2,3);

D BMS_OUTPUT.PUT_LINE(v_ret);

END;

+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 创建函数

1 create or replace function func1(dept_id number)

2 return number

3 is

4 v_ave_salary number;

5 begin

6 select avg(salary) into v_ave_salary from s_emp

7 where dept_id=dept_id;

8 return v_ave_salary;

9* end;

++++++++++++++++++++++++++++++调用函数

select func1(42) from dual;

++++++++++++++++++++++++++++++

子程序的位置

本地子程序:一个函数在一个PLSQL匿名块中(在声明部分),只为当前代码块服务。

+++++++++++++++++++++++++++++++++++++++++

包(package)

包其实就是被组合在一起的相关对象的集合,当包中任何函数或存储过程被调用,包就被加载入内存中,包中的任何函数或存储过程的子程序访问速度将大大加快。

包由两个部分组成:规范和包主体(body),规范描述变量、常量、游标、和子程序,包体完全定义子程序和游标。

分包规范和包主体。如果没有包规范,包主体没必要存在。

CREATE OR REPLACE PACKAGE pack_emp AS -----------pack_emp为包规范名

v_emp s_emp%ROWTYPE;

PROCEDURE addEmp(p_emp s_emp%ROWTYPE, p_2 s_emp.first_name%TYPE);

PROCEDURE addEmp(p_name s_emp.first_name%TYPE, p_emp s_emp%ROWTYPE);

PROCEDURE addEmp();

END pack_emp;

++++++++++++++++++++++++++

创建包

CREATE OR REPLACE PACKAGE BODY pack_emp AS ------- 定义包规范

P ROCEDURE addEmp(p_emp s_emp%ROWTYPE) AS ------ 存储过程的声明

I NSERT INTO s_emp(id, last_name, first_name, salary)

V ALUES(s_emp_id.nextval, p_https://www.360docs.net/doc/4c803303.html,st_name,

p_emp.first_name, p_emp.salary);

C OMMIT;

END;

END pack_emp;

++++++++++++++++++++++++++++++++

包的调用

BEGIN

p ack_emp.v_https://www.360docs.net/doc/4c803303.html,st_name := 'wang';

p ack_emp.v_emp.first_name := 'wu';

p ack_emp.v_emp.salary := 2000;

p ack_emp.addEmp(pack_emp.v_emp);

END;

包中子程序的重载:名字相同,参数不同。

++++++++++++++++++++++++++++++++++++++++包的建立

1 create or replace package pkg1

2 is

3 type t_rec is record(

4 c1 number,

5 c2 number);

6 v_rec t_rec;

7 procedure proc1;

8 function fun1 return number;

9* end;

++++++++++++++++++++++++++++++++++++++++包体的建立

1 create or replace package body pkg1

2 is

3 procedure proc1

4 is

5 begin

6 dbms_output.put_line(1);

7 end proc1;

8 function fun1 return number

9 is

10 begin

11 return 1;

12 end fun1;

13* end;

+++++++++++++++++++++++++++++++++++++++++

触发器(trigger)

触发器与一个表或数据库事件联系在一起的,当一个触发器事件发生时,定义在表上的触发器被

触发器与一个表或数据库事件联系在一起的,

当一个触发器事件发生时,定义在表上的触发器被触发。

触发器的语法:

CREATE [OR REPLACE] TRIGGER tregger_name ------- tregger_name触发器的名字

{BEFORE|AFTER} triggering_event ON table_reference --- triggering_event触发事件:insert upadate

[FOR EACH ROW [WHEN trigger_condition]] ------- WHEN句子是可选的

trigger_body; ------------ 触发主体

触发器的名字:可以与表同名;

触发器的类型:

语句级触发器:仅在执行前后执行一次

行级触发器(受事件的次数影响,若UPDATA了100次,行级触发器就执行100次)----- 多了[FOR EACH ROW [WHEN trigger_condition]] 部分

+++++++++++++++++++++++++

实例创建出发器

CREATE OR REPLACE TRIGGER trg_emp ---------- trg_emp 触发器的名字

A FTER INSERT OR UPDATE OR DELETE on s_emp ---- s_emp表名

DECLARE

v_cnt NUMBER;

BEGIN

S ELECT COUNT(*) INTO v_cnt

FROM s_emp;

D BMS_OUTPUT.PUT_LINE(v_cnt|| 'rows in s_emp.');

END;

如果存在,执行行级之前的触发器

执行语句本身

如果存在,执行行级之后的触发器

执行顺序

++++++++++++++++++++++

语句级:

执行BEFORE的语句

执行事件本身

执行AFTER的语句

++++++++++++++++++++++

行级:

执行行级BEFORE的语句

执行事件本身

执行行级AFTER的语句

注意点

触发器不能使用事物控制语句COMMIT ROLLBACK SAVEPOINT

有触发器调用的子程序中也不能有事物控制语句

不能声明任何LONG变量

可以访问的表有限

---------------------------------

变化表:在建立触发器中关键字ON后的表如 s_emp

限制表:与变化表有主外键关系的表。如:s_emp 和 s_dept

如果两张表存在DELETE cascade级联关系

1、不可以访问或修改任何变化表,不能在触发器中进行select update insert操作。

2、不可以访问或修改任何限制表的主键列,外键列,唯一列

++++++++++++++++++++++++++++++++++++++++++++++

行级触发器语法

行级触发器可从insert update delete语句触发。

CREATE OR REPLACE TRIGGER trigger_name

AFTER|BEFORE INSERT|UPDATE|DELETE ON table_name

FOR EACH ROW

[WHEN (Boolean expression)]

DECLARE

Local declarations

BEGIN

Trigger Body written PL/SQL

END;

BMS_STANDARD 包提供了四个boolean函数来区分SQL语句类型:

FUNCTION inserting RETURN BOOLEAN;

FUNCTION updating RETURN BOOLEAN;

FUNCTION updating (colnam VARCHAR2) RETURN BOOLEAN;

FUNCTION deleting RETURN BOOLEAN;

例子

CREATE OR REPLACE TRIGGER temp_aiur

AFTER INSERT OR UPDATE ON TEMP

FOR EACH ROW

BEGIN

CASE

WHEN inserting THEN

dbms_output.put_line

('executing temp_aiur - insert');

WHEN updating THEN

dbms_output.put_line

('executing temp_aiur - update');

Plsql学习心得

Plsql学习心得 十一、包package 41 11.1什么是package 41 11.2包的组成41 11.3包的优点41 11.4 package声明的语法41 11.5 package body声明的语法42 11.6编译包和包体42 11.7案例42 十二、触发器trigger 44 12.1面临问题44 12.2 DML触发器的组成44 12.3 DML触发器的类型44 12.4 DML触发器的触发顺序44 12.5 DML行级触发器44 12.6 :OLD和:NEW 44 12.7触发器的重新编译46 12.8触发器的状态46 十三、其他注意事项47 13.1 PL/SQL的特点47 13.2写PL/SQL的好处47 13.3命名建议47 13.4搞清楚如下内容47 13.5保证所有对象的状态都是valid 47 13.6 declare中都可声明什么47 13.7数据库对象47 十一、包package 11.1什么是package 1)package(包)是一个可以将相关对象存储在一起的PL/SQL结构。package包含了两个分离的组成部分:specification(package的声明,即包声明)和body(声明中的程序实现,即包体)。每个部分都单独被存储在数据字典中。包声明是一个操作接口,对应用来说是可见的。 2)包体是黑盒,对应用来说隐藏了实现细节。

11.2包的组成 将相关的若干程序单元组织到一块,用一个包来标识这个集合,包中可以包含以下的程序单元: 程序单元描述 过程(procedure)带有参数的程序 函数(function)带有参数的程序,该程序有返回值 变量(variable)用于存储变化值的存储单元 游标(cursor)定义一条SQL语句 类型(type)定义复合类型(record、collection) 常量(constant)定义常量 异常(exception)标识异常 11.3包的优点 1)方便对存储过程和函数的组织: ①将相关的过程和函数组织在一起。②在一个用户环境中解决命名的冲突问题。 2)方便对存储过程和函数的管理: ①在不改变包的声明定义是可以改变包体的实现的。②限制过程、函数的依赖性。 ③在包体未实现时,其他程序中可以调用包中的对象,对自己的程序进行编译,可以并行地对程序开发。 3)方便对存储过程和函数的安全性管理: ①整个包的访问权限只需一次性授权。②区分公用过程和私有过程。 4)改善性能: ①在包被首次调用时作为一个整体全部调入内存。②减少多次调用时磁盘I/O次数。 11.4 package声明的语法 create or replace package pkg_name {is|as} 公共变量(variable)的定义|公共类型(type)的定义| 公共异常(Exception)的定义|公共游标(cursor)的定义| 函数说明|过程说明 end; 11.5 package body声明的语法

PLSQL应用程序开发

Oracle PL/SQL ProGramming 学习笔记 Author:丁俊 目录 序言-特点介绍 (2) PART1 用PL/SQL设计程序 (4) 第一章plsql在10g中的新特性 (4) 第二章建立和运行plsql程序 (6) 第三章plsql语言基本原理 (9) PART2 PL/SQL应用程序结构 (12) 第四章条件和序列控制 (12) 第五章循环控制 (19) 第六章异常处理 (23) PART3 PL/SQL程序应用 (25) 第七章用数据来工作 (25) 第八章Strings (27) 第九章Numbers (31) 第十章Records (36) 第十一章集合类型 (38)

序言-特点介绍 1-1 pl/sql可以做的工作: 1.用pl/sql的存储过程和数据库触发器实现至关重要的商业规则。 2.在数据库中生成和完全地管理xml文档。 3.web页面与数据库的结合。 4.实现自动化的数据库管理,用pl/sql建立安全级别来管理回滚段。 1-2 pl/sql特点: 从oracle 6开始,模仿Ada语言的实现,Ada语言强调数据抽象,信息隐藏,还有其他现代语言设计中的关键策略。pl/sql做为3GL语言具有面向过程语言的许多重要特性,如: 1.丰富的数据类型,从number到string,从复杂的record到table,以及集合类型等。 2.显示的可读性强的块状结构,可以增强我们维护plsql程序。 3.条件,循环语句,包括if---else,3个loop循环(简单loop,for...loop,while...loop)。 4.完整地异常处理机制。 5.命名的,可重用的代码,如包,函数,过程,触发器,对象类型等。 6.plsql是sql的有力补充,与sql之间的联系紧密,整合性强。 7.plsql是oracle数据库产品的内置语言,不是一个孤立的语言。 8.是一种高性能的语言。 9.pl/sql运行过程 Plsql引擎可以接受应用程序的程序,然后将sql部分和plsql部分分离出来,分别交给sql 引擎和plsql引擎执行,提高执行效率。 10.plsql可以每次发送成组的sql语句到服务器端执行,不像sql每次只能发送一句,减少网络负载量,提高效率,而且在oracle的相关工具中,如oracle form中,plsql也得到增强。 11.总结一句话:plsql有应用程序的特性,是sql的有力补充,具有流程控制,申明和使用变量,plsql能运行在任何具有oracle的环境中。

PLSQL developer操作入门级知识讲解

P L S Q L d e v e l o p e r操 作入门级

目录 一 .登录PL/SQL Developer (3) 二 .登录后的基本设置 (4) 2.1 过滤显示 (4) 2.2登录界面的设置 (5) 三 .基本操作 (8) 2.1表的基本操作 (8) 2.1.1 SQL语句建表 (8) 2.1.2 如何在PL\SQL Developer里执行SQL语句 (9) 2.1.3 给表设置主键 (10) 2.1.4 编辑表的字段 (14) 2.1.5 输入条件查询 (15) 2.1.6删除表 (16) 2.1.7编辑表的数据 (17) 2.2视图(View) (19) 2.2.1概念 (19) 2.2.2创建视图 (19) 2.3其它数据库对象 (19) 2.4数据库对象的导出\导入 (20) 2.4.1表的导出 (20) 2.4.2 Dmp导出参数介绍 (23) 2.4.2 表的导入 (24) 四 .其它操作 (27) 1.SQL美化 (27)

一 .登录PL/SQL Developer 1.1 登录PL/SQL Devel oper (1)登录4要素 a. 用户名(username) b. 密码(password) c. 数据库服务名(Database) d. 连接身份(Connect as) (2)要素说明 ●用户名(username)和密码(password):即数据库登录用户和登录密码,由 数据库管理员提供 ●数据库服务名(Database):数据库服务名可在下拉列表中选择(由 tnsnames.ora文件中描述的名字来确定),前提是通过Net Configuration Assistant来配置,或者直接修改tnsnames.ora文件。 ●连接身份(Connect as):若为一般用户,默认为normal即可;若为sys或

oracle学习笔记

●PLSQL控制台输出语句 SET serveroutput ON; --打开控制台输出服务 dbms_output.put_line('values2='||var_val); --输出语句 ●PLSQL动态变量 var_str := '&input'; ●创建表空间和用户 --创建表空间 CREATE TABLESPACE "BCPBS" LOGGING DATAFILE 'D:\app\E430\oradata\orcl\BCPBS_01.ora' SIZE 2048M AUTOEXTEND ON NEXT 10M MAXSIZE UNLIMITED, 'D:\app\E430\oradata\orcl\BCPBS_02.ora' SIZE 2048M AUTOEXTEND ON NEXT 10M MAXSIZE UNLIMITED EXTENT MANAGEMENT LOCAL SEGMENT SPACE MANAGEMENT AUTO ; --建立用户 CREATE USER "BCPBS" PROFILE "DEFAULT" IDENTIFIED BY "bcpbs123" DEFAULT TABLESPACE "BCPBS" TEMPORARY TABLESPACE "TEMP" ACCOUNT UNLOCK; GRANT "CONNECT" TO "BCPBS"; GRANT "DBA" TO "BCPBS"; GRANT "RESOURCE" TO "BCPBS"; ●删除表空间和用户 drop user bcpbs cascade ; drop tablespace BCPBS including contents and datafiles cascade constraints ; ●自定义函数 CREATE OR REPLACE FUNCTION fun_level_value(level_value number) RETURN number IS return_value number:=null; BEGIN CASE level_value WHEN 0 THEN return_value:='0'; WHEN 1 THEN return_value:='1'; WHEN 2 THEN return_value:='2'; WHEN 3 THEN return_value:='3'; WHEN 6 THEN return_value:='8'; ELSE

实验1 ORACLE基本操作-使用SQL DEVELOPER

实验1 ORACLE 基本操作 实验目的:掌握ORACLE的连接,了解ORACLE的数据库结构;熟悉PLSQL/Developer图形化管理工具的使用。 实验内容: 一、机房环境的准备工作(每次重新启动机器后必做的工作) 为了能启动ORACLE并利用图形化的管理工具PLSQL/Developer对ORACLE数据库进行操作,在机房的机器中要先做如下的准备工作: 1、查看自己的机器名 方法:右击“我的电脑”→“属性”,找到并记住自己的计算机名 2、修改监听程序 方法:“开始”→“所有程序”→“Oracle-OraDb11g_home1”→“配置和移植工具”→“Net Manager”,在弹出的窗口中展开目录至最后的“LISTENER”,在右侧的窗口中将主机名改成自己的主机名→单击窗口右上角的红色叉号按钮关闭→在弹出的对话框中选择“保存”。

3、启动服务 右击“我的电脑”→“管理”→“服务和应用程序”→“服务” 找到并按顺序启动如下两个服务: 。 启动顺序:先启动,再启动 启动方法:右击服务名选择“启动” 注:当在自己的机器上使用时,这两个服务若显示已启动则不用重新再启动。 二、运行SQL Developer,建立与ORACLE数据库的连接 1、运行Oracle自带的SQL Developer软件 方法:“开始”→“所有程序”→“Oracle-OraDb11g_home1”→“应用程序开发”→“SQL Developer” 2、以system用户建立与数据库的连接 在SQL Developer窗口中选中“连接”→点击“新建”按钮,

在窗口中输入以下信息,使其以system用户与数据库进行连接 注: 连接名:可以随便起 用户名:system,若以其他用户身份登录,可以在这里更改用户名 密码:123456 SID:orcl 点击“测试”按钮,若成功则在左下角显示“状态:成功”,若有错误,则会出现红色的提示信息,按信息进行问题查找。 最后点击“连接”按钮进行连接

oracle plsql宝典学习笔记

2015.12.28 1、约束的类型: 主键约束、外键约束、唯一约束、检查约束、非空约束是Oracle数据表的5个约束。 主键约束:用来唯一标识表中一个列,一个表中的主键约束只能有一个,但是可以在一个主键约束中包括多个列,也称为联合主键。 外键约束:用来约束两个表中列之间的关系。 唯一约束:用来唯一标识表中的列。与主键约束不同的是,在一个数据表中可以有多个唯一约束。 检查约束:用来约束表中列的输入值的范围,比如在输入性别时,要求在数据库中只能输入男或女,就可以使用检查约束来约束该列。 非空约束:约束该列一定要输入值。 2、使用外键约束,应注意以下几个方面问题 如果在foreign key约束的列中输入非NULL值,则此值必须在被引用列中存在;否则,将返回违反外键约束的错误信息。 foreign key约束仅能引用位于同一个服务器上同一个数据库中的表,跨数据库的引用完整性必须通过触发器实现。 foreign key约束可以引用同一个表中的其他列,此行为称为自引用。 列级foreign key约束的references子句只能列出一个引用列,此列的数据类型必须与定义约束列的数据类型相同。 表级foreign key约束的references子句中引用列的数目必须与约束列列表中的列数相同,每个引用列的数据类型也必须与列表中相应列的数据类型相同。在临时表中,不能使用外键约束。 2015.12.30 1、虽然使用DELETE语句和TRUNCATE TABLE语句都能够删除表中的所有数据,但是使用TRUNCATE TABLE语句比使用DELETE语句的执行效率要高。这是因为:使用DELETE语句,系统将一次一行地处理要删除的表中的记录,在从表中删除行之前,在事务处理日志中记录相关的删除操作和删除行中的列值,以便在删除失败时,可以使用事务处理日志来恢复数据。 使用TRUNCATE TABLE语句则一次性完成删除与表相关的所有数据页的操作。另外,TRUNCATE TABLE语句并不更新事务处理日志。因此,使用TRUNCATE TABLE 语句从表中删除行后,将不能用ROLLBACK命令取消行的删除操作。 2016.1.1 1、在实际应用中,使用NOT运算符时,经常忽视其对NULL值的处理问题。要时刻牢记一点,NOT NULL的结果仍为NULL。 2、X IS NULL不可以写成X=NULL;除了IS[NOT] NULL之外,空值不满足任何查找条件;如果NULL参与算术运算,则该算术表达式的值为NULL;如果NULL参与聚集运算,则除count(*)之外其他聚集函数都忽略NULL。 2016.1.2 1、在默认情况下,ORDER BY按升序进行排列,即默认使用的是ASC关键词。如果用户特别要求按降序进行排列,则必须使用DESC关键词。 ORDER BY子句一定要放在所有子句的最后(无论包含多少子句)。 对于时间、数值类型的字段排序,其排序规则就是按照时间的早晚、数值的大小进行的;对于字符型的字段排序,则是依照其ASCII码的先后顺序进行的。

windows 系统应用与维护

Ⅱ戊辰B:windows 系统应用与维护(5%) 4+13+7 单选; 1.Windows将整个计算机显示屏幕看作是()。C A.工作台B.窗口C.桌面D.背景 2.Excel中的工作簿是(D)。 A.一本书 B.一种记录 C.一张表 D. 由工作表组成的文档 3.下面对E-Mail的描述中,只有(d )是正确的。 (A)不能给自己发送E-Mailb (B)一封E-Mail只能发给一个人 (C)不能将E-Mail转发给他人(D)一封E-Mail能发送给多个人 4.从E-Mail服务器中取回来的邮件,通常都保存在客户机的( b)里。 (A)发件箱(B)收件箱(C)已发送邮件箱(D)已删除邮件箱 5、我行网银系统共由多少台设备组成(B) A、30 B、66 C、64 D、13 6、我行网银系统由多少种硬件设备组成(A) A、18 B、17 C、16 D、15 7、我行网银系统网络结构共分多少个区域(C) A、4 B、5 C、7 D、6 8、我行网银系统设计最大寿命为多少年(A) A、8 B、7 C、6 D、5 9、我行网银系统防止暴力破解密码的措施为(A) A、输入5次密码错误以后,系统自动冻结账号一天

B、访问控制列表 C、将账户删除 D、无保护措施 10.以下哪个软件不是信管系统日常开发维护时的常用软件( D ) A.tomcat B.plsql C.myeclipse D.ESET 11.以下哪个是信管系统的正确地址( B ) A.http://16.3.1.75:7001/console B.http://16.3.1.75/credit C.http://16.3.1.75/ICRWeb D.http://16.3.1.75/ECRWeb 12.以下哪个是企业征信系统的正确地址( D ) A.http://16.3.1.75:7001/console B.http://16.3.1.75/credit C.http://16.3.1.75/ICRWeb D.http://16.3.1.75/ECRWeb 13.以下哪个是个人征信系统的正确地址( D ) A.http://16.3.1.75:7001/console B.http://16.3.1.75/credit C.http://16.3.1.75/ICRWeb D.http://16.3.1.75/ECRWeb 14.关于信管系统浏览器配置说法错误的是( D ) A.需要安装ActiveX控件 B.启用下载未签名的ActiveX控件项 C.禁用弹出窗口阻止程序项,并要把网址添加到可信站点中 D.以上说法都是错误的 15.Windows中安装相应的应用软件,通过控制面板中的( C )控件完成。 A、系统B、添加新硬件 C、添加/删除程序D、多媒体 16.在WINDOWSXP中,若鼠标指针变成“I”形状,则表示( D ) A、当前系统正在访问磁盘B、可以改变窗口的大小 C、可以改变窗口的位置D、鼠标指针出现处可以接收键盘的输入 17.不能利用WINDOWSXP资源管理器直接完成的任务是( C ) A、删除文件B、新建文件夹C、对硬盘分区D、复制文件 18.在WINDOWS XP中,使用软键盘可以快速的输入各种特殊符号,为了撤消弹出的软键盘,正确的操作是( A ) A、用鼠标左键单击软键盘上的ESC键 B、用鼠标右键单击软键盘上的ESC键 C、用鼠标右键单击中文输入法状态窗口中的软键盘按钮

PLSQL学习简易快速入门

PLSQL学习简易快速入门 课程一 PL/SQL 基本查询与排序 本课重点: 1、写SELECT语句进行数据库查询 2、进行数学运算 3、处理空值 4、使用别名ALIASES 5、连接列 6、在SQL PLUS中编辑缓冲,修改SQL SCRIPTS 7、ORDER BY进行排序输出。 8、使用WHERE 字段。 一、写SQL 命令: 不区分大小写。 SQL 语句用数字分行,在SQL PLUS中被称为缓冲区。 最后以;或 / 结束语句。 也可以用RUN来执行语句 二、例1:SQL> SELECT dept_id, last_name, manager_id FROM s_emp; 2:SQL> SELECT last_name, salary * 12, commission_pct FROM s_emp; 对于数值或日期型的字段,可以进行相应的四则运算,优先级与标准的高级语言相同。 SQL> SELECT last_name, salary, 12 * (salary + 100) FROM s_emp; 三、列的别名ALIASES: 计算的时候特别有用; 紧跟着列名,或在列名与别名之间加“AS”; 如果别名中含有SPACE,特殊字符,或大小写,要用双引号引起。 例(因字体原因,读者请记住:引号为英文双引号Double Quotation): SQL> SELECT last_name, salary, 12 * (salary + 100) ”Annual Salary” FROM s_emp;

四、连接符号:|| 连接不同的列或连接字符串 使结果成为一个有意义的短语: SQL> SELECT first_name || ’’ || last_name || ’, ’|| title ”Employees” FROM s_emp SQL> select divid ||' '|| divname from pub_t_division_test where superid='001' 效果如下图: 五、管理NULL值: SQL> SELECT last_name, title, salary * NVL(commission_pct,0)/100 COMM FROM s_emp; 此函数使NULL转化为有意义的一个值,相当于替换NULL。 select divid,divname,NVL(addr,0) from pub_t_division_test where superid='001' 效果如下图: 六、SQL PLUS的基本内容,请参考 七、ORDER BY 操作: 与其他SQL92标准数据库相似,排序如: SELECT expr FROM table[ORDER BY {column,expr} [ASC|DESC]]; 从Oracle7 release 7.0.16开始,ORDER BY 可以用别名。 另:通过位置判断排序: SQL> SELECT last_name, salary*12 FROM s_emp ORDER BY 2; select * from pub_t_division_test where superid='001'order by3 这样就避免了再写一次很长的表达式。 另:多列排序: SQL> SELECT last name, dept_id, salary FROM s_emp ORDER BY dept_id, salary DESC; SQL>select * from pub_t_division_test where superid='001' order by 1,3 desc

Oracle常见死锁发生的原因以及解决方法

Oracle常见死锁发生的原因以及解决方法 Oracle常见死锁发生的原因以及解决办法 一,删除和更新之间引起的死锁 造成死锁的原因就是多个线程或进程对同一个资源的争抢或相互依赖。这里列举一个对同一个资源的争抢造成死锁的实例。 Oracle 10g, PL/SQL version 9.2 CREATE TABLE testLock( ID NUMBER, test VARCHAR(100) ) COMMIT INSERT INTO testLock VALUES(1,'test1'); INSERT INTO testLock VALUES(2,'test2'); COMMIT; SELECT * FROM testLock 1. ID TEST 2.---------- ---------------------------------- 3. 1 test1 4. 2 test2 死锁现象的重现: 1)在sql 窗口执行:SELECT * FROM testLock FOR UPDATE; -- 加行级锁并对内容进行修改, 不要提交 2)另开一个command窗口,执行:delete from testLock WHERE ID=1; 此时发生死锁(注意此时要另开一个窗口,不然会提示:POST THE CHANGE RECORD TO THE DATABASE. 点yes 后强制commit):

3)死锁查看: 1.SQL> select https://www.360docs.net/doc/4c803303.html,ername,l.object_id, l.session_id,s.serial#, s.lockwait,s.status,s.machine, s.program from v$session s,v$locked_object l where s.sid = l.session_id; USER NAME SESSION_ID SERIAL# LOCKWAIT STATUS MACHINE PROGRAM 2.---------- ---------- ---------- -------- -------- ---------------------- ------------ 3.SYS 146 104 INACTIVE WORKGROUP\J-THINK PLSQLDev.exe 4.SYS 144 145 20834474 ACTIVE WORKGROUP\J-THINK PLSQLDev. exe 字段说明: Username:死锁语句所用的数据库用户; SID: session identifier,session 标示符,session 是通信双方从开始通信到通信结束期间的一个上下文。 SERIAL#: sid 会重用,但是同一个sid被重用时,serial#会增加,不会重复。 Lockwait:可以通过这个字段查询出当前正在等待的锁的相关信息。 Status:用来判断session状态。Active:正执行SQL语句。Inactive:等待操作。Killed:被标注为删除。 Machine:死锁语句所在的机器。 Program:产生死锁的语句主要来自哪个应用程序。 4)查看引起死锁的语句:

ape安装配置手册

A P E X安装简单的说,共分四步:1、安装O r a c l e D B APEX2.2要求Oracle DB版本为9.2.0.3或更高。注意APEX2.2不支持Oracle DB XE,如果你的数据库是Oracle DB XE,就要选用APEX2.1。我这里选用的数据库是Oracle 10.2.0.1,虽然不是目前最高的版本(最高的版本是10.2.0.1的patchset),但是已经包含了很多令人振奋的新特性了。建议 C S D N的朋友们也多使用一些O r a c l e产品的新版本,时刻保持对新技术的敏感度。 O r a c l e D B的免费下载网址为:h t t p://w w w.o r a c l e.c o m/t e c h n o l o g y...r a c l e10g/i n d e x.h t m l 注意:不要用下载的软件从事有任何商业目的的活动。 下载之后开始安装,步骤非常简单。你可以选择在安装的同时创建一个数据库,或者在安装结束后用DBCA 创建一个数据库,最好将数据库的字符集设为AL32UTF8(如果你想让你的数据库支持多种语言,请选用AL32UTF8;否则可以考虑使用一种native本地的字符集,比如ZHS16GBK)。这里我创建了一个service n a m e为t i n a03.c n.o r a c l e.c o m(S I D为t i n a03)的数据库。安装结束后,打开services(服务)窗口,你可以看到里面多了数个oracle的服务,其中包括我们需要的OracleServiceTINA03和OracleOraDb10gTNSListener,其他的服务都可以停掉且设为手动启动。 2、安装O r a c l e H t t p S e r v e r APEX2.2是需要部署到Oracle Http Server上的,它所以能运行主要是依赖于mod_plsql这个模块。下面这三个系列的产品可以满足需要:

精通 oracle 10g plsql 编程-学习笔记

1.PL/SQL综述 本章学习目标,了解如下内容: PL/SQL的功能和作用 PL/SQL 的优点和特征; Oracle 10g、Oracle9i 的PL/SQL新特征 1.1.SQL简介 1.1.1.SQL语言特点 SQL语言采用集合操作方式 1.1. 2.SQL语言分类 ●数据查询语言(SELECT语句):检索数据库数据。 ●数据操纵语言(DML):用于改变数据库数据。包括insert,update和delete三条语句。 ●事务控制语言(TCL):用于维护数据库的一致性,包括commit,rollback和savepoint 三 条语句 ●数据定义语言(DDL):用户建立、修改和删除数据库对象。 ●数据控制语言(DDL):用于执行权限授予和收回操作。包括grant 和revoke两条命令。 1.1.3.SQL 语句编写规则 ●SQL关键字不区分大小写 ●对象名和列名不区分大小写 ●字符值和日期值区分大小写 ●书写格式随意 1.2.PL/SQL简介 1.3.Oracle 10G PL/SQL 新特征 2.PL/SQL开发工具 本章学习目标: 学会使用SQL*PLUS 学会使用PL/SQL developer; 学会使用Procedure Builder。 2.1.SQL*PLUS 在命令行运行SQL*Plus

Sqlplus [username]/[password] [@server] 3.PL/SQL 基础 学习目标: ●了解PL/SQL块的基本结构以及PL/SQL块的分类; ●学会在PL/SQL块中定义和使用变量 ●学会在PL/SQL块中编写可执行语句; ●了解编写PL/SQL代码的指导方针; ●了解Oracle 10g的新特征——新数据类型BINARY_FLOAT 和 BINARY_DOUBLE,以及指定字符串文本的新方法。 3.1.PL/SQL 块简介 3.1.1.PL/SQL块结构 3.1.2.PL/SQL 块分类 匿名块 命名块 子程序 触发器 3.2. 定义并使用变量 3.2.1.标量变量 3.2.2.复合变量 3.2.3.参照变量 3.2. 4.LOB 变量 3.2.5.非PL/SQL 变量

PLSQL学习(一) 基础知识

PLSQL学习(一) 基础知识 很久以前自己整理的PLSQL一些基础知识,翻出来看看都是比较基础的内容,还是放上来好了。参考的资料是《PL/SQL用户指南与参考》中译版,觉得这是一部很不错的入门书,感谢把这本书翻译出来的网友。 1、乘方的不同应用: 在SQL中乘方只能使用函数Power(a,b)来计算 但在PLSQL中可直接使用a**b表示 2、赋值语句Returning: insert into t1 values(90,'SERVICE','BEIJING') Returning rowid,name into row_id,info; 注:只限insert、update、delete一条记录时进行赋值 3、自定义参数——&: 可SQL和PLSQL中均可使用自定义参数,即需要自己输入值的参数 select * from ldcom where comcode=&a andname=&b; PLSQL: declare i int := &a; n int := &b; 4、绑定变量的使用: 可使用绑定变量的办法提高SQL效率 SQL> variable x number ; SQL> exec :x := 8600 ; SQL> select * from ldcom where comcode= :x ; 注:PLSQL中的declare即隐士绑定,无需再申明

可用Print查看绑定变量 SQL> print x; 也可使用查询SQL> select :x from dual; 实际的简单应用: variable x number; declare v_date date; begin for i in1.. 10loop :x := i; select sysdate+:x into v_date from dual; dbms_output.put_line(v_date); end loop; end; / 在execute immediate中的应用: declare v_x t1.num%type; begin execute immediate'update t1 set num=8888 where id=:a returning num into :b' using2returning into v_x; dbms_output.put_line(v_x); end; 注意returning的返回值在动态SQL中的操作格式 5、%TYPE和%ROWTYPE的区别: %TYPE针对某一字段类型(数组也是单一的类型) %ROWTYPE针对某一整表的类型(游标也是整表)

PLSQL怎么执行SQL语句

通过f5查看到的执行计划,其实是pl/sql developer工具内部执行查询 plan_table表然后格式化的结果。 select * from plan_table where statement_id=...。其中 description列描述当前的数据库操作, object owner列表示对象所属用户, object name表示操作的对象, cost列表示当前操作的代价(消耗),这个列基本上就是评价sql语句的优劣,cardinality列表示操作影响的行数, bytes列表示字节数篇二:plsqldeveloper工具使用教程 plsql入门 pl/sql的概述 pl/sql的优势 pl/sql是一种块结构的语言,允许你将业务逻辑封装在一起,这是到目前为止使用pl/sql的最大优势 pl/sql是在服务器上运行,可以与数据库和sql引擎直接进行交互, pl/sql是什么? (procedural language/sql) 是oracle在标准的sql语言上的扩展,pl/sql不仅允许嵌入sql语言,还可以定义变量和常量,允许使用条件语句和循环语句,允许使用列外处理各种错误,这样使得它的功能变得更加强大。 特性: 减少java程序的复杂性 一.过程,函数,触发器是pl/sql编写的 二.过程、函数、触发器是在oracle中 三. pl/sql是非常强大的数据库过程语言 四.过程,函数可以再java程序中调用 为什么学? a) 提高应用程序的运行性能 b) 模块化的设计思想[分页的过程,订单的过程,转账的过程] c) 减少网络传输量(传统的方法,用sql语句传输!现在就只需要调用存储过程) d) 提高安全性(传统sql 可以看到表名字段等…) 不好: 移植性不好,(你写好的存储过程,函数等当我们要换数据库时,这些东西就没用了)开发工具: 1. sqlplus 开发工具 是oracle公司提供的一个工具,这个因为我们在以前介绍过: 2. pl/sql developer开发工具 pl/sql developer是用于开发pl/sql块的集成开发环境(ide) 它是一个独立的产品,而不是oracle的一个附带品, createprocedure sp_pro1//存储过程名字 is begin ---执行部分 insert into mytest values(‘’,’’); end; / 查看错误信息

Oracle11g自带的SQL developer无法打开解决方案

在安装完Oracle Database 11g Release 2数据库,想试一下Oracle自带的SQL Developer 工具,在操作系统菜单的所有程序中找到SQL Developer如下所示,并单击: 结果却提示缺少快捷方式,没找到“SQLDEVELOPER.BAT”,如下所示:

在Oracle的安装目录 D:\DataBaseInstall\Oralce_11g_r2\product\11.2.0\dbhome_1\sqldeveloper\sqldeveloper\ bin下的确也没找到sqldeveloper.bat文件。网上很多人都说重新下载SQL Developer替换掉安装Oracle时自带的那个。 重新到Oracle官网下载SQL Developer,当前最新版下载地址: https://www.360docs.net/doc/4c803303.html,/otn/java/sqldeveloper/sqldeveloper64-3.2.20.09.87-no-jre.zip 将下载下来的sqldeveloper64-3.2.20.09.87-no-jre.zip解压到Oracle安装目录下

这时重新单击操作系统菜单中的“SQL Developer”,看到命令窗口闪一下就消失了。看了一下SQL Developer的“readme.html”文档知道了SQL Developer 3.2支持的Java版本至少要1.6.0_04。

那就下载当前最新JDK安装,在这里我下载的是 jrockit-jdk1.6.0_37-R28.2.5-4.1.0-windows-x64.exe。下载完成后双击出现如下安装界面:

查询oracle表空间路径

ORACLE查看表空间路径、当前用户的表空间等 查看当前用户每个表占用空间的大小: Select Segment_Name,Sum(bytes)/1024/1024 From User_Extents Group By Segment_Name 查看每个表空间占用空间的大小: Select Tablespace_Name,Sum(bytes)/1024/1024 From Dba_Segments Group By Tablespace_Name 查看Oracle当前用户下的信息(用户,表视图,索引,表空间,同义词,存储过程函数,约束条件)0、表空间 SQL>select username,default_tablespace from user_users; 查看当前用户的角色 SQL>select * from user_role_privs; 查看当前用户的系统权限和表级权限 SQL>select * from user_sys_privs; SQL>select * from user_tab_privs; 查看用户下所有的表 SQL>select * from user_tables; 1、用户 查看当前用户的缺省表空间 SQL>select username,default_tablespace from user_users; 查看当前用户的角色 SQL>select * from user_role_privs; 查看当前用户的系统权限和表级权限 SQL>select * from user_sys_privs; SQL>select * from user_tab_privs; 显示当前会话所具有的权限 SQL>select * from session_privs; 显示指定用户所具有的系统权限

oracle-database-11g-plsql-编程实战笔记

Chap1 DML语句是select 、insert、update、delete和merge DDL语句是create、alter、drop、rename、truncate、comment DCL语句是grant、revoke TCL语句是commit、rollback和savepoint sql16个基本命令——参考书《OCA认证考试指南(IZ0-051)》清华大学出版社 《oracle database sql language reference 11g》有非遵循格式字符串依赖于格式掩码 chap2 2.1.3 关于语句中有多个单引号时处理: 1、 select'It''s a bird,no plan can''t be 'as pharse from dual; 此处两个单引号即为一个单引号 2、只能用q 再加’(语句)’ select q'(It's a bird,no plan can't be)'as pharse from dual; 均输出 PHARSE ---------------------------- It's a bird,no plan can't be 2.1.4 定义变量与申明变量的区别: 定义变量即为变量分配名称并指定数据类型;申明变量首先需要定义变量,然后为其赋值。(赋值也称为初始化) 替代变量前面要加&前缀且若替代变量为字符型时要加两个单引号如’&a’ declare lv_whom varchar2(20);/*lv-whom为申明变量,a为替代变量,a没有变量类型*/ begin lv_whom := '&a'; end; 或者 declare lv_whom varchar2(20); begin lv_whom := &a; end;但是要在输入框中字符加两个单引号 替代变量用define申明,且定义时不可以指定类型,默认为char型 ①Define x=emp; Select * from &x; /*调用要用&,此处不加单引号,解析后即为emp表*/

PLSQL 快捷键设计以及添加快捷键

PL/SQL 快捷键 1 修改Code assistant快捷键 tools->preferences->User Interface -> Key Configuration -> tools/ code assistant 改为自己想要的快捷键 tools -> code assistant 可以查看帮助的快捷键 2 修改Sql 语句大小写 默认pl/sql 没有提供快捷键 选中sql,点击edit --> selection --> Uppercase 当然了也可以按照1来增加快捷键 tools->preferences->User Interface -> Key Configuration --> edit/selection/Uppercase 改为自己想要的快捷键 使用PL/SQL中经常性需要输入select * from 这样类似的语句。能不能配置一个快捷键,比如输入s,直接就显示select * from 呢?显然PL/SQL是支持该功能的。 在PL/SQL的安装目录下面:$:\Program Files\PLSQL Developer\PlugIns 中添加一个文本文件,比如命名为:shortcuts.txt。文本文件中填写如下内容: s = select * from 打开PL/SQL,在Tools->Perferences->Editor中Autoreplaces选择配置的shortcuts文件。如下图:

确定后重启PL/SQL就可以了。在编辑页面,输入s 就会显示select * from 附录:个人编写文件内容: s=select * from ; st = select t.* ,t.rowid from t ; sf = select a.* from a ; d = delet e from where ; u = update a set a. where a. ; w = where ; dbs=dbms_output.put_line('); 应用时,快捷键+回车就可以出现了!