oracle存储过程一(返回单条记录的值)

本文介绍如何通过Java调用Oracle存储过程来提高大容量Excel表验证效率,包括存储过程参数类型解释及单条或多条记录返回方法。

转载自:http://www.cnblogs.com/azai/archive/2010/08/19/1802930.html

最近在使用java验证excel表单元格的信息,数据量非常大,而且验证的规则比较复杂,如果单纯使用程序的验证的话,效率将非常低,考虑到oracle存储过程是可编译的,每次编译之后都会将数据放入高速缓存当中,下次再取,速度将非常的快。之前并没有接触到oracle的存储过程,所以也花了几天的时间去研究了一番,由于时间紧迫,没有怎么很好的整理。现在先将比较基本的一些实现方法给大家分享一下

  下面是使用java调用存储过程来返回out的值,因为存储过程有三种参数,in表输入,out表输出,in out即可输入又可输出,什么意思呢?刚接触的人可能就不大明白了,其实in就像java方法中的参数一样,可将参数传到存储过程(其实就将存储过程看成方法就行了,只是比较特殊,他是可编译的),而out相当于java方法的返回参数,只是存储过程可以定义多个out,相当于可以return多个参数一样,do you understand?

  需要注意的是,out可以返回单条记录或者多条记录,他们的实现方法是不一样的,返回单条记录直接将他作为某个变量赋值就行,下面随便写了一个例子说明一下:

存储过程代码:

复制代码
  
CREATE OR REPLACE PROCEDURE pro_return_result ( a in varchar2 ,b out varchar2 ) AS BEGIN if a is not null then b : = ' 不好说 ' ; end if ; END pro_return_result;
复制代码

java调用代码:(只贴出核心部分,其他的数据库连接自己搞定)

复制代码
代码
   
CallableStatement cs = null ; cs = con.prepareCall( " {call pro_return_result(?,?)} " ); cs.setString( 1 , " 1 " ); cs.registerOutParameter( 2 , Types.VARCHAR); cs.execute(); String result = cs.getString( 2 ); System.out.println(result);
复制代码
看到上面的例子了吧,因为存储过程第二个参数是out输入,并且是返回单条记录的,所以使用这样的一个方法对输出out进行注册

cs.registerOutParameter(2, Types.VARCHAR);
输出结果:不好说
如果要输出多个记录,则在存储过程写多几个out,然后写多几个cs.registerOutParameter(参数位置, Types.VARCHAR);OK搞定返回单条记录

如果存储过程要为默写变量赋值,返回单条记录时,可使用这样的一种方式:select 某表的字段1,字段2…… into 变量1,变量2 from 表 where 表字段=某个值
如例子:
 
复制代码
代码
    
CREATE OR REPLACE PROCEDURE validate_module_name ( a in varchar2 ,b out varchar2 ) AS c varchar2 ( 255 ); BEGIN select module_one into c from temp_test_case where num = a; if c is not null then b : = ' 1 ' ; end if ; END validate_module_name;
复制代码

调用的方式和上面说的一样,as下是放自定义的变量,begin到End是PL/SQL语句,PL/SQL中的空值使用is null来表示,非空为:is not null,这和java程序有所区别,PL/SQL有时间再详解

注:存储过程还有一种返回情况,返回的是多条记录,既结果集,而不是单条记录,则不能使用上面的那种方法,得使用游标输出结果集,同时
select 某表的字段1,字段2……
into 变量1,变量2 from 表 where 表字段=某个值
这种方式也不能使用,因为select into语句只使用返回单条记录的情况。在java调用存储过程也不能使用
cs.registerOutParameter(参数位置, Types.VARCHAR)了,存储过程返回结果集的java调用下回详解……

### Oracle 存储过程使用 LOOP 循环拼接属性Oracle数据库中,可以利用`LOOP`循环来遍历查询结果集并将特定列的通过逗号连接起来形成单个字符串。下面展示了个具体的例子,说明怎样构建这样的存储过程。 #### 创建表和插入测试数据 为了便于理解这个功能的应用场景,先假设存在张名为`employees`的员工信息表格,并向其中加入几条记录用于后续操作: ```sql CREATE TABLE employees ( id NUMBER PRIMARY KEY, name VARCHAR2(100), department_id NUMBER ); INSERT INTO employees (id, name, department_id) VALUES (1,'Alice', 1); INSERT INTO employees (id, name, department_id) VALUES (2,'Bob', 2); INSERT INTO employees (id, name, department_id) VALUES (3,'Charlie', 1); COMMIT; ``` #### 编写带有 `LOOP` 的存储过程实现拼接功能 接下来定义个名为`get_names_by_dept`的存储过程,它接收部门ID作为输入参数,并返回由该部门内所有成员的名字组成的、以逗号分隔的字符串列表。 ```plsql CREATE OR REPLACE PROCEDURE get_names_by_dept( p_department_id IN employees.department_id%TYPE, o_concatenated_names OUT VARCHAR2 ) AS v_name employees.name%TYPE; CURSOR emp_cursor IS SELECT e.name FROM employees e WHERE e.department_id = p_department_id ORDER BY e.id ASC; BEGIN o_concatenated_names := ''; OPEN emp_cursor; FETCH emp_cursor INTO v_name; WHILE emp_cursor%FOUND LOOP IF LENGTH(o_concatenated_names) > 0 THEN o_concatenated_names := o_concatenated_names || ', '; END IF; o_concatenated_names := o_concatenated_names || v_name; FETCH emp_cursor INTO v_name; END LOOP; CLOSE emp_cursor; END; / ``` 上述代码片段展示了如何运用`CURSOR`游标配合`FETCH`指令逐行读取符合条件的数据项,在每次迭代期间检查当前累积的结果长度决定是否添加分隔符,最后关闭游标完成整个流程[^2]。 #### 调用存储过程获取结果 要调用此存储过程并查看输出效果,可以通过匿名PL/SQL块来进行交互式测试: ```plsql DECLARE concatenated_result VARCHAR2(4000); BEGIN get_names_by_dept(p_department_id => 1, o_concatenated_names => concatenated_result); DBMS_OUTPUT.PUT_LINE(concatenated_result); -- 输出 "Alice, Charlie" END; / ``` 这段脚本首先声明了个局部变量用来承载最终得到的名字串合成果,接着执行实际的过程调用动作,最后打印出所获得的信息以便验证预期行为是否达成。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值