ORACLEPLSQL存储过程Word文档下载推荐.docx

上传人:b****3 文档编号:6469675 上传时间:2023-05-06 格式:DOCX 页数:16 大小:25.69KB
下载 相关 举报
ORACLEPLSQL存储过程Word文档下载推荐.docx_第1页
第1页 / 共16页
ORACLEPLSQL存储过程Word文档下载推荐.docx_第2页
第2页 / 共16页
ORACLEPLSQL存储过程Word文档下载推荐.docx_第3页
第3页 / 共16页
ORACLEPLSQL存储过程Word文档下载推荐.docx_第4页
第4页 / 共16页
ORACLEPLSQL存储过程Word文档下载推荐.docx_第5页
第5页 / 共16页
ORACLEPLSQL存储过程Word文档下载推荐.docx_第6页
第6页 / 共16页
ORACLEPLSQL存储过程Word文档下载推荐.docx_第7页
第7页 / 共16页
ORACLEPLSQL存储过程Word文档下载推荐.docx_第8页
第8页 / 共16页
ORACLEPLSQL存储过程Word文档下载推荐.docx_第9页
第9页 / 共16页
ORACLEPLSQL存储过程Word文档下载推荐.docx_第10页
第10页 / 共16页
ORACLEPLSQL存储过程Word文档下载推荐.docx_第11页
第11页 / 共16页
ORACLEPLSQL存储过程Word文档下载推荐.docx_第12页
第12页 / 共16页
ORACLEPLSQL存储过程Word文档下载推荐.docx_第13页
第13页 / 共16页
ORACLEPLSQL存储过程Word文档下载推荐.docx_第14页
第14页 / 共16页
ORACLEPLSQL存储过程Word文档下载推荐.docx_第15页
第15页 / 共16页
ORACLEPLSQL存储过程Word文档下载推荐.docx_第16页
第16页 / 共16页
亲,该文档总共16页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

ORACLEPLSQL存储过程Word文档下载推荐.docx

《ORACLEPLSQL存储过程Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《ORACLEPLSQL存储过程Word文档下载推荐.docx(16页珍藏版)》请在冰点文库上搜索。

ORACLEPLSQL存储过程Word文档下载推荐.docx

  2)Oracle客户端工具访问Oracle服务器的操作语言;

  3)Oracle对SQL的扩充;

  4.PL/SQL的优缺点

优点:

  1)结构化模块化编程,不是面向对象;

  2)良好的可移植性(不管Oracle运行在何种操作系统);

  3)良好的可维护性(编译通过后存储在数据库里);

  4)提升系统性能;

  第二章

  PL/SQL程序结构

  1.PL/SQL块

1)申明部分,DECLARE(不可少);

  2)执行部分,BEGIN...END;

  3)异常处理,EXCEPTION(可以没有);

  2.PL/SQL开发环境

可以运用任何纯文本的编辑器编辑,例如:

VI;

toad很好用

  3.PL/SQL字符集

PL/SQL对大小写不敏感

  4.标识符命名规则

1)字母开头;

  2)后跟任意的非空格字符、数字、货币符号、下划线、或#;

  3)最大长度为30个字符(八个字符左右最合适);

  5.变量声明

语法

  Var_nametype[CONSTANT][NOTNULL][:

=value];

  注:

1)申明时可以有默认值也可以没有;

  2)如有[CONSTANT][NOTNULL],变量一定要有一个初始值;

  3)赋值语句为“:

=”;

  4)变量可以认为是数据库里一个字段;

  5)规定没有初始化的变量为NULL;

  第三章

  1.数据类型

1)标量型:

数字型、字符型、布尔型、日期型;

  2)组合型:

RECORD(常用)、TABLE(常用)、VARRAY(较少用)

  3)参考型:

REFCURSOR(游标)、REFobject_type

  4)LOB(LargeObject)

  2.%TYPE

变量具有与数据库的表中某一字段相同的类型

  例:

v_FirstNamestudengts.first_name%TYPE;

  3.RECORD类型

