我和同事由于需要从用户的数据库中导出大量的表,但是由于种种原因,只能用创建的方式导,因此写了如下存储过程。
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来尝试我们的创建表存储过程,还是一样的错误,看来在实现机制上,还是没有跳脱游标的操作。
分享到:
相关推荐
游标是SQL的一个内存工作区,由系统或用户以变量的形式定义。游标的作用就是用于临时存储从数据库中提取的数据块。在某些情况下,需要把数据从存放在磁盘的表中调到计算机内存中进行处理,最后将处理结果显示出来或...
oracle 游标FOR循环
多维度查询时通常需要建立多个游标循环,查询效率无法得到保障,现在通过游标和substr()函数相结合的方式提高查询效率
有关于oracle的循环游标的内容。
oracle游标的总结oracle游标的总结oracle游标的总结oracle游标的总结oracle游标的总结oracle游标的总结oracle游标的总结oracle游标的总结oracle游标的总结
Oracle 数据库游标使用大全,自己整的,比你搜的好
oracle笔记游标的使用,游标的详细代码案例,游标知识点笔记!
Mysql游标(循环操作)
Oracle数据库游标使用示例 Oracle数据库游标使用示例 Oracle数据库游标使用示例
简单的oracle游标使用小例子~~ 一份文档,实验用的。
Oracle数据库游标使用大全 Oracle数据库游标使用大全Oracle数据库游标使用大全
oracle-游标使用汇总,觉得不错所以转了
oracle数据库游标实验报告!oracle数据库游标实验报告!oracle数据库游标实验报告!
当查询返回结果超过一行时,就需要一个显式游标,此时用户不能使用select into语句。本文介绍了Oracle数据库游标的使用方法。
ORACLE技术文档\oracle cursor 游标.docORACLE技术文档\oracle cursor 游标.docORACLE技术文档\oracle cursor 游标.doc
oracle数据库的游标详述,以及各游标相关信息的具体代码示例。可以帮助初学者以及数据库管理员更好的理解和学习游标的使用和操作。
ORACLE 游标使用示例,给大家可以共享一下。
Oracle 在模块中经常会使用游标进行数据相关操作,循环使用颇多。。。