oracle 临时表和内存表

1.往临时表中插入数据

insert  into TEMP_TABLE_LINE select *from table(func_exbprod_line(Fr_Time,To_Time));
insert  into TEMP_TABLE_LINE select *from table(func_exbprod_line_v(Fr_Time,To_Time));

其中临时表为:TEMP_TABLE_PROD_LINE ;

2.创建临时表(事务级别的)

-- Create table
create global temporary table TEMP_TABLE_PROD_LINE
(
contractno VARCHAR2(50),
contractselfno VARCHAR2(50),
pricetype VARCHAR2(50),
workshop VARCHAR2(50),
materiel VARCHAR2(50),
price NUMBER(16,2),
quantity INTEGER,
discount NUMBER
)
on commit delete rows;

3.自定义类型

CREATE OR REPLACE TYPE TYPE_XXESB_PROD_LINE_OP_V AS OBJECT
(
  -- AUTHOR  : OP.49369
  -- CREATED : 2017/10/23 星期一 11:43:21
  -- PURPOSE : 
  
  -- ATTRIBUTES
  CONTRACTNO VARCHAR2(50),--系统合同号
  CONTRACTSELFNO VARCHAR2(50),--合同自编号
  PRICETYPE VARCHAR2(50),--价格类别
  WORKSHOP VARCHAR2(50),--车间
  MATERIEL VARCHAR2(50),--物料
  PRICE NUMBER(16,2),--价格
  QUANTITY INTEGER,--数量
  DISCOUNT NUMBER--加盟商折算系数
)NOT FINAL;

4.内存表

CREATE OR REPLACE TYPE TEMP_XXESB_PROD_LINE_TABLE IS TABLE OF TYPE_XXESB_PROD_LINE_OP_V;

向内存表中写数据 参考http://www.itpub.net/forum.php?mod=viewthread&tid=1707128

-- Created : 8/16/2012 3:00:03 PM
-- Purpose : 内存表使用

--1.建立表类型
CREATE OR REPLACE TYPE ty_obj IS OBJECT ( p_empno   VARCHAR2 (50)
                                        , p_ename   VARCHAR2 (50)
                                        , job       VARCHAR2 (50)
                                        );
                                       
--2.建立数组
CREATE OR REPLACE TYPE ty_objtab IS TABLE OF ty_obj;

--3.建立函数
CREATE OR REPLACE FUNCTION func_info RETURN ty_objtab
IS
    v_ty_objtab ty_objtab := ty_objtab(); --返回内存表
BEGIN
    FOR cur IN (SELECT * FROM emp) LOOP
        v_ty_objtab.extend;
        v_ty_objtab(v_ty_objtab.count) := ty_obj(cur.empno,cur.ename,cur.job);
    END LOOP;
   
  RETURN v_ty_objtab;

END func_info;
--4.测试1
--查询出所有结果
SELECT * FROM TABLE(func_info);
--查询出部分结果
DECLARE
    vtab ty_objtab;
BEGIN
    vtab := func_info;
    dbms_output.put_line(vtab(1).p_empno);
END;
--查询结果行数
DECLARE
    vtab ty_objtab;
BEGIN
    vtab := func_info;
    dbms_output.put_line(vtab.count);
END;
--综合操作
DECLARE
    vtab ty_objtab;
BEGIN
    vtab := func_info;
    FOR i IN 1..vtab.count LOOP
        --修改内存表中数据
        vtab(i).p_ename := vtab(i).p_ename || 'mm';
        --读取内存表中数据
        dbms_output.put_line(vtab(i).p_ename);
        --测试表明 操作成功
    END LOOP;
END;

 

posted on 2017-10-27 16:13  吃肉不吃菜  阅读(6329)  评论(0编辑  收藏  举报

导航