`

建立临时表和查找断号

 
阅读更多

把自定义的查询结果集放到临时表,然后操作该临时表的数据;


  type table_type is table of my_table%rowtype index by binary_integer;
  tmp_table table_type;--创建一个my_table(自己表)类型相同的临时集合

v_insert_num integer default 0;--成功插入的数量

 

--循环插入数据到临时表

       for x in ( SELECT Zyfxdm,Zyfxmc,Sfxtzfx,Xz,Pycc FROM XTGL_ZYFXXXSJZL a where a.zyfxdm=i_zyfxdmArr(i) )loop
         tmp_table(v_insert_num).Zyfxdm:=x.Zyfxdm;
         tmp_table(v_insert_num).Sfxtzfx:=x.Sfxtzfx;
         v_insert_num:=v_insert_num+1;

      end loop;

--然后查询这个临时表数据时(报错),因为这不是索引表,该方法行不通

select * from tmp_table

 

正确做法(方法之一):



1.先在Types里面定义临时表的结构;

2.存储过程中把数据插入该临时表;

 

 

CREATE OR REPLACE PROCEDURE jxgl_zwh(i_zphzj  in varchar2,
                                     o_zwh    out integer,
                                     o_errMsg out varchar2) IS
  /* 就业管理_展位号
  *  根据招聘会主键查找该招聘会回执企业中是否存在展位号数据,
  *  如果没有则返回1作为展位号,如果有数据则查找断位号
  
  i_zphzj:招聘会主键
  o_zwh:返回展位号
  o_errMsg:返回的错误信息
  */

  v_count_num  varchar2(10); --表数据
  v_count_zwh  varchar2(10); --断位号数
  arr_zwh      TYPE_Zwh_TABLE := TYPE_Zwh_TABLE();
  v_num integer default 1; --成功插入的数量

BEGIN

  for x in (SELECT zwh
              FROM jygl_chqyhz
             WHERE zphzj = i_zphzj
               and zwh is not null
             order by zwh) loop
    arr_zwh.extend;
    arr_zwh(v_num) := TYPE_Zwh(null);
    arr_zwh(v_num).zwh := x.zwh;
    v_num := v_num + 1;
  end loop;

  select count(1) into v_count_num from table(arr_zwh);
  SELECT COUNT(1)
    into v_count_zwh
    FROM (select n
            from (select rownum n
                    from table(arr_zwh) a, table(arr_zwh) b
                   where rownum < (select max(zwh) from table(arr_zwh))
                  minus
                  select zwh from table(arr_zwh))
           where n > 0
             and rownum = 1); --查询展位号有没有断号

  if v_count_num = 0 then
    --表中没有数据则从1开始
    o_zwh := 1;
  elsif v_count_num != 0 and v_count_zwh = 0 then
    --没有断号则查找最大值
    select (nvl2(max(zwh), max(zwh), 0) + 1)
      into o_zwh
      from table(arr_zwh);
  
  else
    --从1开始查找断号
    select n
      into o_zwh
      from (select rownum n
              from table(arr_zwh) a, table(arr_zwh) b
             where rownum < (select max(zwh) from table(arr_zwh))
            minus
            select zwh from table(arr_zwh))
     where n > 0
       and rownum = 1;
  end if;

exception
  when others then
    o_errMsg := o_errMsg || ':程序运行出现内部错误,请联系管理员。' ||
                dbms_utility.format_error_backtrace() || SQLCODE || '---' ||
                SQLERRM;
END jxgl_zwh;

 o_errMsg 中dbms_utility.format_error_backtrace()     --返回报错行数

                      SQLCODE    --报错代码

                      SQLERRM;   --报错问题

------------------------------------------------------------------------------------------------------------

查找断位号语句

select f
  from (select rownum f
          from test a, test b
         where rownum < (select max(id) from test)
        minus
        select id from test)
 where f > 0 and rownum=1;  --查找断号

 

--功能摘自:就业管理,招聘会管理

 

 

  • 大小: 55.8 KB
分享到:
评论

相关推荐

    SQL Server中关于临时表概念及创建和插入数据等问题

    SQL Server 中的临时表概念、创建和插入数据等问题 SQL Server 中的临时表概念是指名称以井号 (#) 开头的表,如果当用户断开连接时没有除去临时表,SQL Server 将自动除去临时表。临时表有两种类型:本地临时表和...

    SpringBoot 整合Mybatis 创建临时表

    现在,你可以通过调用`createTempTable`和`queryTempTable`方法来完成临时表的创建和查询。这个例子展示了如何在SpringBoot项目中整合Mybatis,创建并使用临时表进行数据操作。这种方式在处理一些临时性、会话级别的...

    mysql临时表用法分析【查询结果可存在临时表中】

    MySQL临时表是一种在会话范围内创建的特殊类型的表,它仅对当前会话可见,并在会话结束时自动删除。这种技术在处理复杂查询、中间数据处理或报表生成时非常有用,因为它允许用户将查询结果暂存起来,以便进一步处理...

    学习oracle创建一个表空间创建临时表空间创建用户表空间资源的权限

    当创建新用户时,可以为用户分配默认表空间和临时表空间,以便他们在该表空间中创建对象: ```sql CREATE USER my_user IDENTIFIED BY my_password DEFAULT TABLESPACE MY_DATA TEMPORARY TABLESPACE MY_TEMP; ...

    Oracle存储过程中使用临时表

    - **索引和约束**:临时表可以创建索引和约束,但这些对象仅在会话或事务内有效。 - **存储空间**:虽然临时表在会话结束或事务提交后会被清理,但它们仍会占用内存和磁盘空间,因此需要合理使用,以避免资源浪费。 ...

    Oracle 临时表用法

    本文将详细介绍Oracle临时表的创建方法、使用场景以及优缺点,帮助读者更好地理解和运用这一特性。 #### 二、Oracle临时表概述 Oracle临时表是一种特殊的表,用于存储临时数据,通常用于事务处理或特定会话期间的...

    oracle查找定位占用临时表空间较大的SQL语句方法

    oracle查找定位占用临时表空间较大的SQL语句方法,包括:(1)造成临时表空间暴涨的SQL还在运行中(2)造成临时表空间暴涨的SQL已经运行过了。

    Oracle 临时表之临时表的应用问题

     临时表本质上是一种cache的表现形式,Oracle的临时表都是事先建好的,一旦用了临时表,存放的是和本会话相关的数据,没有人会傻乎乎地用临时表来保存本应该共享的数据。  with子查询实际上也是用了临时表,...

    oracle临时表用法

    Oracle 中的临时表有两种:事务级别的临时表和会话级的临时表。事务级别的临时表在事务结束时自动清空记录,而会话级的临时表在会话结束时自动清空。 临时表的特点 临时表有以下特点: * 临时表可以在多用户并发...

    主流数据库中临时表的使用

    在 MS SQL SERVER 中,临时表是以井号 (#) 或数学符号 (##) 开头的表名。临时表有两种类型:本地临时表和全局临时表。本地临时表的名称以单个数字符号 (#) 打头,仅对当前的用户连接是可见的。当用户从 Microsoft ...

    Mysql临时表和派生表

    根据存储位置的不同,可以将临时表分为两类:内存临时表和外存临时表。 - **内存临时表(in-memory)**:这种类型的临时表存储在内存中,因此读写速度较快,但不适合存储大量数据或大数据块。 - **外存临时表(on-...

    Oracle临时表空间满的解决步骤

    Oracle 临时表空间满的问题需要通过查看当前数据库的默认临时表空间、查看当前临时表空间的大小、创建新的临时表空间、将新建的临时表空间设置为数据库的默认临时表空间、删除原来的临时表空间、创建新的临时表空间...

    sql server触发器中自动生成的临时表

    在 SQL Server 触发器中,系统自动会生成两张临时表,分别是 deleted 和 inserted 表。这些表可以理解为临时表,也可以认为是逻辑表或概念表。它们的表结构与原表是完全相同的。 Inserted 表和 Deleted 表的作用 ...

    ORACLE中临时表

    需要注意的是,与SQL Server和Sybase等其他数据库系统相比,Oracle中不应在运行时动态创建临时表,而应在应用程序安装时创建。DDL操作(如创建表)开销较大,应尽量避免在运行时执行。 总结来说,Oracle的临时表...

    oracle创建临时表空间文档及工具

    在这条语句中,`temp_tablespace`是你想要创建的临时表空间的名称,`tempfile_path.dbf`是你希望存放临时表空间数据文件的路径和文件名,`10M`是初始大小,`5M`是自动扩展增量,`50M`是最大尺寸。`EXTENT MANAGEMENT...

    procedure中创建临时表

    根据提供的标题、描述、标签及部分内容,我们可以详细探讨在Oracle PL/SQL中如何通过存储过程(Procedure)创建临时表,并且处理可能发生的异常情况。以下将深入解析此过程中的各个步骤及其背后的逻辑。 ### 一、...

    oracle临时表操作学习资料

    默认情况下,如果没有明确指定,Oracle将创建的临时表视为事务临时表。为清晰起见,建议使用`ON COMMIT DELETE ROWS`关键字来标识事务临时表。 - **数据变化**:在事务临时表中插入的数据仅在当前事务内有效。事务...

    Oracle中临时表的创建

    ### Oracle中临时表的创建与使用 #### 一、引言 在Oracle数据库环境中,当处理大规模数据时,经常会遇到性能瓶颈的问题。特别是在那些数据量达到百万级别的大型系统中,如何高效地管理数据成为了关键所在。为了...

    oracle11g创建临时表空间组

    例如,这里创建了三个临时表空间文件`tmp01grp01.dbf`、`tmp02grp01.dbf`和`tmp03grp01.dbf`。 - 可以使用`CREATE TEMPORARY TABLESPACE`语句创建这些表空间,并指定它们属于同一个表空间组`TBS_TEMPGROUP1`。示例...

    sql临时表相关介绍

    临时表分为两种类型:本地临时表和全局临时表。 1. **本地临时表**:本地临时表的名称以单个井字号 (#) 开头,如 `#Tmp`。这些表只在其创建的会话中可见,不会被其他用户或会话访问。当创建本地临时表的会话结束时...

Global site tag (gtag.js) - Google Analytics