`
timnity
  • 浏览: 104956 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

Oracle中用游标循环DDL语句产生的一些问题

阅读更多
  我和同事由于需要从用户的数据库中导出大量的表,但是由于种种原因,只能用创建的方式导,因此写了如下存储过程。

create or replace procedure createtable is
  tablename varchar2(100) ;
  sqlstring varchar2(1000);
  CURSOR cur_1 is select "name" from sysobjects@sql2000 where "type"='U';
begin  
    open cur_1;
    loop
      fetch cur_1 into tablename;
      EXIT WHEN cur_1%NOTFOUND;
      sqlstring := 'CREATE TABLE ' || tablename || ' as select * from ' || tablename || '@sql2000';
      dbms_output.put_line(sqlstring);
      EXECUTE IMMEDIATE 'CREATE TABLE ' || tablename || ' as select * from ' || tablename || '@sql2000';
    end loop; 
    close cur_1;  
end;


可是执行的时候报错“ORA-01002读取违反顺序”。比较合理的解释是:
  “create table 这是个ddl语句,系统会隐式自动作commit。在透明网关访问过程中是遵循ansi标准的,根据ansi标准,cursor fetch loop中如果有commit,会自动close cursor。这就造成你在执行fetch 时候出现ORA-01002。可以把cursor的结果写入collection,然后通过另外的处理来进行数据导入。”
可是除了游标和游标变量,在存储过程中无法用其他的collection 。在应用中可以调用,但是想用一个存储过程独立完成的目标看来比较难以实现。或者可以使用建立临时表的方式来解决,不过略显笨拙了些。
  另外看到一个for loop的用法,不常见,但是真的比较简洁。
  引用至:http://www.cnblogs.com/jjiac/archive/2007/01/24/628831.html
--------------------------------------------------------------------------------
我们在Oracle存储过程中需要遍历一张表,应该怎样做。我想大多少的人第一个念头就是Cursor。
  
  比如:
  
  create or replace procedure StudyCursor(
  resulst out integer
  ) is
  v_tablename varchar(30);
  v_tabletype varchar(11);
  cursor mycursor is select * from cat;
  begin
  open mycursor;
  loop
  fetch mycursor into v_tablename,v_tabletype;
  
  null; --you can use tablename and v_tabletype
  end loop;
  close mycursor;
  end StudyCursor;
  
  最近在看代码是,发现其实我们还有一个更方便的方法就是使用for in loop … end loop
  
  create or replace procedure StudyFor(
  resulst out integer
  ) is
  begin
  for emm in(select * from cat) loop
  null; --you can use emm.table_name and emm.table_type
  end loop;
  return ;
  end StudyFor;
  
  是不是更方便,我要使用的查询结果,只需使用emm.table_name和emm.table_type即可。
  
  查找了Oracle的官方文档,似乎没有看见for loop的此种用法。确实很奇妙,只是不知道oracle内部具体的实现方法。

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

用了for loop来尝试我们的创建表存储过程,还是一样的错误,看来在实现机制上,还是没有跳脱游标的操作。
分享到:
评论

相关推荐

    oracle 隐式游标,显示游标,游标循环

    隐式游标是在执行DML(数据操纵语言)操作或单行`SELECT INTO`语句时由Oracle自动创建的游标。它主要用于处理单行记录。 ##### 1. 使用场景 - **插入操作**:`INSERT` - **更新操作**:`UPDATE` - **删除操作**:`...

    oracle解决游标多维度循环查询效率过低方案

    多维度查询时通常需要建立多个游标循环,查询效率无法得到保障,现在通过游标和substr()函数相结合的方式提高查询效率

    Oracle 数据库游标使用大全

    - **从游标提取数据**:使用FETCH语句从游标中获取数据,可以循环执行此步骤,直到没有更多行可供处理。 通过熟练掌握Oracle数据库游标,开发者可以编写出更加灵活和高效的数据库应用程序,处理大数据量时能有效...

    oracle循环游标

    在Oracle数据库中,循环游标是一种非常重要的编程技术,它允许开发者通过循环结构来处理查询结果集中的每一行数据。这种技术在处理大量数据时尤为有用,因为它可以逐行访问数据,而无需一次性将所有数据加载到内存中...

    oracle数据库游标使用例子

    以下是关于Oracle游标使用的一些关键知识点: 1. **游标的基本概念**: 游标(Cursor)是一种机制,它允许我们遍历和操作由SQL查询返回的结果集。通过游标,我们可以控制数据的读取顺序,一次只处理一行,或者在...

    oracle笔记游标的使用

    oracle笔记游标的使用,游标的详细代码案例,游标知识点笔记!

    快速掌握Oracle数据库游标的使用方法

    Oracle 数据库游标的使用方法 Oracle 数据库游标是指在查询返回结果超过一行时,需要使用的显式游标。用户不能使用 select into 语句,而是需要使用游标来处理多行查询结果。在 PL/SQL 中,隐式游标会在查询开始时...

    Mysql游标(循环操作)

    ### MySQL游标(循环操作) #### 一、游标简介 在MySQL中,游标是一种数据库对象,主要用于处理存储过程中的结果集。游标允许我们逐行地读取查询结果,这对于需要对每一行数据执行特定操作的情况非常有用。通过...

    oracle数据库的游标

    但是,动态SQL和动态游标的使用需要谨慎,因为它们可能会引发一些安全问题,比如SQL注入攻击。 总结来说,Oracle数据库中的游标是一个强大的工具,它不仅可以提高数据处理的效率,还可以为复杂的查询和数据操作提供...

    Oracle数据库游标使用.rar

    1. **隐式游标**:每当执行一个SQL语句时,Oracle都会自动使用隐式游标。系统会自动处理游标的打开、提取和关闭,开发者通常无需直接管理。 2. **显式游标**:显式游标允许程序员更精细地控制数据处理过程,包括...

    Oracle的游标学习

    Oracle的游标是数据库开发中的一个重要概念,尤其在PL/SQL编程中,游标用于处理SQL查询结果集,使得我们能够逐行处理数据,而不仅仅局限于一次性获取所有数据。在这个主题中,我们将深入探讨游标的定义、类型、使用...

    Oracle 游标循环

    ### Oracle游标循环详解 #### 一、引言 在Oracle数据库编程中,游标是一种非常重要的机制,用于处理查询结果集。通过游标,我们可以逐行读取数据,并执行复杂的逻辑操作。本文将详细介绍Oracle中三种常见的游标...

    oracle游标的总结oracle游标的总结

    Oracle 游标概述 Oracle 游标是 Oracle 数据库中的一种重要概念,用于查询数据库,获取记录集合(结果集)的指针。游标可以看作是一个临时表,你可以对其每一行的数据进行任意的操作。本文将对 Oracle 游标的概念、...

    Oracle教案 Oracle 存储过程 游标 SQL语句 PL/SQL

    Oracle 教案:深入理解 Oracle 存储过程、游标与 SQL 语句及 PL/SQL Oracle 是全球领先的数据库管理系统提供商,不仅提供数据库产品,还包括中间件、云计算服务等全面的企业级解决方案。"Oracle"一词源于古希腊神话...

    ORACLE 游标使用示例

    此外,Oracle还提供了隐式游标,它是在执行DML语句时自动创建的。例如,当你执行一个`UPDATE`或`DELETE`语句时,系统会自动创建一个隐式游标,你可以通过`%ROWCOUNT`属性来获取受影响的行数。 需要注意的是,虽然...

    oracle数据库游标实验报告

    oracle数据库游标实验报告!oracle数据库游标实验报告!oracle数据库游标实验报告!

    Oracle存储过程游标详解

    While 循环游标需要手动打开和关闭游标,并使用 Fetch 语句获取记录。 在实际应用中,游标可以用于指定结果集中特定行的位置、基于当前的结果集位置检索一行或连续的几行、在结果集中修改行中的数据、对其他用户所...

    oracle-游标使用汇总.doc

    Oracle数据库中的游标是处理查询结果集的一种重要机制,尤其在需要逐行处理多行数据时。游标允许我们按照需要遍历查询结果,并对每一行进行操作。本篇文章将详细解析Oracle数据库中游标的使用方法。 首先,游标分为...

    非常详细的Oracle游标整理

    - 在循环中使用`fetch into`语句取出游标中的数据,`exit when rowList%notfound`用于检测是否还有更多记录。 3. **REF游标**: - REF游标是动态游标的一种,它允许处理动态SQL查询的结果集,即在运行时创建SQL...

Global site tag (gtag.js) - Google Analytics