TYPErecord_nameISRECORD(/*其中TYPE,IS,RECORD为关键字,record_name为变量名称*/

  field1type[NOTNULL][:

=expr1],/*每个等价的成员间用逗号分隔*/

  field2type[NOTNULL][:

=expr2],/*如果一个字段限定NOTNULL,那么它必须拥有一个初始值*/

  .../*所有没有初始化的字段都会初始为NULL

  fieldntype[NOTNULL][:

=exprn]);

  4.%ROWTYPE

返回一个基于数据库定义的类型

  DECLARE

  v_StuRecStudent%ROWTYPE;

/*Student为表的名字*/

与3中定一个record相比,一步就完成,而3中定义分二步:

a.所有的成员变量都要申明;

b.实例化变量;

  5.TABLE类型

TYPEtabletypeISTABLEOFtypeINDEXBYBINARY_INTEGER;

DECLARE

  TYPEt_StuTableISTABLEOFStudent%ROWTYPEINDEXBYBINARY_INTERGER;

  v_Studentt_StuTable;

  BEGIN

  SELECT*INTOv_Student(100)FROMStudentWHEREid=1001;

  END;

1)行的数目的限制由BINARY_INTEGER的范围决定;

  6.变量的作用域和可见性

1)执行块里可以嵌入执行块;

  2)里层执行块的变量对外层不可见;

  3)里层执行块对外层执行块变量的修改会影响外层块变量的值;

  第四章

  1.条件语句

IFboolean_expression1THEN

  ...

  ELSIFboolean_expression2THEN/*注意是ELSIF,而不是ELSEIF*/

  .../*ELSE语句不是必须的,但ENDIF;

是必须的*/

  ELSE

  ENDIF;

  2.循环语句

1)Loop

  IFboolean_exprTHEN/**/

/*EXITWHENboolean_expr*/

/**/

  ENDLOOP;

  2)WHILEboolean_exprLOOP

  3)FORloop_counterIN[REVERSE]low_blound..high_boundLOOP

a.加上REVERSE表示递减,从结束边界到起始边界,递减步长为一;

  b.low_blound起始边界;

high_bound结束边界;

  3.GOTO语句

GOTOlabel_name;

  1)只能由内部块跳往外部块;

  2)设置标签:

<

label_name>

  3)示例:

  LOOP

  IFD%ROWCOUNT=50THEN

  GOTOl_close;

  <

l_close>

;

  4.NULL语句

在语句块中加空语句,用于补充语句的完整性。

示例:

  IFboolean_exprTHEN

  NULL;

  5.SQLinPL/SQL

1)只有DMLSQL可以直接在PL/SQL中使用;

  第五章

  1.游标(CURSOR)

1)作用:

用于提取多行数据集;

  2)声明:

a.普通申明:

DELCARECURSORCURSOR_NAMEISselect_statement/*CURSOR的内容必须是一条查询语句*/

  b.带参数申明:

DELCARECURSORc_stu(p_idstudent.ID%TYPE)SELECT*FROMstudentWHEREID=p_id;

  3)打开游标:

OPENCursor_name;

/*相当于执行select语句,且把执行结果存入CURSOR;

  4)从游标中取数:

a.FETCHcursor_nameINTOvar1,var2,...;

/*变量的数量、类型、顺序要和Table中字段一致;

*/

  b.FETCHcursor_nameINTOrecord_var;

将值从CURSOR取出放入变量中,每FETCH一次取一条记录;

  5)关闭游标:

CLOSECursor_name;

a.游标使用后应该关闭;

  b.关闭后的游标不能FETCH和再次CLOSE;

  c.关闭游标相当于将内存中CURSOR的内容清空;

  2.游标的属性

1)%FOUND:

是否有值;

  2)%NOTFOUND:

是否没有值;

  3)%ISOPEN:

是否是打开状态;

  4)%ROWCOUNT:

CURSOR当前的记录号;

  3.游标的FETCH循环

1)LOOP

  FETCHcursorINTO...

  EXITWHENcursor%NOTFOUND;

/*当cursor中没记录后退出*/

  2)WHILEcursor%FOUNDLOOP

  3)FORvarINcursorLOOP

  FETCHcursorINTO...

  

  第六章

  1.异常

  e_TooManyStudentsEXCEPTION;

/*申明异常*/

  BEGIN

  RAISEe_TooManyStudents;

/*触发异常*/

  EXCEPTION

  WHENe_TooManyStudentsTHEN/*触发异常*/

  WHENOTHERSTHEN/*处理所有其他异常*/

  2004-9-8星期三阴

  PL/SQL数据库编程(下)

  1.存储过程(PROCEDURE)

