>

Oracle存款和储蓄进度及调用_oracle_脚本之家,Or

- 编辑:澳门新葡亰平台游戏 -

Oracle存款和储蓄进度及调用_oracle_脚本之家,Or

Oracle不像SQLServer那样在积攒过程中用Select就能够回来结果集,而是经过Out型的参数实行理并了结果集再次回到的。实际上是使用REF CUPRADOSO牧马人 复制代码 代码如下: --procedure重返记录集: ----------------------声美赞臣个Package-------------- CREATE OTiggo REPLACE PACKAGE pkg_test AS TYPEmyrctypeIS REF CURSOR; PROCEDURE get_r(p_id NUMBER,p_rc OUT myrctype); --Package中声明名称为get 的Procedure END pkg_test; -----------------表明Package Body,即下面Package中的内容,包涵Procedure get--------------------- CREATE OSportage REPLACE PACKAGE BODY pkg_test AS PROCEDURE get_r(p_id NUMBER,p_rc OUT myrctype) IS sqlstr VARCHAR2 ; BEGIN IF p_id = 0 THEN OPEN p_rc FOR SELECT ID, NAME, sex, address, postcode, birthday FROM student; ELSE sqlstr := 'select id,name,sex,address,postcode,birthday from student where id=:w_id'; --w_id是个参数, --以下 p_rc是个REF CU传祺SO奥迪Q3游标类型,并且是OUT型参数,就能够回到三个记录集了。USING p_id就是替换上边SQL中:w_Oracle存款和储蓄进度及调用_oracle_脚本之家,Oracle存款和储蓄进程再次回到游标实例详整_oracle_脚本之家。id值拉:) OPEN p_rc FOR sqlstr USING p_id; END IF; END get; END pkg_test; --function重临记录集的例证,原理和方面同样,而是用function的return值来回到记录集。 函数重返记录集: 建构带ref cursor定义的包和包体及函数: 复制代码 代码如下: CREATE OGL450 REPLACE package pkg_test as type myrctype is ref cursor; function get_r return myrctype; end pkg_test; / CREATE OR REPLACE package body pkg_test as --函数体 function get_r return myrctype is rc myrctype; --定义ref cursor变量 sqlstr varchar2; begin if intID=0 then --静态测验,直接用select语句直接重临结果 open rc for select id,name,sex,address,postcode,birthday from student; else --动态sql赋值,用:w_id来注解该变量从外表拿到 sqlstr := 'select id,name,sex,address,postcode,birthday from student where id=:w_id'; --动态测量检验,用sqlstr字符串再次回到结果,用using关键词传递参数 open rc for sqlstr using intid; end if; return rc; end get; end pkg_test;

