`

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('')) ; 

 


 


 

分享到:
评论

相关推荐

    oracle常用函数全集

    根据提供的Oracle相关知识点,我们可以详细地探讨一下这些重要的Oracle函数及其用法,这对于数据库管理和查询都是非常有帮助的。 ### 1. CASE 表达式 CASE 表达式是一种非常有用的工具,它允许我们在SQL查询中进行...

    mysql与oracle差异总结

    MySql 中有三种注释方式,而 Oracle 只有两种。 10. 字符函数 MySql 中的 DATE_FORMAT 函数相当于 Oracle 中的 TO_CHAR 函数。MySql 中的 STR_TO_DATE 函数相当于 Oracle 中的 TO_DATE 函数。 11. 回车符、换行符...

    oracle的update的五种方式

    这种方式可以同时执行更新和插入操作,但写法比较繁琐,并且最多只能两个表关联,复杂的语句用 Merge 更新法将力不从心且效率差。 四、游标更新法 游标更新法是使用游标来遍历数据并执行更新操作,语法为:`BEGIN ...

    oracle数据库期末考试试题及答案一.pdf

    在 Oracle 数据库中, Cost-Based Optimizer (CBO) 和 Rule-Based Optimizer (RBO) 是两种不同的优化器。CBO 根据表统计找到最低成本的访问数据的方法确定执行计划,而 RBO 根据规则选择最佳执行路径来运行查询。在...

    oracle练习题和答案.doc

    这两种写法等价,都是计算佣金是否超过薪金的60%。 5. **多条件组合查询**:第五题涉及到了多个条件的组合查询,它选取了部门10中的经理(MANAGER)和部门20中的办事员(CLERK)。这种查询可以通过`OR`操作符结合两...

    Oracle练习笔试大全

    // (函数max() 求出emp表中sal字段的最大值) 46、select min(sal) from emp; // (函数max() 求出emp表中sal字段的最小值) 47、select avg(sal) from emp; //(avg()求平均薪水); 48、select to_char(avg(sal), '...

    分页代码Oracle

    在Oracle中,常用的分页查询方法有两种:ROWNUM和ROW_NUMBER()函数。 1. ROWNUM方法: ROWNUM是Oracle特有的行号函数,它会为每一行返回一个唯一的行号,从1开始。但是,ROWNUM的限制在于它是在查询结果集生成之后...

    Oracle SQL高级编程(资深Oracle专家力作,OakTable团队推荐)--随书源代码

    作者通过总结各自多年的软件开发和教学培训经验,与大家分享了掌握Oracle SQL所独有的丰富功能的技巧所在,内容涵盖SQL执行、联结、集合、分析函数、子句、事务处理等多个方面。读者可以学习到以下几个方面的技巧:...

    Oracle 练习题及答案

    这两种查询均用于找出没有任何员工所属的部门,即那些在`emp`表中未被提及的部门。 ### 6. 查询各部门的平均薪资 ```sql SELECT dname, AVG(sal) FROM emp, dept WHERE emp.deptno = dept.deptno GROUP BY dname; `...

    ORACLE DB2开发中的对比

    本文将深入探讨ORACLE和DB2两种主流数据库在开发过程中的对比,重点分析它们在不同场景下的语法差异。 首先,我们来看如何在ORACLE和DB2中选取前N条记录。在ORACLE中,可以使用`rownum`来限制查询结果的数量,例如`...

    Oracle与MySQL的几点区别

    ### Oracle与MySQL的区别详解 #### 一、分组查询(GROUP BY)的使用差异 在进行数据分组查询时,Oracle和MySQL之间存在细微但重要的差别。...了解这些差异对于有效地开发和维护基于这两种数据库的应用程序非常重要。

    Oracle和MySQL的区别

    Oracle和MySQL作为两种主流的关系型数据库管理系统,在很多方面都有着显著的不同之处。这些不同点不仅体现在基础的数据库管理和SQL语法上,还包括更高级的功能和特性。了解这些差异有助于开发者根据实际需求选择合适...

    Oracle考试题.docx

    在这个例子中,第C行的写法存在问题,因为在连接两个表时,应当使用`AND`关键字来连接条件,而不是直接使用逗号分隔。 ### 11. PL/SQL语言 #### 11.1 PL/SQL的特点 - **知识点解释**:题目中提到了在Oracle数据库...

    Oracle开发之报表函数

    Oracle开发中的报表函数是数据库查询和分析的重要工具,它们能够帮助开发者高效地处理大量数据,生成各类统计报表。本文将重点讨论如何优化全统计计算以及RATIO_TO_REPORT函数的使用。 首先,回顾一下《Oracle开发...

    Oracle面试题及答案整理

    题目中提到了一个SQL查询,涉及到两个表`table1`和`table1`的连接操作: ```sql SELECT t2.* FROM table1 t1, table1 t2 WHERE t1.fid = t2.fid AND t1.fno &lt;&gt; t2.fno; ``` **解析:** - 这里使用了逗号(`,`)来表示...

    ORACLE常识.txt

    `BLOB` 和 `CLOB` 是Oracle中的两种大型对象类型,分别用于存储二进制数据和字符数据。`DBMS_LOB` 包提供了许多用于操作这些大型对象的方法。例如: ```sql DECLARE a BLOB; len INTEGER; BEGIN SELECT stu_...

    Oracle到mysql转换的问题总结.doc

    在将Oracle数据库转换为...同时,由于两种数据库的性能特性和最佳实践不同,优化查询可能也是转换后的重要工作。在转换前,建议进行详尽的数据分析和测试,确保所有业务逻辑和数据一致性在新的环境中能得到正确处理。

    oracle常见面试题及答案.pdf

    在表空间上建表,创建两个表:用户表和邮件表。然后,写一个存储过程来实现增、删、改、查的操作。最后,写一个Java程序来调用存储过程。 2. FUNCTION、PROCEDURE和PACKAGE的区别是什么? 答案:FUNCTION和...

    318分组聚合,关联查询(多表连接查询)(连接查询),连接查询oracle写法,集合运算ld_景羊梅姜锦江杰乾磊磊磊甜森马太胡遥双琮天的博客-CSDN博客.pdf

    在数据库查询中,分组聚合和关联查询是两种非常重要的操作,它们被广泛应用于数据分析和信息提取。本文主要探讨了如何使用SQL语句,特别是Oracle数据库的语法,来执行这些操作。 分组聚合(Group By)是将数据按...

Global site tag (gtag.js) - Google Analytics