一般的存储过程的传入参数是 具体的值,过程中利用传入的值去计算或是操作。
工作中往往会碰到一些偏向动态的过程操作,例如根据传来的sql语句改变游标。
首先游标中的字段是要确定的,无论传递什么样的sql进来,所查询出来的游标内容是一定的。
如果有了上述的保障,就可以行动了。
首先是创建一个package,这个package种 需要声明 一个cursor Type,用作动态游标。
具体命令如下
create or replace package pkg_systeminfo
as
type systeminfo is ref cursor; --定义一个新的 游标类型
type record_type is record( -- 定义新游标里的内容
tid varchar2(200),
tname varchar2(200),
rtime date,
rid varchar2(200));
end;
接着去写我们的procedure
create or replace procedure prc_systeminfo(sqlstr in varchar2 )
is
--define
sysid varchar2(200);
sysname varchar2(200);
reg_time date;
reg_id varchar2(200);
reg_name varchar2(200);
usercount number(20);
answercount number(20);
v_time varchar2(200);
v_usercount varchar2(200);
v_answercount varchar2(200);
n_flag number(4);
cur pkg_systeminfo.systeminfo; --定义游标
systype pkg_systeminfo.record_type; --定义游标容器
begin
sysid :='';
sysname :='';
reg_id:='';
reg_name:='';
usercount:=0;
answercount:=0;
v_time:='';
v_usercount:='';
v_answercount:='';
n_flag:=0;
open cur for sqlstr; --打开游标并加入传进的sql
loop
<<flag>> --返回点
fetch cur into systype; --压入数据
IF cur%NOTFOUND THEN
EXIT;
ELSE
sysid:=systype.tid;
sysname:=systype.tname;
reg_id:=systype.rid;
select NVL(count(1),0) into n_flag from pt_user_detail t where t.id = reg_id;
if n_flag>0 then
select NVL(t.name,'') into reg_name from pt_user_detail t where t.id = reg_id;
reg_time:=systype.rtime;
select to_char(reg_time ,'yyyy-MM-dd HH:mi:ss') into v_time from dual;
select NVL(count(1),0) into usercount from kasai_objects_users_roles t where t.id_object = sysid;
select to_char(usercount) into v_usercount from dual;
select NVL(count(1),0) into answercount from common_surveyuser x,kasai_objects_users_roles y where x.buser=y.id_user and y.id_object=sysid;
select to_char(answercount) into v_answercount from dual;
insert into tb_test_chunf values(sysname,v_time,reg_name,v_usercount,v_answercount);
else
goto flag; --不满足条件转向下次循环,类似java的continue
end if;
end if;
end loop;
close cur; --关闭
commit;
end prc_systeminfo;
以上标记黑色加粗字体是比较重要的。
相关推荐
存储过程是数据库中一组预编译的SQL语句集合,它具有多种优势:提高性能(预编译)、简化复杂操作、增强代码复用性及安全性。对于SQL初学者来说,掌握存储过程的基本概念及其创建与使用方法是非常重要的。 #### 二...
FORALL语句是一种在PL/SQL中批量处理数据的方式,它可以避免为集合中的每个元素单独执行SQL语句,从而减少上下文切换,提高性能。语法如下: ```sql FORALL index IN lower_bound..upper_bound sql_statement; ...
在SYBASE IQ数据库中,存储过程是一种强大的工具,它允许用户编写并存储过程化的SQL语句,以便日后重复使用。存储过程不仅可以包含基本的SQL查询,还能够集成诸如LOOP循环、IF和CASE条件判断等控制流结构,从而实现...
Oracle存储过程是数据库编程的重要组成部分,它允许程序员和数据库管理员编写一系列复杂的SQL和PL/SQL语句,以实现数据处理、业务逻辑或自动化任务。在本篇“Oracle存储过程学习笔记(四)”中,我们将深入探讨存储...
MySQL存储过程是数据库管理系统中的一种重要特性,它允许开发者预定义一组SQL语句,以便后续在需要时调用。这不仅简化了代码复用,提高了性能,还减少了网络流量,增强了安全性。以下是对存储过程的详细说明: **一...
MyBatis 是一款深受开发者喜爱的持久层框架,它允许开发者使用 SQL 语句来操作数据库,同时提供了强大的映射机制,将 SQL 与 Java 代码分离,简化了开发过程。这篇“mybatis 学习笔记”将带你深入理解 MyBatis 的...
MyBatis 是一款优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以使你更好地将关注点集中在你的应用程序上。同时,它也...
建立这些存储过程的SQL语句如下: 1. getUserList: ```sql CREATE PROCEDURE `getUserList`() BEGIN SELECT * FROM tbl_user; END; ``` 这个存储过程返回表`tbl_user`中的所有记录。 2. createUser: ...
首先,MyBatis的核心是SQL映射文件,它允许开发者在XML或注解中编写定制化的SQL语句,避免了JDBC中的大量模板代码。在笔记中,你将了解到如何创建和配置这些映射文件,以及如何将它们与Java接口绑定,实现DAO(数据...
- **目的**:将查询规则转换为SQL语句。 - **实现**:定义`QueryRuleSqlBuilder`类,接收`QueryRule`对象作为输入,根据不同的规则构建对应的SQL片段,最终组合成完整的SQL语句。 ##### 6. CRUD SQL语句的构建 - **...
存储过程是一组预编写的 SQL 语句集合,可以在数据库中定义并存储,当需要时调用执行,有助于简化复杂的业务逻辑处理。 ##### 创建存储过程 创建存储过程涉及定义一系列 SQL 语句,并将其封装成一个单元,以便后续...
3. 创建映射文件:为每个Mapper接口创建对应的XML映射文件,编写SQL语句。 4. 实现Mapper接口:虽然Mybatis可以自动根据接口生成实现类,但也可以自定义实现类以增加额外逻辑。 5. 配置Spring整合:在Spring的配置...
MySQL存储过程是数据库管理系统中的一种重要特性,它允许开发者预定义一组SQL语句,以便后续在需要时调用。这不仅简化了代码复用,还能提高执行效率,因为存储过程在首次创建时会被编译,之后的调用只需传入参数即可...
`DriverManager`负责管理数据库连接,`Connection`代表数据库连接,`Statement`用于执行SQL语句,`ResultSet`存储查询结果。 ### 连接数据库 连接数据库的步骤通常包括: 1. 加载或注册JDBC驱动:通过`Class.for...
通过`<if>`、`<choose>`(相当于SQL的CASE WHEN)、`<when>`、`<otherwise>`、`<where>`、`<set>`等标签,可以灵活地构建SQL语句,根据传入参数的不同动态生成不同的WHERE子句。 2. **映射器(Mapper)接口与XML...
- **定义**:MyBatis是一个优秀的持久层框架,它支持定制化SQL、存储过程以及高级映射。MyBatis避免了几乎所有的JDBC代码和手动设置参数以及获取结果集。MyBatis可以使用简单的XML或注解进行配置和原始映射,将接口...
3. **连接(Connection)**:通过驱动管理器获取到的数据库连接,用于执行SQL语句和管理事务。 4. **Statement/PreparedStatement**:Statement用于执行静态SQL,PreparedStatement用于执行预编译的SQL,可防止SQL...
3. **创建Statement对象**:用于执行SQL语句,有`Statement`、`PreparedStatement`和`CallableStatement`三种。 4. **执行SQL**:调用Statement对象的`executeQuery()`或`executeUpdate()`方法。 5. **处理结果集**...
ibatis 在设计上强调的是 SQL 语句的灵活性和可读性,并且支持存储过程等高级特性,这使得开发者能够更直接地控制 SQL 语句,而不是像 Hibernate 那样高度抽象。 #### 二、ibatis 的基本概念 1. **O/R Mapping**: ...
这篇笔记将深入探讨如何在Symbian上实现SQL语句中的增、删、改、查(CRUD)操作。 ### 增(Create) 在Symbian中创建新记录通常涉及以下步骤: 1. **打开数据库**:首先,需要使用`RDatabase`类打开一个已存在的...