创建过程:

  CREATE[ORREPLACE]PROCEDUREproc_name

  [(arg_name[{IN|OUT|INOUT}]TYPE,

  arg_name[{IN|OUT|INOUT}]TYPE)]

  {IS|AS}

  procedure_body

  1)IN:

表示该参数不能被赋值(只能位于等号右边);

  2)OUT:

表示该参数只能被赋值(只能位于等号左边);

  3)INOUT:

表示该类型既能被赋值也能传值;

  2.存储过程例子

CREATEORREPLACEPROCEDUREModeTest(

  p_InParmINNUMBER,

  p_OutParmOUTNUMBER,

  p_InOutParmINOUTNUMBER)

  IS

  v_LocalVarNUMBER;

/*声明部分*/

  v_LocalVar:

=p_InParm;

/*执行部分*/

  p_OutParm:

=7;

  p_InOutParm:

  .../*异常处理部分*/

  ENDModeTest;

  3.调用PROCEDURE的例子

1)匿名块可以调;

  2)其他PROCDEURE可以调用;

  v_var1NUMBER;

  ModeTest(12,v_var1,10);

此时v_var1等于7

  4.指定实参的模式

1)位置标示法:

调用时添入所有参数,实参与形参按顺序一一对应;

  2)名字标示法:

调用时给出形参名字,并给出实参

  ModeTest(p_InParm=>

12,p_OutParm=>

v_var1,p_Inout=>

10);

a.两种方法可以混用;

  b.混用时第一个参数必须通过位置来指定。

  5.函数(Function)与过程(Procedure)的区别

1)过程调用本身是一个PL/SQL语句(可以在命令行中通过exec语句直接调用);

  2)函数调用是表达式的一部分;

  6.函数的声明

CREATE[ORREPLACE]PROCEDUREproc_name

  RETURNTYPE

1)没有返回语句的函数将是一个错误;

  7.删除过程与函数

DROPPROCEDUREproc_name;

  DROPFUNCTIONfunc_name;

  第八章

  1.包

1)包是可以将相关对象存储在一起的PL/SQL的结构;

  2)包只能存储在数据库中,不能是本地的;

  3)包是一个带有名字的声明;

  4)相当于一个PL/SQL块的声明部分;

  5)在块的声明部分出现的任何东西都能出现在包中;

  6)包中可以包含过程、函数、游标与变量;

  7)可以从其他PL/SQL块中引用包,包提供了可用于PL/SQL的全局变量。

  8)包有包头和包主体,如包头中没有任何函数与过程,则包主体可以不需要。

  2.包头

1)包头包含了有关包的内容的信息,包头不含任何过程的代码。

  2)语法:

  CREATE[ORREPLACE]PACKAGEpack_name{IS|AS}

  procedure_specification|function_specification|variable_declaration|type_definition|exception_declaration|cursor_declaration

  ENDpack_name;

  CREATEORREPLACEPACKAGEpak_testAS

  PROCEDURERemoveStudent(p_StuIDINstudents.id%TYPE);

  TYPEt_StuIDTableISTABLEOFstudents.id%TYPEINDEXBYBINARY_INTEGER;

  ENDpak_test;

  3.包主体

1)包主体是可选的,如包头中没有任何函数与过程,则包主体可以不需要。

  2)包主体与包头存放在不同的数据字典中。

  3)如包头编译不成功,包主体无法正确编译。

  4)包主体包含了所有在包头中声明的所有过程与函数的代码。

  5)示例:

  CREATEORREPLACEPACKAGEBODYpak_testAS

  PROCEDURERemoveStudent(p_StuIDINstudents.id%TYPE)IS

  ENDRemoveStudent;

  4.包的作用域

1)在包外调用包中过程(需加包名):

pak_test.AddStudent(100010,'

CS'

101);

  2)在包主体中可以直接使用包头中声明的对象和过程(不需加包名);

  5.包中子程序的重载

1)同一个包中的过程与函数都可以重载;

  2)相同的过程或函数名字,但参数不同;

  6.包的初始化

1)包存放在数据库中;

  2)在第一次被调用的时候,包从数据库中调入内存并被初始化;

  3)包中定义的所有变量都被分配内存;

  4)每个会话都将拥有自己的包内变量的副本。

  第九章

  1.触发器

