Oracle表值函数的两种写法

-- 创建表
DECLARE
  CNT INTEGER;
BEGIN
  SELECT COUNT(0)
    INTO CNT
    FROM USER_ALL_TABLES
   WHERE TABLE_NAME = 'CMSTEMP';
  IF CNT = 0 THEN
    EXECUTE IMMEDIATE '  CREATE TABLE CMSTEMP(
  ID INTEGER PRIMARY KEY,
  NAME VARCHAR2(32),
  AGE INTEGER,
  ADDRESS VARCHAR2(64)
  )';
  END IF;
END;
-- 创建 type
DECLARE
  CNT INTEGER;
BEGIN
  SELECT COUNT(0) INTO CNT FROM USER_TYPES WHERE TYPE_NAME = 'CMSTEMPTYPE';
  IF CNT = 0 THEN
    EXECUTE IMMEDIATE 'CREATE OR REPLACE TYPE CMSTEMPTYPE AS OBJECT (
 ID INTEGER,
  NAME VARCHAR2(32),
  AGE INTEGER,
  ADDRESS VARCHAR2(64)
)';
  END IF;
END;
-- 创建type 表
DECLARE
CNT INTEGER;
BEGIN
  SELECT COUNT(0) INTO CNT FROM USER_TYPES WHERE TYPE_NAME = 'CMSTEMPTYPETABLE';
  IF CNT = 0 THEN
    EXECUTE IMMEDIATE '
CREATE OR REPLACE TYPE CMSTEMPTYPETABLE AS TABLE OF CMSTEMPTYPE ' ;
    END IF;
  END;
-- 创建临时表
DECLARE
  CNT INTEGER;
BEGIN
  SELECT COUNT(0)
    INTO CNT
    FROM USER_ALL_TABLES
   WHERE TABLE_NAME = 'CMSTEMPGLO';
  IF CNT = 0 THEN
    EXECUTE IMMEDIATE 'CREATE GLOBAL TEMPORARY TABLE CMSTEMPGLO(
  ID INTEGER PRIMARY KEY,
  NAME VARCHAR2(32),
  AGE INTEGER,
  ADDRESS VARCHAR2(64)
  )
  ON COMMIT PRESERVE ROWS';
  END IF;
END;
--创建包
CREATE OR REPLACE PACKAGE GLOBALPACKGE
AS
TYPE CUR1 IS REF CURSOR;
END;
第一种方式使用临时表
CREATE OR REPLACE FUNCTION NS_CMS_GETCMSTEM(NAME VARCHAR2)
  RETURN CMSTEMPTYPETABLE
  PIPELINED IS
  PRAGMA AUTONOMOUS_TRANSACTION;
  V_NAME    VARCHAR2(32);
  V_AGE     INTEGER;
  V_ADDRESS VARCHAR2(64);
  V_ID      INTEGER;
  RWS       CMSTEMPTYPE := CMSTEMPTYPE(NULL, NULL, NULL, NULL);
  V_CUR     GLOBALPACKGE.CUR1;
BEGIN
  EXECUTE IMMEDIATE 'TRUNCATE TABLE CMSTEMPGLO';
  FOR REC IN (SELECT * FROM CMSTEMP) LOOP
    V_NAME    := REC.NAME;
    V_AGE     := REC.AGE;
    V_ID      := REC.ID;
    V_ADDRESS := REC.ADDRESS;
    INSERT INTO CMSTEMPGLO
      (ID, ADDRESS, AGE, NAME)
    VALUES
      (V_ID, V_ADDRESS, V_AGE, V_NAME);
      DBMS_OUTPUT.PUT_LINE('11111111111');
  END LOOP;
  COMMIT;
  OPEN V_CUR FOR
    SELECT * FROM CMSTEMPGLO;
  LOOP
    FETCH V_CUR
      INTO RWS.ID,RWS.NAME,RWS.AGE,RWS.ADDRESS;
    EXIT WHEN V_CUR%NOTFOUND;
    PIPE ROW(RWS);
  END LOOP;
  CLOSE V_CUR;
END;


第二种方式不适用临时表
CREATE OR REPLACE FUNCTION NS_CMS_GETCMSTEMP(NAME VARCHAR2)
  RETURN CMSTEMPTYPETABLE
  PIPELINED AS
  PRAGMA AUTONOMOUS_TRANSACTION;
  V_CUR     GLOBALPACKGE.CUR1;
  V_NAME    VARCHAR2(32);
  V_ADDRESS VARCHAR2(64);
  V_AGE     INTEGER;
  V_ID      INTEGER;
  RET_ROW   CMSTEMPTYPE := CMSTEMPTYPE(NULL, NULL, NULL, NULL);
  RET_TABLE CMSTEMPTYPETABLE := CMSTEMPTYPETABLE();  -- 这里必须这样写
