仓酷云

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 1265|回复: 18
打印 上一主题 下一主题

[学习教程] JAVA网页设计Oracle数据库游标利用

[复制链接]
若相依 该用户已被删除
跳转到指定楼层
楼主
发表于 2015-1-18 11:38:39 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
什么时候上述的三种开发工具能和三为一,什么时候java的竞争力才更强,才有机会拉拢更多的程序员投入到对java的开发上,因为到时的开发工具将会比.net的更简单。还有一点也很关键,什么时候java推出的jsf能成为真正意义上的标准。oracle|数据|数据库|游标SQL是用于会见ORACLE数据库的言语,PL/SQL扩大和增强了SQL的功效,它同时引进了更强的程序逻辑。PL/SQL撑持DML命令和SQL的事件把持语句。DDL在PL/SQL中不被撑持,这就意味作在PL/SQL程序块中不克不及创立表或其他任何对象。较好的PL/SQL程序计划是在PL/SQL块中利用象DBMS_SQL如许的内建包或实行EXECUTEIMMEDIATE命令创建静态SQL来实行DDL命令,PL/SQL编译器包管对象援用和用户的权限。

  上面我们将会商各类用于会见ORACLE数据库的DDL和TCL语句。

  查询

  SELECT语句用于从数据库中查询数据,当在PL/SQL中利用SELECT语句时,要与INTO子句一同利用,查询的前往值被付与INTO子句中的变量,变量的声明是在DELCARE中。SELECTINTO语法以下:

SELECT[DISTICT|ALL]{*|column[,column,...]}
INTO(variable[,variable,...]|record)
FROM{table|(sub-query)}[alias]
WHERE............

  PL/SQL中SELECT语句只前往一行数据。假如凌驾一行数据,那末就要利用显式游标(对游标的会商我们将在前面举行),INTO子句中要有与SELECT子句中不异列数目的变量。INTO子句中也能够是纪录变量。

  %TYPE属性

  在PL/SQL中能够将变量和常量声明为内建或用户界说的数据范例,以援用一个列名,同时承继他的数据范例和巨细。这类静态赋值办法长短常有效的,好比变量援用的列的数据范例和巨细改动了,假如利用了%TYPE,那末用户就不用修正代码,不然就必需修正代码。

 例:

v_empnoSCOTT.EMP.EMPNO%TYPE;
v_salaryEMP.SALARY%TYPE;

  不仅列名可使用%TYPE,并且变量、游标、纪录,或声明的常量都可使用%TYPE。这关于界说不异数据范例的变量十分有效。

DELCARE
V_ANUMBER(5):=10;
V_BV_A%TYPE:=15;
V_CV_A%TYPE;
BEGIN
DBMS_OUTPUT.PUT_LINE
(V_A=||V_A||V_B=||V_B||V_C=||V_C);
END

SQL>/
V_A=10V_B=15V_C=
PL/SQLproceduresuccessfullycompleted.

SQL>

  其他DML语句

  别的操纵数据的DML语句是:INSERT、UPDATE、DELETE和LOCKTABLE,这些语句在PL/SQL中的语法与在SQL中的语法不异。我们在后面已会商过DML语句的利用这里就不再反复了。在DML语句中可使用任安在DECLARE部分声明的变量,假如是嵌套块,那末要注重变量的感化局限。

  例:

CREATEORREPLACEPROCEDUREFIRE_EMPLOYEE(pempnoinnumber)
 AS
  v_enameEMP.ENAME%TYPE;
 BEGIN
  SELECTenameINTOv_ename
  FROMemp
  WHEREempno=p_empno;

  INSERTINTOFORMER_EMP(EMPNO,ENAME)
  VALUES(p_empno,v_ename);

  DELETEFROMemp
  WHEREempno=p_empno;

  UPDATEformer_emp
  SETdate_deleted=SYSDATE
  WHEREempno=p_empno;

  EXCEPTION
   WHENNO_DATA_FOUNDTHEN
   DBMS_OUTPUT.PUT_LINE(EmployeeNumberNotFound!);

 END

  DML语句的了局

  当实行一条DML语句后,DML语句的了局保留在四个游标属性中,这些属性用于把持程序流程大概懂得程序的形态。当运转DML语句时,PL/SQL翻开一个内建游标并处置了局,游标是保护查询了局的内存中的一个地区,游标在运转DML语句时翻开,完成后封闭。隐式游标只利用SQL%FOUND,SQL%NOTFOUND,SQL%ROWCOUNT三个属性.SQL%FOUND,SQL%NOTFOUND是布尔值,SQL%ROWCOUNT是整数值。

  SQL%FOUND和SQL%NOTFOUND

  在实行任何DML语句前SQL%FOUND和SQL%NOTFOUND的值都是NULL,在实行DML语句后,SQL%FOUND的属性值将是:

  .TRUE:INSERT

  .TRUE:DELETE和UPDATE,最少有一行被DELETE或UPDATE.

  .TRUE:SELECTINTO最少前往一行

  当SQL%FOUND为TRUE时,SQL%NOTFOUND为FALSE。

  SQL%ROWCOUNT

  在实行任何DML语句之前,SQL%ROWCOUNT的值都是NULL,关于SELECTINTO语句,假如实行乐成,SQL%ROWCOUNT的值为1,假如没有乐成,SQL%ROWCOUNT的值为0,同时发生一个非常NO_DATA_FOUND.

  SQL%ISOPEN

  SQL%ISOPEN是一个布尔值,假如游标翻开,则为TRUE,假如游标封闭,则为FALSE.关于隐式游标而言SQL%ISOPEN老是FALSE,这是由于隐式游标在DML语句实行时翻开,停止时就当即封闭。

  事件把持语句

  事件是一个事情的逻辑单位能够包含一个或多个DML语句,事物把持匡助用户包管数据的分歧性。假如事件把持逻辑单位中的任何一个DML语句失利,那末全部事件都将回滚,在PL/SQL顶用户能够明白地利用COMMIT、ROLLBACK、SAVEPOINT和SETTRANSACTION语句。

  COMMIT语句停止事件,永世保留数据库的变更,同时开释一切LOCK,ROLLBACK停止现行事件开释一切LOCK,但不保留数据库的任何变更,SAVEPOINT用于设置两头点,当事件挪用过量的数据库操纵时,两头点长短常有效的,SETTRANSACTION用于设置事件属性,好比read-write和断绝级等。

  显式游标

  当查询前往了局凌驾一行时,就必要一个显式游标,此时用户不克不及利用selectinto语句。PL/SQL办理隐式游标,当查询入手下手时隐式游标翻开,查询停止时隐式游标主动封闭。显式游标在PL/SQL块的声明部分声明,在实行部分或非常处置部分翻开,取数据,封闭。下表显现了显式游标和隐式游标的不同:

                 表1隐式游标和显式游标
隐式游标显式游标
PL/SQL保护,当实行查询时主动翻开和封闭在程序中显式界说、翻开、封闭,游标有一个名字。
游标属性前缀是SQL游标属性的前缀是游标名
属性%ISOPEN老是为FALSE%ISOPEN依据游标的形态断定值
SELECT语句带有INTO子串,只要一行数据被处置能够处置多行数据,在程序中设置轮回,掏出每行数据。

 利用游标

  这里要做一个声明,我们所说的游标一般是指显式游标,因而从如今起没有出格指明的情形,我们所说的游标都是指显式游标。要在程序中利用游标,必需起首声明游标。

  声明游标

  语法:

CURSORcursor_nameISselect_statement;

  在PL/SQL中游标名是一个未声明变量,不克不及给游标名赋值或用于表达式中。

  例:

DELCARE
CURSORC_EMPISSELECTempno,ename,salary
FROMemp
WHEREsalary>2000
ORDERBYename;
........
BEGIN

  在游标界说中SELECT语句中纷歧定非要表能够是视图,也能够从多个表或视图当选择的列,乃至可使用*来选择一切的列。

  翻开游标

  利用游标中的值之前应当起首翻开游标,翻开游标初始化查询处置。翻开游标的语法是:

OPENcursor_name

  cursor_name是在声明部分界说的游标名。

  例:

OPENC_EMP;

  封闭游标

  语法:

CLOSEcursor_name

  例:

CLOSEC_EMP;

  从游标提取数据

  从游标失掉一行数据利用FETCH命令。每次提取数据后,游标都指向了局集的下一行。语法以下:

FETCHcursor_nameINTOvariable[,variable,...]

  关于SELECT界说的游标的每列,FETCH变量列表都应当有一个变量与之绝对应,变量的范例也要不异。

  例:

SETSERVERIUTPUTON
DECLARE
v_enameEMP.ENAME%TYPE;
v_salaryEMP.SALARY%TYPE;
CURSORc_empISSELECTename,salaryFROMemp;
BEGIN
OPENc_emp;
FETCHc_empINTOv_ename,v_salary;
DBMS_OUTPUT.PUT_LINE(SalaryofEmployee||v_ename
||is||v_salary);
FETCHc_empINTOv_ename,v_salary;
DBMS_OUTPUT.PUT_LINE(SalaryofEmployee||v_ename
||is||v_salary);
FETCHc_empINTOv_ename,v_salary;
DBMS_OUTPUT.PUT_LINE(SalaryofEmployee||v_ename
||is||v_salary);
CLOSEc_emp;
END

  这段代码无疑长短常贫苦的,假如有多行前往了局,可使用轮回并用游标属性为停止轮回的前提,以这类体例提取数据,程序的可读性和简便性都年夜为进步,上面我们利用轮回从头写下面的程序:

SETSERVERIUTPUTON
DECLARE
v_enameEMP.ENAME%TYPE;
v_salaryEMP.SALARY%TYPE;
CURSORc_empISSELECTename,salaryFROMemp;
BEGIN
OPENc_emp;
LOOP
FETCHc_empINTOv_ename,v_salary;
EXITWHENc_emp%NOTFOUND;
DBMS_OUTPUT.PUT_LINE(SalaryofEmployee||v_ename
||is||v_salary);
END

  纪录变量

  界说一个纪录变量利用TYPE命令和%ROWTYPE,关于%ROWsTYPE的更多信息请参阅相干材料。

  纪录变量用于从游标中提取数据行,当游标选择良多列的时分,那末利用纪录比为每列声明一个变量要便利很多。

  当在表上利用%ROWTYPE并将从游标中掏出的值放进纪录中时,假如要选择表中一切列,那末在SELECT子句中利用*比将一切列名列出来要平安很多。

  例:

SETSERVERIUTPUTON
DECLARE
R_empEMP%ROWTYPE;
CURSORc_empISSELECT*FROMemp;
BEGIN
OPENc_emp;
LOOP
FETCHc_empINTOr_emp;
EXITWHENc_emp%NOTFOUND;
DBMS_OUT.PUT.PUT_LINE(SalaryofEmployee||r_emp.ename||is||r_emp.salary);
ENDLOOP;
CLOSEc_emp;
END;

  %ROWTYPE也能够用游标名来界说,如许的话就必需要起首声明游标:

SETSERVERIUTPUTON
DECLARE
CURSORc_empISSELECTename,salaryFROMemp;
R_empc_emp%ROWTYPE;
BEGIN
OPENc_emp;
LOOP
FETCHc_empINTOr_emp;
EXITWHENc_emp%NOTFOUND;
DBMS_OUT.PUT.PUT_LINE(SalaryofEmployee||r_emp.ename||is||r_emp.salary);
ENDLOOP;
CLOSEc_emp;
END;

  带参数的游标

  与存储历程和函数类似,能够将参数传送给游标并在查询中利用。这关于处置在某种前提下翻开游标的情形十分有效。它的语法以下:

CURSORcursor_name[(parameter[,parameter],...)]ISselect_statement;

  界说参数的语法以下:

Parameter_name[IN]data_type[{:=|DEFAULT}value]

  与存储历程分歧的是,游标只能承受传送的值,而不克不及前往值。参数只界说数据范例,没有巨细。

  别的能够给参数设定一个缺省值,当没有参数值传送给游标时,就利用缺省值。游标中界说的参数只是一个占位符,在别处援用该参数纷歧定牢靠。

  在翻开游标时给参数赋值,语法以下:

OPENcursor_name[value[,value]....];

  参数值能够是笔墨或变量。

  例:

DECALRE

CURSORc_deptISSELECT*FROMdeptORDERBYdeptno;
CURSORc_emp(p_deptVARACHAR2)IS
SELECTename,salary
FROMemp
WHEREdeptno=p_dept
ORDERBYename
r_deptDEPT%ROWTYPE;
v_enameEMP.ENAME%TYPE;
v_salaryEMP.SALARY%TYPE;
v_tot_salaryEMP.SALARY%TYPE;

BEGIN

OPENc_dept;
LOOP
FETCHc_deptINTOr_dept;
EXITWHENc_dept%NOTFOUND;
DBMS_OUTPUT.PUT_LINE(Department:||r_dept.deptno||-||r_dept.dname);
v_tot_salary:=0;
OPENc_emp(r_dept.deptno);
LOOP
FETCHc_empINTOv_ename,v_salary;
EXITWHENc_emp%NOTFOUND;
DBMS_OUTPUT.PUT_LINE(Name:||v_ename||salary:||v_salary);
v_tot_salary:=v_tot_salary+v_salary;
ENDLOOP;
CLOSEc_emp;
DBMS_OUTPUT.PUT_LINE(ToltalSalaryfordept:||v_tot_salary);
ENDLOOP;
CLOSEc_dept;
END;



游标FOR轮回

  在年夜多半时分我们在计划程序的时分都遵守上面的步骤:

  1、翻开游标

  2、入手下手轮回

  3、从游标中取值

  4、反省那一行被前往

  5、处置

  6、封闭轮回

  7、封闭游标

  能够复杂的把这一类代码称为游标用于轮回。但另有一种轮回与这类范例不不异,这就是FOR轮回,用于FOR轮回的游标依照一般的声明体例声明,它的长处在于不必要显式的翻开、封闭、取数据,测试数据的存在、界说寄存数据的变量等等。游标FOR轮回的语法以下:

FORrecord_nameIN
(corsor_name[(parameter[,parameter]...)]
|(query_difinition)
LOOP
statements
ENDLOOP;

  上面我们用for轮回重写下面的例子:

DECALRE

CURSORc_deptISSELECTdeptno,dnameFROMdeptORDERBYdeptno;
CURSORc_emp(p_deptVARACHAR2)IS
SELECTename,salary
FROMemp
WHEREdeptno=p_dept
ORDERBYename

v_tot_salaryEMP.SALARY%TYPE;

BEGIN

FORr_deptINc_deptLOOP
DBMS_OUTPUT.PUT_LINE(Department:||r_dept.deptno||-||r_dept.dname);
v_tot_salary:=0;
FORr_empINc_emp(r_dept.deptno)LOOP
DBMS_OUTPUT.PUT_LINE(Name:||v_ename||salary:||v_salary);
v_tot_salary:=v_tot_salary+v_salary;
ENDLOOP;
DBMS_OUTPUT.PUT_LINE(ToltalSalaryfordept:||v_tot_salary);
ENDLOOP;

END;

  在游标FOR轮回中利用查询

  在游标FOR轮回中能够界说查询,因为没有显式声明以是游标没着名字,纪录名经由过程游标查询来界说。

DECALRE

 v_tot_salaryEMP.SALARY%TYPE;

BEGIN

 FORr_deptIN(SELECTdeptno,dnameFROMdeptORDERBYdeptno)LOOP
  DBMS_OUTPUT.PUT_LINE(Department:||r_dept.deptno||-||r_dept.dname);
  v_tot_salary:=0;
  FORr_empIN(SELECTename,salary
   FROMemp
   WHEREdeptno=p_dept
   ORDERBYename)LOOP
  DBMS_OUTPUT.PUT_LINE(Name:||v_ename||salary:||v_salary);
  v_tot_salary:=v_tot_salary+v_salary;
  ENDLOOP;
  DBMS_OUTPUT.PUT_LINE(ToltalSalaryfordept:||v_tot_salary);
 ENDLOOP;

END;

  游标中的子查询

  语法以下:

CURSORC1ISSELECT*FROMemp
WHEREdeptnoNOTIN(SELECTdeptno
FROMdept
WHEREdname!=ACCOUNTING);

  能够看出与SQL中的子查询没有甚么区分。

  游标中的更新和删除

  在PL/SQL中仍然可使用UPDATE和DELETE语句更新或删除数据行。显式游标只要在必要取得多行数据的情形下利用。PL/SQL供应了仅仅利用游标就能够实行删除或更新纪录的办法。

  UPDATE或DELETE语句中的WHERECURRENTOF子串专门处置要实行UPDATE或DELETE操纵的表中掏出的比来的数据。要利用这个办法,在声明游标时必需利用FORUPDATE子串,当对话利用FORUPDATE子串翻开一个游标时,一切前往会合的数据行都将处于行级(ROW-LEVEL)独有式锁定,其他对象只能查询这些数据行,不克不及举行UPDATE、DELETE或SELECT...FORUPDATE操纵。

  语法:

FORUPDATE[OF[schema.]table.column[,[schema.]table.column]..
[nowait]

  在多表查询中,利用OF子句来锁定特定的表,假如疏忽了OF子句,那末一切表当选择的数据行都将被锁定。假如这些数据行已被其他会话锁定,那末一般情形下ORACLE将守候,直到数据行解锁。

  在UPDATE和DELETE中利用WHERECURRENTOF子串的语法以下:

WHERE{CURRENTOFcursor_name|search_condition}

  例:

DELCARE

CURSORc1ISSELECTempno,salary
FROMemp
WHEREcommISNULL
FORUPDATEOFcomm;

v_commNUMBER(10,2);

BEGIN

FORr1INc1LOOP

IFr1.salary<500THEN
v_comm:=r1.salary*0.25;
ELSEIFr1.salary<1000THEN
v_comm:=r1.salary*0.20;
ELSEIFr1.salary<3000THEN
v_comm:=r1.salary*0.15;
ELSE
v_comm:=r1.salary*0.12;
ENDIF;

UPDATEemp;
SETcomm=v_comm
WHERECURRENTOFc1l;

ENDLOOP;
END



windows系统样,他们做了什么事或者留了一些后门程序,谁都不知道,二,java开发是跨平台,任何系统上都可以运行,对于保密型系统和大型系统开发这是必要的
灵魂腐蚀 该用户已被删除
沙发
发表于 2015-1-21 11:49:29 | 只看该作者
如果要向java web方向发展也要吧看看《Java web从入门到精通》学完再到《Struts2.0入门到精通》这样你差不多就把代码给学完了。有兴趣可以看一些设计模块和框架的包等等。
海妖 该用户已被删除
板凳
发表于 2015-1-25 12:15:52 | 只看该作者
应用在电视机、电话、闹钟、烤面包机等家用电器的控制和通信。由于这些智能化家电的市场需求没有预期的高,Sun公司放弃了该项计划。随着1990年代互联网的发展
简单生活 该用户已被删除
地板
发表于 2015-1-29 15:40:32 | 只看该作者
Java语言支持Internet应用的开发,在基本的Java应用编程接口中有一个网络应用编程接口(java net),它提供了用于网络应用编程的类库,包括URL、URLConnection、Socket、ServerSocket等。Java的RMI(远程方法激活)机制也是开发分布式应用的重要手段。
小妖女 该用户已被删除
5#
发表于 2015-1-29 16:44:54 | 只看该作者
Java语言支持Internet应用的开发,在基本的Java应用编程接口中有一个网络应用编程接口(java net),它提供了用于网络应用编程的类库,包括URL、URLConnection、Socket、ServerSocket等。Java的RMI(远程方法激活)机制也是开发分布式应用的重要手段。
只想知道 该用户已被删除
6#
发表于 2015-2-6 02:46:02 | 只看该作者
吧,现在很流行的Structs就是它的一种实现方式,不过Structs用起来实在是很繁,我们只要学习其精髓即可,我们完全可以设计自己的MVC结构。然后你再研究一下软件Refactoring (重构)和极限XP编程,相信你又会上一个台阶。 做完这些,你不如整理一下你的Java代码,把那些经典的程序和常见的应用整理出来,再精心打造一番,提高其重用性和可扩展性。你再找几个志同道合的朋友成立一个工作室吧
爱飞 该用户已被删除
7#
发表于 2015-2-9 07:13:46 | 只看该作者
在全球云计算和移动互联网的产业环境下,Java更具备了显著优势和广阔前景。
飘飘悠悠 该用户已被删除
8#
发表于 2015-2-9 10:20:43 | 只看该作者
Java 不同于一般的编译执行计算机语言和解释执行计算机语言。它首先将源代码编译成二进制字节码(bytecode),然后依赖各种不同平台上的虚拟机来解释执行字节码。从而实现了“一次编译、到处执行”的跨平台特性。
乐观 该用户已被删除
9#
发表于 2015-2-9 22:45:20 | 只看该作者
自从Sun推出Java以来,就力图使之无所不包,所以Java发展到现在,按应用来分主要分为三大块:J2SE,J2ME和J2EE,这也就是Sun ONE(Open Net Environment)体系。J2SE就是Java2的标准版,主要用于桌面应用软件的编程;J2ME主要应用于嵌入是系统开发,如手机和PDA的编程;J2EE是Java2的企业版,主要用于分布式的网络程序的开发,如电子商务网站和ERP系统。
飘灵儿 该用户已被删除
10#
发表于 2015-2-28 03:20:12 | 只看该作者
Java语言支持Internet应用的开发,在基本的Java应用编程接口中有一个网络应用编程接口(java net),它提供了用于网络应用编程的类库,包括URL、URLConnection、Socket、ServerSocket等。Java的RMI(远程方法激活)机制也是开发分布式应用的重要手段。
11#
发表于 2015-3-1 01:13:52 | 只看该作者
另外编写和运行Java程序需要JDK(包括JRE),在sun的官方网站上有下载,thinking in java第三版用的JDK版本是1.4,现在流行的版本1.5(sun称作J2SE 5.0,汗),不过听说Bruce的TIJ第四版国外已经出来了,是专门为J2SE 5.0而写的。
若相依 该用户已被删除
12#
 楼主| 发表于 2015-3-10 11:03:12 | 只看该作者
是一种使网页(Web Page)产生生动活泼画面的语言
不帅 该用户已被删除
13#
发表于 2015-3-17 06:11:28 | 只看该作者
Java 不同于一般的编译执行计算机语言和解释执行计算机语言。它首先将源代码编译成二进制字节码(bytecode),然后依赖各种不同平台上的虚拟机来解释执行字节码。从而实现了“一次编译、到处执行”的跨平台特性。
透明 该用户已被删除
14#
发表于 2015-3-23 23:07:48 | 只看该作者
J2SE开发桌面应用软件比起 VC,VB,DEPHI这些传统开发语言来说,优势好象并不明显。J2ME对于初学者来说,好象又有点深奥,而且一般开发者很难有开发环境。
金色的骷髅 该用户已被删除
15#
发表于 2015-3-30 15:49:09 | 只看该作者
设计模式是高级程序员真正掌握面向对象核心思想的必修课。设计模式并不是一种具体"技术",它讲述的是思想,它不仅仅展示了接口或抽象类在实际案例中的灵活应用和智慧
若天明 该用户已被删除
16#
发表于 2015-4-28 06:49:14 | 只看该作者
是一种将安全性(Security)列为第一优先考虑的语言
第二个灵魂 该用户已被删除
17#
发表于 2015-5-10 03:39:27 | 只看该作者
是一种使用者不需花费很多时间学习的语言
深爱那片海 该用户已被删除
18#
发表于 2015-5-10 14:51:00 | 只看该作者
至于JDBC,就不用我多说了,你如果用java编过存取数据库的程序,就应该很熟悉。还有,如果你要用Java编发送电子邮件的程序,你就得看看Javamail 了。
莫相离 该用户已被删除
19#
发表于 2015-6-28 20:21:03 | 只看该作者
[url]http://www.jdon.com/[/url]去下载,或到同济技术论坛的服务器[url]ftp://nro.shtdu.edu.cn[/url]去下,安装上有什么问题,可以到论坛上去提问。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|仓酷云 鄂ICP备14007578号-2

GMT+8, 2024-5-8 16:43

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表