1)触发器与过程/函数的相同点

  a.都是带有名字的执行块;

  b.都有声明、执行体和异常部分;

  2)触发器与过程/函数的不同点

  a.触发器必须存储在数据库中;

  b.触发器自动执行;

  2.创建触发器

1)语法:

  CREATE[ORREPLACE]TRIGGERtrigger_name

  {BEFORE|AFTER}triggering_eventONtable_reference

  [FOREACHROW[WHENtrigger_condition]]

  trigger_body;

  2)范例:

  CREATEORREPLACETRIGGERUpdateMajorStatsAFTERINSERTORDELETEORUPDATEONstudents

  CURSORc_StatisticsIS

  SELECT*FROMstudentsGROUPBYmajor;

  ENDUp;

  3.触发器

1)三个语句(INSERT/UPDATE/DELETE);

  2)二种类型(之前/之后);

  3)二种级别(row-level/statement-level);

  所以一共有3X2X2=12

  4.触发器的限制

1)不应该使用事务控制语句;

  2)不能声明任何LONG或LONGRAW变量;

  3)可以访问的表有限。

  5.触发器的主体可以访问的表

1)不可以读取或修改任何变化表(被DML语句正在修改的表);

  2)不可以读取或修改限制表(带有约束的表)的主键、唯一值、外键列。

  (4)Java开发中使用Oracle的ORA-01000

  很多朋友在Java开发中,使用Oracle数据库的时候,经常会碰到有ORA-01000:

maximumopencursorsexceeded.的错误。

  实际上,这个错误的原因,主要还是代码问题引起的。

  ora-01000:

maximumopencursorsexceeded.

  表示已经达到一个进程打开的最大游标数。

  这样的错误很容易出现在Java代码中的主要原因是:

Java代码在执行conn.createStatement()和conn.prepareStatement()的时候,实际上都是相当与在数据库中打开了一个cursor。

尤其是,如果你的createStatement和prepareStatement是在一个循环里面的话,就会非常容易出现这个问题。

因为游标一直在不停的打开,而且没有关闭。

  一般来说,我们在写Java代码的时候,createStatement和prepareStatement都应该要放在循环外面,而且使用了这些Statment后,及时关闭。

最好是在执行了一次executeQuery、executeUpdate等之后,如果不需要使用结果集(ResultSet)的数据,就马上将Statment关闭。

  对于出现ORA-01000错误这种情况,单纯的加大open_cursors并不是好办法,那只是治标不治本。

实际上,代码中的隐患并没有解除。

  而且,绝大部分情况下,open_cursors只需要设置一个比较小的值,就足够使用了,除非有非常特别的要求。

  (5)在storeprocedure中执行DDL语句

  一是:

executeimmediate'

update'

||table_chan||'

set'

||column_changed||'

='

'

||v_trans_name||'

whereempid='

||v_empid||'

;

  二是:

TheDBMS_SQLpackagecanbeusedtoexecuteDDLstatementsdirectlyfromPL/SQL.

  这是一个创建一个表的过程的例子。

该过程有两个参数:

表名和字段及其类型的列表。

  CREATEORREPLACEPROCEDUREddlproc(tablenamevarchar2,colsvarchar2)AS

  cursor1INTEGER;

  BEGIN

  cursor1:

=dbms_sql.open_cursor;

  dbms_sql.parse(cursor1,'

CREATETABLE'

||tablename||'

('

||cols||'

)'

dbms_sql.v7);

  dbms_sql.close_cursor(cursor1);

  end;

  /

  2如何找数据库表的主键字段的名称?

  SQL>

SELECT*FROMuser_constraints

  WHERECONSTRAINT_TYPE='

P'

andtable_name='

TABLE_NAME'

  3如何查询数据库有多少表?

select*fromall_tables;

  4使用sql统配符

  通配符描述示例%包含零个或更多字符的任意字符串。

WHEREtitleLIKE'

%computer%'

将查找处于书名任意位置的包含单词computer的所有书名。

_(下划线)任何单个字符。

WHEREau_fnameLIKE'

_ean'

将查找以ean结尾的所有4个字母的名字(Dean、Sean等)。

[]指定范围([a-f])或集合([abcdef])中的任何单个字符。

WHEREau_lname

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 经管营销 > 生产经营管理

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2