BEGIN
  FOR REC IN (SELECT * FROM CMSTEMP) LOOP
    RET_TABLE.EXTEND;
    RET_ROW.ID      := REC.ID;
    RET_ROW.AGE     := REC.AGE;
    RET_ROW.NAME    := REC.NAME;
    RET_ROW.ADDRESS := REC.ADDRESS;
    RET_TABLE(RET_TABLE.COUNT) := RET_ROW;
  END LOOP;
  COMMIT;
  open V_CUR for
  select * from table(RET_TABLE);
  loop
    fetch V_CUR into RET_ROW.ID,RET_ROW.NAME,RET_ROW.AGE,RET_ROW.ADDRESS; --顺序要和type对象里定义的顺序保持一致
    exit when V_CUR%notfound;
    pipe row(RET_ROW);
    end loop;
    close v_cur;
END;
插入数据
<pre class="sql" name="code">declare
i integer;
begin
  for i in 1 ..100 loop
    insert into cmstemp values (i,'zhangsan'||i,1+i,'王府大街'||i);
    commit;
    end loop;
  end;


查询sql
<pre class="sql" name="code">select * from table(ns_cms_getcmstemp('')) ;
select * from table(NS_CMS_GETCMSTEM('')) ; 


				
时间: 2024-09-20 00:56:48

Oracle表值函数的两种写法的相关文章

状态机的两种写法

有限状态机FSM思想广泛应用于硬件控制电路设计,也是软件上常用的一种处理方法(软 件上称为FMM--有限消息机).它把复杂的控制逻辑分解成有限个稳定状态,在每个状态 上判断事件,变连续处理为离散数字处理,符合计算机的工作特点.同时,因为有限状 态机具有有限个状态,所以可以在实际的工程上实现.但这并不意味着其只能进行有限 次的处理,相反,有限状态机是闭环系统,有限无穷,可以用有限的状态,处理无穷的 事务.     有限状态机的工作原理如图1所示,发生事件(event)后,根据当前状态(cur_st

js自调用匿名函数的三种写法(推荐)_javascript技巧

第一种: (function(){ console.log('hello world") })() 第二种: (function(){ console.log('hello world') }())  第三种: !function(){ console.log('hello world') }() 以上这篇js自调用匿名函数的三种写法(推荐)就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持. 以上是小编为您精心准备的的内容,在的博客.问答.公众号.人物.课程等栏目也有的相

JavaScript中的函数的两种定义方式和函数变量赋值_基础知识

复制代码 代码如下: <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>Insert title here</title> <script type="text/javascript"> /*I总结: 1.函数名可以做变量使用,可以赋值,可以传值 2.函数名当参数,传递给另一个函数 */ //===========

分析MS SQL Server里函数的两种用法

server|函数 SQL Server里函数的两种用法(可以代替游标) 1. 因为update里不能用存储过程,然而要根据更新表的某些字段还要进行计算.我们常常采用游标的方法,这里用函数的方法实现. 函数部分: 以下是引用片段: CREATE FUNCTION [DBO].[FUN_GETTIME] (@TASKPHASEID INT) RETURNS FLOAT AS BEGIN DECLARE @TASKID INT, @HOUR FLOAT, @PERCENT FLOAT, @RETUR

SQL Server里函数的两种用法(可以代替游标)

server|函数|游标 SQL Server里函数的两种用法(可以代替游标)1. 因为update里不能用存储过程,然而要根据更新表的某些字段还要进行计算.我们常常采用游标的方法,这里用函数的方法实现. 函数部分:CREATE FUNCTION [DBO].[FUN_GETTIME] (@TASKPHASEID INT) RETURNS FLOAT AS BEGIN   DECLARE @TASKID INT,          @HOUR FLOAT,           @PERCENT

Java范型的两种写法

1.原始的DAO层的类: package com.test; public class UserDao { public void add(User user){ //.保存实体的代码 } public User get(int id) { //.查询实体的代码 return null; } } 其中,User类代码比较简单,如下: package com.test; public class User { private int id; private String name; public

SQL Server里函数的两种用法

SQL Server里函数的两种用法(可以代替游标) 1. 因为update里不能用存储过程,然而要根据更新表的某些字段还要进行计算.我们常常采用游标的方法,这里用函数的方法实现. 函数部分: 以下是引用片段: CREATE FUNCTION [DBO].[FUN_GETTIME] (@TASKPHASEID INT) RETURNS FLOAT AS BEGIN DECLARE @TASKID INT, @HOUR FLOAT, @PERCENT FLOAT, @RETURN FLOAT IF

select-link中这样两种写法有什么区别?

问题描述 link中这样两种写法有什么区别? var query = from x in table select x; foreach (var item in x) { ... } foreach (var item in table) { ... } 解决方案 两种写法一样,而且性能也一样

位图-下面两种写法的区别,为什么第一种会报错?

问题描述 下面两种写法的区别,为什么第一种会报错? 第一种 BitmapFactory.decodeStream(conn.getInputStream()); 第二种 InputStream is = conn.getInputStream(); bitmap = BitmapFactory.decodeStream(is); 解决方案 没有看出有什么不同,InputStream is = conn.getInputStream(); bitmap = BitmapFactory.decode