`
vortexchoo
  • 浏览: 67542 次
  • 性别: Icon_minigender_1
  • 来自: 西安
社区版块
存档分类
最新评论

存储过程,传入值为sql语句的笔记。

    博客分类:
  • orcl
 
阅读更多

一般的存储过程的传入参数是 具体的值,过程中利用传入的值去计算或是操作。

工作中往往会碰到一些偏向动态的过程操作,例如根据传来的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语句集合,它具有多种优势:提高性能(预编译)、简化复杂操作、增强代码复用性及安全性。对于SQL初学者来说,掌握存储过程的基本概念及其创建与使用方法是非常重要的。 #### 二...

    JAVA 与 Sql学习笔记

    FORALL语句是一种在PL/SQL中批量处理数据的方式,它可以避免为集合中的每个元素单独执行SQL语句,从而减少上下文切换,提高性能。语法如下: ```sql FORALL index IN lower_bound..upper_bound sql_statement; ...

    SYBASE IQ存储过程学习笔记

    在SYBASE IQ数据库中,存储过程是一种强大的工具,它允许用户编写并存储过程化的SQL语句,以便日后重复使用。存储过程不仅可以包含基本的SQL查询,还能够集成诸如LOOP循环、IF和CASE条件判断等控制流结构,从而实现...

    oracle存储过程学习笔记(四)

    Oracle存储过程是数据库编程的重要组成部分,它允许程序员和数据库管理员编写一系列复杂的SQL和PL/SQL语句,以实现数据处理、业务逻辑或自动化任务。在本篇“Oracle存储过程学习笔记(四)”中,我们将深入探讨存储...

    Mysql存储过程学习笔记–建立简单的存储过程

    MySQL存储过程是数据库管理系统中的一种重要特性,它允许开发者预定义一组SQL语句,以便后续在需要时调用。这不仅简化了代码复用,提高了性能,还减少了网络流量,增强了安全性。以下是对存储过程的详细说明: **一...

    mybatis学习笔记

    MyBatis 是一款深受开发者喜爱的持久层框架,它允许开发者使用 SQL 语句来操作数据库,同时提供了强大的映射机制,将 SQL 与 Java 代码分离,简化了开发过程。这篇“mybatis 学习笔记”将带你深入理解 MyBatis 的...

    mybatis笔记.zip

    MyBatis 是一款优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以使你更好地将关注点集中在你的应用程序上。同时,它也...

    hibernate调用存储过程

    建立这些存储过程的SQL语句如下: 1. getUserList: ```sql CREATE PROCEDURE `getUserList`() BEGIN SELECT * FROM tbl_user; END; ``` 这个存储过程返回表`tbl_user`中的所有记录。 2. createUser: ...

    mybatis完整学习笔记

    首先,MyBatis的核心是SQL映射文件,它允许开发者在XML或注解中编写定制化的SQL语句,避免了JDBC中的大量模板代码。在笔记中,你将了解到如何创建和配置这些映射文件,以及如何将它们与Java接口绑定,实现DAO(数据...

    手写ORM框架笔记.txt

    - **目的**:将查询规则转换为SQL语句。 - **实现**:定义`QueryRuleSqlBuilder`类,接收`QueryRule`对象作为输入,根据不同的规则构建对应的SQL片段,最终组合成完整的SQL语句。 ##### 6. CRUD SQL语句的构建 - **...

    MySQL学习笔记2-高级查询与存储.md

    存储过程是一组预编写的 SQL 语句集合,可以在数据库中定义并存储,当需要时调用执行,有助于简化复杂的业务逻辑处理。 ##### 创建存储过程 创建存储过程涉及定义一系列 SQL 语句,并将其封装成一个单元,以便后续...

    SSM笔记-Mybatis基本使用

    3. 创建映射文件:为每个Mapper接口创建对应的XML映射文件,编写SQL语句。 4. 实现Mapper接口:虽然Mybatis可以自动根据接口生成实现类,但也可以自定义实现类以增加额外逻辑。 5. 配置Spring整合:在Spring的配置...

    Mysql存储过程学习笔记--建立简单的存储过程

    MySQL存储过程是数据库管理系统中的一种重要特性,它允许开发者预定义一组SQL语句,以便后续在需要时调用。这不仅简化了代码复用,还能提高执行效率,因为存储过程在首次创建时会被编译,之后的调用只需传入参数即可...

    JDBC学习笔记(笔记+包含详细注释的代码)

    `DriverManager`负责管理数据库连接,`Connection`代表数据库连接,`Statement`用于执行SQL语句,`ResultSet`存储查询结果。 ### 连接数据库 连接数据库的步骤通常包括: 1. 加载或注册JDBC驱动:通过`Class.for...

    自己整理的mp笔记自己整理的mp笔记

    通过`&lt;if&gt;`、`&lt;choose&gt;`(相当于SQL的CASE WHEN)、`&lt;when&gt;`、`&lt;otherwise&gt;`、`&lt;where&gt;`、`&lt;set&gt;`等标签,可以灵活地构建SQL语句,根据传入参数的不同动态生成不同的WHERE子句。 2. **映射器(Mapper)接口与XML...

    mybatis第二天课堂笔记.doc

    - **定义**:MyBatis是一个优秀的持久层框架,它支持定制化SQL、存储过程以及高级映射。MyBatis避免了几乎所有的JDBC代码和手动设置参数以及获取结果集。MyBatis可以使用简单的XML或注解进行配置和原始映射,将接口...

    jdbc编程笔记(非常难得的资源)

    3. **连接(Connection)**:通过驱动管理器获取到的数据库连接,用于执行SQL语句和管理事务。 4. **Statement/PreparedStatement**:Statement用于执行静态SQL,PreparedStatement用于执行预编译的SQL,可防止SQL...

    JDBC笔记JDBC笔记JDBC笔记

    3. **创建Statement对象**:用于执行SQL语句,有`Statement`、`PreparedStatement`和`CallableStatement`三种。 4. **执行SQL**:调用Statement对象的`executeQuery()`或`executeUpdate()`方法。 5. **处理结果集**...

    ibatis 学习小结笔记

    ibatis 在设计上强调的是 SQL 语句的灵活性和可读性,并且支持存储过程等高级特性,这使得开发者能够更直接地控制 SQL 语句,而不是像 Hibernate 那样高度抽象。 #### 二、ibatis 的基本概念 1. **O/R Mapping**: ...

    symbian 数据库操作笔记

    这篇笔记将深入探讨如何在Symbian上实现SQL语句中的增、删、改、查(CRUD)操作。 ### 增(Create) 在Symbian中创建新记录通常涉及以下步骤: 1. **打开数据库**:首先,需要使用`RDatabase`类打开一个已存在的...

Global site tag (gtag.js) - Google Analytics