有俩种办法: 黄金年代种是声称系统游标,风流洒脱种是宣称自定义游标,然后后边操作同样,参数类型为 in out 或out 复制代码 代码如下: create or replace p_temp_procedure ( cur_arg out sys_refcursor; --方法1 ) begin open cur_arg for select * from tablename; end 调用 复制代码 代码如下: declare cur_calling sys_refcursor; begin p_temp_procedure; --那样那个游标就有值了 for rec_next in cur_calling loop .... end loop; end; 在海口中评释一(Wissu)(Beingmate卡塔 尔(英语:State of Qatar)个游表类型,然后调用者申美赞臣(Meadjohnson卡塔 尔(英语:State of Qatar)个那一个类型的游标变量,传给重临游标的积存进程,存款和储蓄过程out这一个结果集,这种形式很麻烦.游标类型无法像索引表相通选择create or replace type方法来创设,所以一定要在包中申明,何况须要接收/来奉行,前面包车型大巴仓库储存进程才认这些游标类型.(不推荐,可是建议要领会何况要会这种情势,毕竟它有它存在的道理) 复制代码 代码如下: --定义全局变量 create or replace package pkg_package as type type_cursor is ref cursor; type type_record is record , test02 varchar2, test03 varchar2; end; --创造重回游标的积累进程 复制代码 代码如下: create or replace procedure p_temp_procedure ( cur_out_arg out pkg_package.type_cursor ) is begin open cur_out_arg for select * from test; end; --调用 复制代码 代码如下: declare cur_out_arg pkg_package.type_cursor; rec_arg pkg_package.type_record; begin p_temp_procedure; fetch cur_out_arg into rec_arg; dbms_output.put_line; dbms_output.put_line; dbms_output.put_line; end;

末段给个应用,分页的蕴藏进度

案例意气风发:java调用没有重回值的积累进度

java调用存储进程

上边以调用下边多少个存款和储蓄进程为例

/*调用分页存储过程*/declare v_page_count number; v_cursor page_package.page_cursor; v_total_count number;begin dbms_output.put_line; pro_paging(5,--每页显示5条 v_page_count,--总页数 1,--当前页 v_total_count,--记录总条数 v_cursor--游标 ); dbms_output.put_line('--------------------------'); dbms_output.put_line; --显示第二页数据 pro_paging(5,--每页显示5条 v_page_count,--总页数 2,--当前页 v_total_count,--记录总条数 v_cursor--游标 );end;/*运行结果:*/第一页数据。。。。。。。。。6666 张三20 empSu219 empSave27369 SMITH7499 ALLEN共 17 条记录共 4 页当前页: 1每页显示 5 条--------------------------第二页数据。。。。。。。。。7521 WARD7566 JONES7654 MARTIN7698 BLAKE7782 CLARK共 17 条记录共 4 页当前页: 2每页显示 5 条

存款和储蓄进程案例风度翩翩:没参数的囤积进度

以上所述是小编给大家介绍的Oracle存款和储蓄进程及调用,希望对大家有着扶植,就算大家有其它疑问请给本人留言,小编会及时过来大家的。在这里也特别谢谢我们对剧本之家网站的支持!

情势黄金时代:换个存款和储蓄进度名

案例二:java调用重返单列单行的仓库储存进程

public static void closeResource(Connection conn,CallableStatement cs,ResultSet rs){ if{ try { rs.close(); } catch  { e.printStackTrace{ try { cs.close(); } catch  { e.printStackTrace{ try { conn.close(); } catch  { e.printStackTrace(); } } }

务求:编写一个依照机构编号查找部门全体职工音信的贮存进度,并用java调用该存款和储蓄进程

案例三:java调用再次回到单行多列的存款和储蓄进程

declare v_param1 number:=2; v_param2 number:=8; v_result number;begin --调用上面案例一的存储过程 procedure_1(); --调用上面案例二的存储过程 procedure_2; --调用上面案例三的存储过程 procedure_3(v_param1,v_param2,v_result); dbms_output.put_line;end;/*执行结果:*/procedure_1.......procedure_2.......2 + 8 = 10procedure_3.......2 - 8 = -610
/*存储过程*/create procedure procedure_5(v_empno in emp.empno%type,v_ename out emp.ename%type)isbegin select ename into v_ename from emp where empno=v_empno;end;//java调用存储过程public static void main { Connection conn=null; CallableStatement cs=null; ResultSet rs=null; try { Class.forName("oracle.jdbc.OracleDriver"); conn=DriverManager.getConnection("jdbc:oracle:thin:@127.0.01:1521:orcl", "scott","tiger"); cs=conn.prepareCall("{call procedure_5; cs.setInt;//给输入参数赋值 /*指定输出参数的数据类型 语法:oracle.jdbc.OracleTypes.输出参数的数据类型 此例输出参数的数据类型是varchar,所以是oracle.jdbc.OracleTypes.VARCHAR*/ cs.registerOutParameter(2, oracle.jdbc.OracleTypes.VARCHAR); cs.execute();//执行 //获取输出参数的值,位置要和输出参数对应?的位置对应起来,该例输出参数对应第2个问号,而且输出参数的数据类型为字符型,所以是cs.getString String a=cs.getString; System.out.println; } catch  { e.printStackTrace(); }finally{ closeResource;//关闭资源 } } /*执行结果,控制台打印:*/结果:员工姓名:张三

带参数的积攒进度语法:

create replace procedure procedure_1isbegin dbms_output.put_line;end;
/*存储过程*/create procedure procedure_4(v_empno emp.empno%type,v_ename emp.ename%type,v_job emp.job%type )isbegin insert into emp  values (v_empno,v_ename,v_job);end;//java调用存储过程public static void main { Connection conn=null; CallableStatement cs=null; ResultSet rs=null; //java调用存储过程 try { Class.forName("oracle.jdbc.OracleDriver"); conn=DriverManager.getConnection("jdbc:oracle:thin:@127.0.01:1521:orcl", "scott", "tiger"); cs=conn.prepareCall("{call procedure_4; //给输入参数赋值 cs.setInt; cs.setString; cs.setString; cs.execute();//执行 } catch  { e.printStackTrace(); }finally{ closeResource;//关闭资源 } }//执行后就会向数据库的emp表中插入一条编号为6666,姓名为张三,职位为MANAGER的记录

渴求:编写三个根据工作者编号查找工作者姓名、职位和薪酬的仓储进程,并用java调用该存款和储蓄进度

专一:用地点的语法创立存款和储蓄进度时可能会赶过数据库中意气风发度有了同名的仓库储存进度,那样Oracle就能弹框报错,说名字已被现存对象使用。消除办法有二种:

/*定义游标*/create package my_package astype emp_cursor is ref cursor;end my_package;/*存储过程*/create procedure procedure_7(v_deptno in emp.deptno%type,emp_cursor out my_package.emp_cursor)isbegin open emp_cursor for select * from emp where deptno=v_deptno;end;//java调用存储过程public static void main { Connection conn=null; CallableStatement cs=null; ResultSet rs=null; try { Class.forName("oracle.jdbc.OracleDriver"); conn=DriverManager.getConnection("jdbc:oracle:thin:@127.0.01:1521:orcl", "scott","tiger"); cs=conn.prepareCall("{call procedure_7; cs.setInt;//给输入参数赋值 cs.registerOutParameter(2, oracle.jdbc.OracleTypes.CURSOR );//指定输出参数的数据类型 cs.execute cs.getObject;//获取输出参数的值 while{ //顺序为数据库中字段前后顺序,例如数据库emp表中第5列为hiredate,数据类型为Date,所以获取第5列值时就应该用rs.getDate System.out.println+" "+rs.getString; } } catch  { e.printStackTrace(); }finally{ closeResource;//关闭资源 } }

积存进度案例三:带输入、输出参数的囤积进程

7369 SMITH 1980-12-177566 JONES 1981-04-027788 SCOTT 1987-04-197876 ADAMS 1987-05-237902 FORD 1981-12-03 

积存进程案例二:带参数的的蕴藏进度

Java调用的话和方面java调用存款和储蓄进度的事例同样。这里为了方便 ,就径直在pl/sql中调用了

运维结果,调节台打字与印刷:*/

仓库储存进度的参数分为输入参数和出口参数,

输入参数:输入参数平常会在变量名和数据类型之间加in来代表该参数是输入参数

/*定义游标*/create package page_package astype page_cursor is ref cursor;end page_package;/*存储过程*/create procedure pro_paging ( v_page_size in number,--每页显示多少条 v_page_count out number,--总页数 v_current_page in number,--当前页 v_total_count out number,--记录总条数 emp_cursor out page_package.page_cursor--返回查询结果集的游标 )is v_begin number:=v_page_size*+1;--查询起始位置 v_end number:=v_page_size*v_current_page;--查询结束位置 v_sql varchar2:='select empno,ename from (select a.empno,a.ename,rownum rn from (select empno,ename from emp) a where rownum<='|| v_end ||') b where b.rn>='||v_begin; /*不能像下面这么写,不然调用该存储过程时会报类型不一致的错,因为最里面查的只有empno,ename,因此外面也要和里面保持一致 v_sql varchar2:='select * from (select a.*,rownum rn from (select empno,ename from emp) a where rownum<='|| v_end ||') b where b.rn>='||v_begin;*/ v_ename varchar2; v_empno number;begin open emp_cursor for v_sql; loop fetch emp_cursor into v_empno,v_ename; exit when emp_cursor%notfound; dbms_output.put_line(v_empno||' '||v_ename); end loop; v_sql:='select count from emp'; execute immediate v_sql into v_total_count; if(mod(v_total_count,v_page_size)=0) then v_page_count:=v_total_count/v_page_size; else v_page_count:=trunc(v_total_count/v_page_size)+1; end if; dbms_output.put_line('共 '||v_total_count||' 条记录'); dbms_output.put_line('共 '||v_page_count||' 页'); dbms_output.put_line('当前页: '||v_current_page); dbms_output.put_line('每页显示 '||v_page_size||' 条');end;

带输入、输出参数的储存进度语法:

create procedure 存储过程名称 数据类型,变量2 in 数据类型,...,变量n inis 在这里可以定义常量、变量、游标、复杂数据类型这里可以定义变量、常量begin 执行部分end;

务求:编写七个像数据库emp表插入一条编号为6666,姓名叫张三,职位为MANAGE陆风X8的记录

不写in和out的话,默以为输入参数

create procedure procedure_2(v_i number,v_j number)is v_m number;begin dbms_output.put_line; v_m := v_i + v_j; dbms_output.put_line(v_i||' + '||v_j||' = '||v_m);end;

那是上面java调用存款和储蓄进程代码中关闭财富方法的代码

/*存储过程*/create procedure procedure_6(v_empno in emp.empno%type,v_ename out emp.ename%type,v_job out emp.job%type,v_sal out emp.sal%type)isbegin select ename,job,sal into v_ename,v_job,v_sal from emp where empno=v_empno;end;//java调用存储过程public static void main { Connection conn=null; CallableStatement cs=null; ResultSet rs=null; try { Class.forName("oracle.jdbc.OracleDriver"); conn=DriverManager.getConnection("jdbc:oracle:thin:@127.0.01:1521:orcl", "scott","tiger"); cs=conn.prepareCall("{call procedure_6(?,?,?,?)}"); cs.setInt; //指定输出参数的数据类型,注意:顺序要对应起来 cs.registerOutParameter(2, oracle.jdbc.OracleTypes.VARCHAR); cs.registerOutParameter(3, oracle.jdbc.OracleTypes.VARCHAR); cs.registerOutParameter(4, oracle.jdbc.OracleTypes.DOUBLE); cs.execute();//执行 //获取返回值 String ename=cs.getString;//获取姓名 String job=cs.getString;//获取职位 double sal=cs.getDouble;//获取薪水 System.out.println("员工编号为7788的姓名为:"+ename+" 职位是:"+job+" 薪水是:"+sal); } catch  { e.printStackTrace(); }finally{ closeResource;//关闭资源 }}/*执行结果,控制台打印:*/员工编号为7788的姓名为:SCOTT 职位是:ANALYST 薪水是:3000.0

渴求:编写二个依照职员和工人编号查找工作者姓名的囤积进程,并用java调用该存款和储蓄进度

输出参数:输出参数日常会在变量名和数据类型之间加out来代表该变量是出口参数

create procedure procedure_3(v_i in number,v_j in number ,v_m out number)isbegin dbms_output.put_line; v_m:=v_i - v_j; dbms_output.put_line(v_i||' - '||v_j||' = '||v_m);end;

案例四:java调用重回多行多列的仓库储存进程

形式二:在最早阶的create procedure 之间加上 or replace 关键字,比如:create or replace procedure 存储进度名称。但是这种方法不提议选用,因为这种办法会把在此以前同名的仓库储存进程替换为您近些日子写的那一个

create procedure 存储过程名称 is 在这里可以定义常量、变量、游标、复杂数据类型这里可以定义变量、常量begin 执行部分end; 

Oracle存款和储蓄进度语法

PL/SQL块中调用存款和储蓄进程

create procedure 存储过程名称 (变量1 数据类型,变量2 数据类型,...,变量n 数据类型)is 在这里可以定义常量、变量、游标、复杂数据类型这里可以定义变量、常量begin 执行部分end; 

/*以下便是20号部门有着职员和工人的音讯,这里为平价大家只打字与印刷了号码、姓名和入职时间

Oracle的仓储进度语法如下:

本文由数据库发布,转载请注明来源:Oracle存款和储蓄进度及调用_oracle_脚本之家,Or