|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
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开发是跨平台,任何系统上都可以运行,对于保密型系统和大型系统开发这是必要的 |
|