我和同事由于需要从用户的数据库中导出大量的表,但是由于种种原因,只能用创建的方式导,因此写了如下存储过程。
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来尝试我们的创建表存储过程,还是一样的错误,看来在实现机制上,还是没有跳脱游标的操作。
分享到:
相关推荐
隐式游标是在执行DML(数据操纵语言)操作或单行`SELECT INTO`语句时由Oracle自动创建的游标。它主要用于处理单行记录。 ##### 1. 使用场景 - **插入操作**:`INSERT` - **更新操作**:`UPDATE` - **删除操作**:`...
多维度查询时通常需要建立多个游标循环,查询效率无法得到保障,现在通过游标和substr()函数相结合的方式提高查询效率
- **从游标提取数据**:使用FETCH语句从游标中获取数据,可以循环执行此步骤,直到没有更多行可供处理。 通过熟练掌握Oracle数据库游标,开发者可以编写出更加灵活和高效的数据库应用程序,处理大数据量时能有效...
在Oracle数据库中,循环游标是一种非常重要的编程技术,它允许开发者通过循环结构来处理查询结果集中的每一行数据。这种技术在处理大量数据时尤为有用,因为它可以逐行访问数据,而无需一次性将所有数据加载到内存中...
以下是关于Oracle游标使用的一些关键知识点: 1. **游标的基本概念**: 游标(Cursor)是一种机制,它允许我们遍历和操作由SQL查询返回的结果集。通过游标,我们可以控制数据的读取顺序,一次只处理一行,或者在...
oracle笔记游标的使用,游标的详细代码案例,游标知识点笔记!
Oracle 数据库游标的使用方法 Oracle 数据库游标是指在查询返回结果超过一行时,需要使用的显式游标。用户不能使用 select into 语句,而是需要使用游标来处理多行查询结果。在 PL/SQL 中,隐式游标会在查询开始时...
### MySQL游标(循环操作) #### 一、游标简介 在MySQL中,游标是一种数据库对象,主要用于处理存储过程中的结果集。游标允许我们逐行地读取查询结果,这对于需要对每一行数据执行特定操作的情况非常有用。通过...
但是,动态SQL和动态游标的使用需要谨慎,因为它们可能会引发一些安全问题,比如SQL注入攻击。 总结来说,Oracle数据库中的游标是一个强大的工具,它不仅可以提高数据处理的效率,还可以为复杂的查询和数据操作提供...
1. **隐式游标**:每当执行一个SQL语句时,Oracle都会自动使用隐式游标。系统会自动处理游标的打开、提取和关闭,开发者通常无需直接管理。 2. **显式游标**:显式游标允许程序员更精细地控制数据处理过程,包括...
Oracle的游标是数据库开发中的一个重要概念,尤其在PL/SQL编程中,游标用于处理SQL查询结果集,使得我们能够逐行处理数据,而不仅仅局限于一次性获取所有数据。在这个主题中,我们将深入探讨游标的定义、类型、使用...
### Oracle游标循环详解 #### 一、引言 在Oracle数据库编程中,游标是一种非常重要的机制,用于处理查询结果集。通过游标,我们可以逐行读取数据,并执行复杂的逻辑操作。本文将详细介绍Oracle中三种常见的游标...
Oracle 游标概述 Oracle 游标是 Oracle 数据库中的一种重要概念,用于查询数据库,获取记录集合(结果集)的指针。游标可以看作是一个临时表,你可以对其每一行的数据进行任意的操作。本文将对 Oracle 游标的概念、...
Oracle 教案:深入理解 Oracle 存储过程、游标与 SQL 语句及 PL/SQL Oracle 是全球领先的数据库管理系统提供商,不仅提供数据库产品,还包括中间件、云计算服务等全面的企业级解决方案。"Oracle"一词源于古希腊神话...
此外,Oracle还提供了隐式游标,它是在执行DML语句时自动创建的。例如,当你执行一个`UPDATE`或`DELETE`语句时,系统会自动创建一个隐式游标,你可以通过`%ROWCOUNT`属性来获取受影响的行数。 需要注意的是,虽然...
oracle数据库游标实验报告!oracle数据库游标实验报告!oracle数据库游标实验报告!
While 循环游标需要手动打开和关闭游标,并使用 Fetch 语句获取记录。 在实际应用中,游标可以用于指定结果集中特定行的位置、基于当前的结果集位置检索一行或连续的几行、在结果集中修改行中的数据、对其他用户所...
Oracle数据库中的游标是处理查询结果集的一种重要机制,尤其在需要逐行处理多行数据时。游标允许我们按照需要遍历查询结果,并对每一行进行操作。本篇文章将详细解析Oracle数据库中游标的使用方法。 首先,游标分为...
- 在循环中使用`fetch into`语句取出游标中的数据,`exit when rowList%notfound`用于检测是否还有更多记录。 3. **REF游标**: - REF游标是动态游标的一种,它允许处理动态SQL查询的结果集,即在运行时创建SQL...