Oracle返回table或cursor或object类型结果集_第1页
Oracle返回table或cursor或object类型结果集_第2页
Oracle返回table或cursor或object类型结果集_第3页
Oracle返回table或cursor或object类型结果集_第4页
Oracle返回table或cursor或object类型结果集_第5页
已阅读5页,还剩47页未读 继续免费阅读

付费下载

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

目录TOC\o"1-5"\h\z用户、权限、表空间基本查询3Oralce数据库Mergeinto详细介绍6Oracle的function中怎么返回表变量?11Oracle使用函数function查询数据返回游标13pl/sql存储过程返回record类型的结果,java里如何调用呢?23OracleOBJECTS型的函数使用24Oracle返回对象(结构)类型28数组做为参数传入Oracle存储过程操作数据库32数组里存储的是String、int、lang等基本数据类型或引用数据类型(不包括javabean)32传入单个javabean35数组里存储的是javabean39总结44用户、权限、表空间基本查询c:\>sqlplus/nologSQL>connreview输入口令:已连接。SQL>selecttable_namefromuser_tables;TABLE_NAMEUSERJNFOMAJORCLASS_UNITSTUDENTCOURSETEACHERCOURSE_LECTURECOURSE_SCHEDULE已选择8行。SQL>有时候需要导出某用户下的所有table、view>sequencetrigger等信息,查看用户下所有的表select*fromuser_tables;select*fromuser_views;select*fromuser_sequences;select*fromuser_triggers;1.用户与权限卜面的SQL可以将这些信息select出来:查看当前用户的缺省表空间selectusername,default_tablespacefromuser_users;查看当前用户的角色一一select*fromuser_role_privs;查看当前用户的素统权证和表级权限select*fromuser_sys_privs;select*fromuser_tab_privs;'GAME;显示指定用户所历白殊统权限'GAME;select*fromdba_sys_privswheregrantee=显示当前会话所具有的权限select*fromsession_privs;.用户对象查看名称包含10g字符的用户对象,包括TYPETYPEBODYPROCEDUREFUNCTIONselectobject_name,object_idfromuser_objectswhereinstr(object_name,'LOG)>0;查看某表的创建时间selectobject_name,createdfromuser_objectswhereobject_name=upper('&table_name');查看某表物理空间的大小selectsum(bytes)/(1024*1024)as“size(M)”fromuser_segmentswheresegment_name=upper('&table_name');.表、序列、视图、同义词查看放在ORACLE勺内存区里的表selecttable_name,cachefromuser_tableswhereinstr(cache,'Y')>0;查看索引个数和类别selectindex_name,index_type,table_namefromuser_indexesorderbytable_name;查看索引被秦引的字段----select*fromuser_ind_columnswhereindex_name=upper('&index_name');查看索引物理空间的大小selectsum(bytes)/(1024*1024)as“size(M)”fromuser_segmeritswheresegment_name=upper("&index_name");查看序列号,last_number是当前值select*fromuser_sequences;查看视图的名称selectview_namefromuser_views;查看创建视图的select语句setview_name,text_lengthfromuser_views;selecttextfromuser_viewswhereview_name=upper('&view_name查看同义词的名称select*fromuser_synonyms;.约束查看某表的约束条件selectconstraint_name,constraint_type,search_condition,r_constraint_namefromuser_constraintswheretable_name=upper('&table_name');selectc.constraint_name,c.constraint_type,cc.column_namefromuser_constraintsc,user_cons_columnsccwherec.owner=upper('&table_owner')andc.table_name=upper(andc.owner=cc.ownerandc.constraint_name=cc.constraint_nameorderbycc.position;.函数和过程查看函数和过程的状态selectobject_name,statusfromuser_objectswhereobject_type=selectobject_name,statusfromuser_objectswhereobject_type=&table_name')'FUNCTION;'PROCEDURE查看函数和过程的源代码selecttextfromall_sourcewhereowner=userandname=upper('&plsql_name');Oralce数据库Mergeinto详细介绍MERGE语句是Oracle9i新增的语法,用来合并UPDATE和INSERT语句。通过MERGE语句,根据一张表或子查询的连接条件对另外一张表进行查询,连接条件匹配上的进行UPDATE,无法匹配的执行INSERT。这个语法仅需要一次全表扫描就完成了全部工作,执行效率要高于INSERT+UPDATE。言吾法:MERGE[INTO[schema.]table[t_alias]USING[schema.]{table|view|subquery}[t_alias]ON(condition)WHENMATCHEDTHENmerge_update_clauseWHENNOTMATCHEDTHENmerge_insert_clause;语法:MERGEINTO[yourtable-name][renameyourtablehere]USING([writeyourqueryhere])[renameyourquery-sqlandusingjustlikeatable]ON([conditionalexpressionhere]AND[…]…)WHENMATHEDTHEN[hereyoucanexecutesomeupdatesqlorsomethingelse]WHENNOTMATHEDTHEN[executesomethingelsehere!]1,可省略的update或者insertMERGEINTOproductspUSINGnewproductsnpON(duct_id=duct_id)WHENMATCHEDTHENUPDATE

SETduct_name=duct_name,p.category=np.category;使用表newproducts中的product_name和category字段来更新表products中相同product_id的product_nameftcategory.2,当条件不满足的时候把newproducts表中的数据INSERT到表products中。MERGEINTOproductspUSINGnewproductsnpON(duct_id=duct_id)WHENNOTMATCHEDTHENINSERT(PRODUCT_ID,PRODUCT_NAME,CATEGORY)VALUES(duct_id,duct_name,np.category);3,带条件的insert和updateMERGEINTOproductspUSINGnewproductsnpON(duct_id=duct_id)WHENMATCHEDTHENUPDATESETduct_name=duct_nameWHEREp.category=np.category;MERGEINTOPRODUCTSPUSINGNEWPRODUCTSNPON(P.PRODUCT_ID=NP.PRODUCT_IDANDP.CATEGORY=NP.CATEGORY)WHENMATCHEDTHENUPDATESETP.PRODUCT_NAME=NP.PRODUCT_NAME;insert和update者B带有where字句MERGEINTOproductspUSINGnewproductsnp

ON(duct_id=duct_id)WHENMATCHEDTHENUPDATESETduct_name=duct_name,p.category=np.categoryWHEREp.category='DVD'WHENNOTMATCHEDTHENINSERTVALUES(duct_id,duct_name,np.category)WHEREnp.category!='BOOKS'ON常量表达式,无条件的insertMERGEINTOproductspUSINGnewproductsnpON(1=0)WHENNOTMATCHEDTHENINSERT(PRODUCT_ID,PRODUCT_NAME,CATEGORY)VALUES(duct_id,duct_name,np.category)WHEREnp.category='BOOKSdelete子句mergeintoproductspusingnewproductsnpon(duct_id=duct_id)duct_name=duct_namedeletewherecategory='macle1_cate';7、匹配删除、不匹配插入

MERGEINTOPRODUCTSPUSINGNEWPRODUCTSNPON(P.PRODUCT_ID=NP.PRODUCT_ID)WHENMATCHEDTHENUPDATESETP.PRODUCT_NAME=NP.PRODUCT_NAME,P.CATEGORY=NP.CATEGORYDELETEWHERE(P.CATEGORY='ELECTRNCS')WHENNOTMATCHEDTHENINSERT(PRODUCT_ID,PRODUCT_NAME.CATEGORY)VALUES(NP.PRODUCT_ID,NP.PRODUCT_NAME,NP.CATEGORY);MERGEINTOPRODUCTSPUSINGNEWPRODUCTSNPON(P.PRODUCT_ID=NP.PRODUCT_ID)WHENMATCHEDTHENUPDATESETP.PRODUCT_NAME=NP.PRODUCT_NAME,P.CATEGORY=NP.CATEGORYDELETEWHERE(P.CATEGORY='ELECTRNCS')WHENNOTMATCHEDTHENINSERT(PRODUCT_ID,PRODUCT_NAME,CATEGORY)VALUES(NP.PRODUCT_ID,NP.PRODUCT_NAME,NP.CATEGORY);说明:DELETE®旬删除白是满足matched关联on条件,同时也要是update更新内容的子集,否则不会删除任何内容。

特别说明:DELETE字句只能写在MATCHED情况中,不匹配时无法删除会报错。另外,当DELETE跟在UPDATE字句之后时,DELETE字句是针对UPDATE字句修改后的数据进行过滤的。比如需要删除所有C字段="1"的数据,UPDATE字句将所有数据的C字段都更新为1,那么会删除所有数据,而不是原本为1的数据。8、源表为子查询(自联接)MERGEINTOPRODUCTSPUSING(SELECTCOUNT(*)COFROMPRODUCTSWHEREPRODUCTS.PRODUCT_ID=1501)BON(B.CO<>0)WHENMATCHEDTHENUPDATESETP.PRODUCT_NAME='KEBO'WHEREP.PRODUCT_ID=1501WHENNOTMATCHEDTHENINSERT(PRODUCT_ID,PRODUCT_NAME,CATEGORY)VALUES(1501,'KEBO','NBA');MERGEINTOPRODUCTSPUSING(SELECTCOUNT(*)COFROMPRODUCTSWHEREPRODUCTS.PRODUCT_ID=1508)BON(B.CO<>0)WHENMATCHEDTHENUPDATESETP.PRODUCT_NAME='KEBO'WHEREP.PRODUCT_ID=1508WHENNOTMATCHEDTHENINSERT(PRODUCT_ID,PRODUCT_NAME,CATEGORY)VALUES(1508,'KEBO','NBA');优点:一避免了分开更新一提高性能并易于使用一在数据仓库应用中十分有用

一使用merge比传统的先判断再选择插入或更新快很多需要注意的地方:1、从语法条件上看(ON(joincondition)),mergeinto也是一个危险的语法。如果不慎重使用,会将源表全部覆盖到目标表,既危险又浪费效率,违背了增量同步的原则。所以在设计表结构时,一般每条记录都有更新时间”的字段,用目标表最大更新时间”判断源表数据是否有更新和新增的信息。2、不允许更新关联条件的字段(joincondition)。比如条件是A.ID=B.ID,那么使用“SEA.ID=B.ID将报出一个莫名其妙的提示错误。Oracle的function中怎么返回表变量1、创建表对象类型。在Oracle中想要返回表对象,必须自定义一个表类型,如下所示:createorreplacetypet_tableistableofnumber;上面的类型定义好后,完function使用可用返回一列的表。如果需要多列的话,需要先定义一个对象类型,然后把对象类型替换上面语句中的number;定义对象类型:createorreplacetypeobj_tableasobject(一vidint,vnamevarchar2(50))修改表对象类型的定义语句如下:createorreplacetypet_tableistableofobj_table;2、创建演示函数在函数的定义中,可以使用管道化表函数和普通的方式,下面提供两种使用方式的代码1)、管道化表函数方式:createorreplacefunctionLpipe(snumber)returnt_tablepipelinedasv_obj_tableobj_table;beginforiin1..sloopv_obj_table:=obj_table(i,to_char(i*i));piperow(v_obj_table);endloop;return;endi^pipe;注意:管道的方式必须使用空的return表示结束.调用函数的方式如下:select*fromtable(f_pipe(5));2)、普通的方式:createorreplacefunction1^normal(snumber)returnt_tableasrst_table:=t_table();beginforiin1..slooprs.extend;rs(rs.count):=obj_table(rs.count,'name'||to_char(rs.count));-初始化后还可以修改-rs(rs.count).name:=rs(rs.count).name||'xxxx';endloop;returnrs;endi^normal;调用方式如下:select*fromtable(f_normal(5));带参function返回table类型,function三个参数,分别是表名,字段名,条件;即function中sql语句是:’select'||字段名||'from'||表名||'where'||条件;这样的function如何返回table类型?实现select*fromtablefunction(表名,字段名,条件))这样调用这个函数返回出table类型。像这种动态表名,多个字段名的,select*fromtable()应该比较难实现,因为无法确定返回字段个数及类型。能否考虑用游标呢Oracle使用函数function查询数据返回游标createorreplacefunctionfunc_cursor(itemNumberinvarchar2)returnSYS_REFCURSORisret_cursorSYS_REFCURSOR;beginOPENret_cursorFORSELECT'a'FROMdualWHERE1=itemNumber;RETURNret_cursor;endfunc_cursor;使用如下sql返回游标,在pl/sqldeveloper可以直接点开查询结果selectfunc_cursor('1')fromdual;在sqldeveloper和jdbc中需要手工处理游标当结果集来显示数据。适用条件在Sql语句过长时可以适用,避免在java代码中有过长的sql代码!jdbc调用结果集@TestpublicvoidmainTest()throwsException{ClassforNamGC'oracle.jdbc.driver.OracleDriver');Stringurl="jdbc:oracle:thin:@localhost:1521:orcl!!Connectionconn=DriverManager.getConnectio(url,"kmeter","oracle");Stringsql="{?=callfunc_cursor(?)}"CallableStatemendtst=connprepareCall^ql);cstregisterOutParameter(1,OracleTypeg.URSOF);cstsetString(2,"1");cstexecuteQ;ResultSets=(ResultSet)cst.getObject(1);//while(rs.next()){//System.out.println(rs.getString("vid")+""+rs.getString("vname"));〃)List<Object[]>data=DBHelper.loadRowDat^s);for(Object[]row:data)Systemout.println(Arrays.toString(row));rs.close();cstcloseQ;conncloseQ;@TestpublicvoidcursorTest()throwsExceptionList<Object[]>data=DBHelper.getOracleCursof{?=callfunc_cursor(?)},for(Object[]row:dat^)Systemout.println(Arrays.toString(row));II[II);SpringMvc框架的jdbcTemplete调用返回为字符串的函数publicList<Object[]>getCursorData(finalStringarg){returnjdbcTemplate.execute{?=callfunc_cursor(?)}"newCallableStatementCallbackL<ist<Object[]>>(){@OverridepublicList<Object[]>doInCallableStatement(CallableStatementcst)throwsSQLException,DataAccessException{cstregisterOutParameter(1,OracleTypeCURSOR;cstsetString(2,"1");cstexecute();ResultSeits=(ResultSet)cstgetObject(1);List<Object[]>data=DBHelper.loadRowDat^rs);returndata;@Override});@OverridepublicclassCursorReturnCallbackextendsCallableStatementCallback<ist<Object[]>>(Object…args){publicList<Object[]>doInCallableStatement(CallableStatementcst)throwsSQLException,DataAccessException{cstregisterOutParameter(1,OracleTypeCURSOR;DBHelper.f川OracleCursorCstmtcst,args);cstexecute();ResultSeits=(ResultSet)cstgetObject(1);List<Object[]>data=DBHelper.loadRowDat^rs);returndata;jdbcTemplate.executdK?=callfunc_cursor(?)}",newCursorReturnCallback(args);List<Object[]>data=DBHelper.getOracleCursofT{?=callfunc_cursoK?)}","1");存储过程的最后是一条SELEC并可以吗?不能用select直接返回。除了游标之类没有更好的办法。但即使用游标编了存储过程,在前端开发中也无法使用。我们有理由相信oracle。CREATEORREPLACEPACKAGEcv_typesASTYPEGenericCurTypisREFCURSOR;ENDcv_types;过程如此建立。PROCEDUREopen_cv(generic_cvINOUTcv_types.GenericCurTyp,choiceNUMBER)ISBEGINIFchoice=1THENOPENgeneric_cvFORSELECT*FROMemp;ELSIFchoice=2THENOPENgeneric_cvFORSELECT*FROMdept;ELSIFchoice=3THENOPENgeneric_cvFORSELECT*FROMsalgrade;ENDIF;END;注意:返回的游标必须是第一个参数,且要指明参数类型为Cursor相信对你会很有帮助。不足:oracle现在不能返回动态SQL的查询结果。但可以使用以下方法达到同样的效果OPENgeneric_cvFOR'SELECT*FROMempWHEREempid>'||Parameter;--创建procedurecreateorreplaceproceduresql_test(ret_cursoroutsys_refcursor)isbeginopenout_returnfor'select*fromtgp_funds';end;createorreplaceprocedureproc_cursor(ret_cursoroutsys_refcursor)isbeginopenret_cursorforselect*fromgsminfo;endproc_cursor;返回的Cursor是不能直接select的。如果一定要select,可以用一个record列表,assoiativearray填装数据,再返回。调用方使用table()函数转成表,再selecto带返回游标的存储过程必须是在第一个参数位置指明返回OUT类型游标CREATEORREPLACEPROCEDURproc_cursor(ret_cursorINOUTSYS_REFCURSORchoiceNUMBER)ISBEGINIFchoice=1THENOPENreLcursoiFORSELECTa','a'FROMuser_type?ELSIFchoice=2THENOPENret_CUrsoiFORSELECTb','b'FROMuser_objectWHEREobject_type='FUNCTION';ELSIFchoice=3THENOPENretcursoiFORSELECTc','c'FROMuser_objectyVHEREobject_type='PROCEDURE';ENDIF;END;DECLARExSYS_REFCURSORpVARCHAR2(500);qVARCHAR2(500);BEGINproc_cursor(x,2);LOOPFETCHxINTOp,q;EXITWHENx%NOTFOUNQDBMS_OUTPUT.put_line(q||||q);ENDLOOREND;pl/sql存储过程返回record类型的结果,用object,不用recordoobjectSQL支持,record属于PL/SQL给你一个TOM的例子:createorreplacetypemyScalarTypeasobject(xint,yvarchar2(20),zdate,memberfunctionget_Y(xint)returnvarchar2java里如何调用呢?memberfunctiontoString()returnvarchar2);.createorreplacetypemyTableTypeastableofmyScalarType;createorreplacefunctionnon_pipelined(p_likeinvarchar2)returnmyTableTypeasl_datamyTableType;beginselectmyScalarType(user_id,username,created)BULKCOLLECTintol_datafromall_userswhereusernamelikep_like;returnl_data;end;4.select*fromTABLE(non_pipelined('%A%'));/xw13106209/article/details/6905259OracleOBJEC类型的函数使用OracleOBJECT类型的静态函数主要是用于处理并返回外部数据的,而成员函数是用于处理并返回内部数据的CREATEORREPLACEtypebodytyp_colASmemberFUNCTIONto_upperRETURNtyp_colASBEGINRETURNtyp_col(upper(self.col_name),upper(self.tab_name));ENDto_upper;END;createorreplacetypetyp_col_tableistableoftyp_col;declare|xSYS_REFCURSOR;pvarchar2(500);qvarchar2(500);rstyp_col_table:=typ_col_table();beginproc_cursor(x,2);]loopfetchxintop,q;exitwhenx%NOTFOUND;rs.extend;rs(rs.count):=typ_col(p,q);rs(rs.count):=rs(rs.count).to_upper();DBMS_OUTPUT.put_line(rs(rs.count).col_name||','||rs(rs.count).tab_name);endloop;end;droptypetyp_colforce;createorreplacetypetyp_colasobject(col_namevarchar2(30),tab_namevarchar2(30),memberfunctionto_upperreturntyp_col,--无参数/空参memberfunctionto_tail(strvarchar2)returntyp_col)一一CREATEORREPLACEtypebodytypcolASmemberFUNCTIONtoupperRETURNtypcolASBEGINRETURNtyp_col(upper(self.col_name),upper(self.tab_name));ENDto_upper;memberfunctionto_tail(strvarchar2)returntyp_colASBEGINRETURNtyp_col(self.col_name||str,self.tab_name||str);ENDtotail;END;createorreplacetypetyp_col_tableistableoftyp_col;declarexSYSREFCURSOR;pvarchar2(500);qvarchar2(500);rstyp_col_table:=typ_col_table();beginproc_cursor(x,2);loopfetchxintop,q;exitwhenx%NOTFOUND;rs.extend;rs(rs.count):=typ_col(p,q);rs(rs.count):=rs(rs.count).toupper();〃无参数DBMS_OUTPUT.put_line(rs(rs.count).col_name||','||rs(rs.count).tab_name);rs(rs.count):=rs(rs.count).totail('xxx');〃有参数DBMS_OUTPUT.put_line(rs(rs.count).col_name||','||rs(rs.count).tab_name);//如果函数func声明返回typ_col_table,可直接返回rs,在客气端调用select*fromtable(func(•••));endloop;end;declareTYPEarraytISTABLEOFVARCHAR2(4000);xSYS_REFCURSOR;rstyp_col_table:=typ_col_table();--必须初始化namesarray_t;--可以不初始化salsarray_t;--可以不初始化beginproccursor(x,2);fetchxbulkcollectintonames,sals;s.countlooprs.extend;rs(i):=typ_col(names(i),sals(i));rs(i):=rs(i).to_upper();DBMS_OUTPUT.put_line(rs(i).col_name||','||rs(i).tab_name);rs(i):=rs(i).to_tail('tail');DBMS_OUTPUT.put_line(rs(i).col_name||','||rs(i).tab_name);endloop;end;Oracle返回对象(结构)类型CREATEORREPLACEtypeobj_tableASobject(vidINT,vnameVARCHAR2(50));dropfunctionf_obj;createorreplacefunctionf_obj(argvarchar2)returnobj_tableasretvalobj_table;beginselectobj_table(object_id,object_name||arg)intoretvalfromuser_objectswhereobject_name='F_NORMAL';--limit,samplereturnretval;endf_obj;select*fromuser_objects;declareretvalobj_table;beginretval:=f_obj('_tail');DBMS_OUTPUT.put_line(retval.vidH'/Hretval.vname);end;@TestpublicvoidoracleObjectTest()throwsException{ClassforNamef'oracle.jdbc.driver.OracleDriver');Stringurl="jdbc:oracle:thin:@localhost:1521:orcl!!Connectionconn=DriverManager.getConnectio(url,"kmeter","oracle");Stringsql="{?=callf_obj(?)}"CallableStatemendtst=connprepareCall^ql);TABLE");cstregisterOutParameter(1,OracleTypeSTRUCT"OBJcstsetString(2,);TABLE");cstexecuteQ;STRUCTresult=(oracle.sql.STRUCT)cstgetObject(l);Object[]attr=resultgetAttributesQ;Systemout.println(attr[0].getClass().getSimpleName()*Systemout.println(attr[1].getClass().getSimpleName()*+attr[O]);Systemout.println(attr[0].getClass().getSimpleName()*Systemout.println(attr[1].getClass().getSimpleName()*+attr[O]);+attr[1]);cstcloseQ;connclose();@TestpublicvoidobjectTest()throwsExceptionObject口attr=DBHelper.getOracleObjejR?=callf_obj⑺}”,"OBJ_TABLE","_tail");Systemout.println(Arrays.toString(attr));数组做为参数传入Oracle存储过程操作数据库数组里存储的是String、int、lang等基本数据类型或引用数据类型(不包括javabean)一、在Oracle中定义一个数组类型(TYPE),代码如下:createorreplacetypet_num_arrastableofnumber;意思是创建一个名称为t_num_arr,存放类型为整型的数组类型二、在Oracle中创建一个存储过程,传入的参数是上面定义的t_num_arr类型,操作内容为循环传入的数组。代码如下:createtablearray_test(didnumberprimarykey,dmsgvarchar2(100)notnull);insertintoarray_testvalues(1,'aa');insertintoarray_testvalues(2,'bb');insertintoarray_testvalues(3,'cc');droptypet_num_arr;createorreplacetypet_num_arrastableofnumber;select*fromarray_test;dropproceduremodify_age;createorreplaceproceduremodify_age(my_arrayint_num_arr)asbegin--updatearray_testsetdmsg=dmsg||'_tail'wheredidinmy_array;foriin1..my_array.countloopupdatearray_testsetdmsg=dmsg||'_tail'wheredid=my_array(i);endloop;commit;exceptionwhenothersthenrollback;endmodify_age;declarearr1t_num_arr:=t_num_arr(1,2,3);beginmodify_age(arr1);end;三、在Java中定义要传给存储过程的数组,映射Oracle端数组ASTABLEOF类型通过ArrayDescriptoitabDesc=ArrayDescriptor.createDescripto("T_NUM_ARR”,conn);来完成。再通过ARRAYvArray=newARRAY(tabDescconn,arr);把要传入的数组按指定的数组描述方式生成一个新的Oracle定义的数组。调用存储过程,传入参数并执行@TestpublicvoidoracleInArrayTest()throwsExceptionInteger[]arr={1,2,3};ClassforName("oracle.jdbc.driver.OracleDriver');Stringurl="jdbc:oracle:thin:@localhost:1521:orcl"Connectionconn=DriverManager.getConnectio(url,"kmeter","oracle");ArrayDescriptortabDesc=ArrayDescriptor.createDescripto(r"T_NUM_ARR",conn);ARRAYvArray=newARRAY(tabDesc,conn,arr);Stringsql="{callmodify_age(?)}";CallableStatemendtst=connprepareCallSql);cstsetArray(1,vArray);cstexecute();cstclose();connclose();传入单个javabean数据库中定义一个对象createorreplacetypet_empasobject(enonumber(4),enamevarchar2(20));数据库中定义一个存储函数,参数为一个数据库对象,返回值为CREATEORREPLACEfunctionfunc_in_obj(empint_emp)RETURNSYS_REFCURSORisref_curSYS_REFCURSOR;beginopenrei^curforselectemp.eno||'+111'asx,emp.ename||'world!!!'asyfromdual;returnref_cur;endfunc_in_obj;selectfunc_in_obj(t_emp(8,'aa'))fromdual;Java中写测试@TestSYS_REFCURSOR,可以处理多个返回值publicvoidoracleInObjectTest()throwsSQLException,ClassNotFoundException(ClassforNam《"oracle.jdbc.driver.OracleDriver');Stringurl="jdbc:oracle:thin:@localhost:1521:orcl"Connectionconn=DriverManager.getConnectio(url,"kmeter","oracle");CallableStatemenistmt=(OracleCallableStatement)conn.prepareCall"{?=callFUNC_IN_OBJ(?)}");//参入参数,JavOS口不需要用对象,这里参数本质还是个数组Object[]obj=newObject[]{123,"hello"};//T_EMP必须大写StructDescriptosd=StructDescriptor.createDescriptor"T_EMP",conn);STRUCTstruct=nev^TRUCT^d,conn,obj);cstmtsetObject(2,struct);//传入cstmtregisterOutParameter(1,OracleType^.URSO;//注册返回值类型cstmtexecuteQ;ResultSets=(ResultSet)cstmtgetObject(l);//获取返回结果while(rs.nextQ)Systemout.println(rs.getString(1)+"--"+rs.getString(2));数组里存储的是javabean一、在Oracle中定义一个对象类型(OBJECT),代码如下createorreplacetypet_user_objasobject(useridnumber,usernamevarchar2(20),passwdvarchar2(20));null。意思是创建一个名称为t_user_obj的对象类型,字符串的类型一定要写成nvarchar2,否则,传入数据库的字符串为二、在Oracle中定义一个数组类型(TYPE),代码如下:null。createorreplacetypet_user_arrastableoft_user_obj;意思是创建一个名称为t_user_arr,存放类型为t_user_obj的数组类型在Oracle中定义一个存储过程,代码如下:createorreplaceproceduresave_user_array(user_arrayint_user_arr,rowcountoutnumber,msgoutvarchar2)asuserinfot_user_obj;beginrowcount:=0;foriinuser_array.First()..user_array.Last()loopuserinfo:=user_array(i);insertintoarray_testvalues(userinfo.userid,userinfo.username||'='||userinfo.passwd);rowcount:=rowcount+sql%rowcount;endl

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论