在Orcale里如何建立和使用临时表?

yangzong19 2010-11-05 06:31:43
在Orcale里如何建立和使用临时表?我写了一个返回数据集的存储过程,但我不知道如何在里面建立和使用临时表?

CREATE OR REPLACE PROCEDURE sp_getResult(IDvalue in integer,rst out sys_refcursor) is
begin
open rst for select * from test1 where id =IDvalue;
end;


我现在现在 sp_getResult的存储过程里建立一个临时表yy(id int,test varchar2(20)) 然后把表test1里的数据用while循环一条一条读出记录然后插入到临时表yy里,最后select * from yy列出yy表里的记录,具体代码该如何写,请高手指教,谢谢
...全文
275 13 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
feixianxxx 2010-11-09
  • 打赏
  • 举报
回复
...块中不能执行DDL语句...试试动态解决你的问题
心中的彩虹 2010-11-08
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 yangzong19 的回复:]
str:='create global temporary table tmp_tb1(id number,name varchar2(10)) on commit preserve rows';
execute immediate str;

这个语句我试过,但如果是用这种形式的话那在存储过程里如何应用零时表呢例如:
open rst for select * from tmp_tb1;……
[/Quote]
直接在一个过程体动态创建在调用是不行的 你先在外面创建在传入数据
yangzong19 2010-11-07
  • 打赏
  • 举报
回复
str:='create global temporary table tmp_tb1(id number,name varchar2(10)) on commit preserve rows';
execute immediate str;

这个语句我试过,但如果是用这种形式的话那在存储过程里如何应用零时表呢例如:
open rst for select * from tmp_tb1;如果我再存储过程里写入这句的话就不法保存,提示找不到此表!

还有如何用循环读出零时表里的数据呢?麻烦告知谢谢?

tao_gun 2010-11-07
  • 打赏
  • 举报
回复

to wkc168

create global temporary table tmp_tb1(id number,name varchar2(10))
on commit preserve rows
以上建表的语句我知道,但是我把它加到存储过程里保存的时候就会出错,你放在命令行里是可以运行,但我需要的是放到存储过程里来实现呀!麻烦再帮看看,谢谢!

CREATE OR REP……
jdsnhan 2010-11-07
  • 打赏
  • 举报
回复
临时表是动态创建的,表名自然访问不到;
如果需要插入记录,需要传入变量。
yangzong19 2010-11-07
  • 打赏
  • 举报
回复
to wkc168
str:='create global temporary table tmp_tb1(id number,name varchar2(10)) on commit preserve rows';
execute immediate str;

这个语句我试过,但如果是用这种形式的话那在存储过程里如何应用零时表呢例如:
open rst for select * from tmp_tb1;如果我再存储过程里写入这句的话就不法保存,提示找不到此表!

还有如何用循环读出零时表里的数据呢?麻烦告知谢谢?
yangzong19 2010-11-07
  • 打赏
  • 举报
回复
str:='create global temporary table tmp_tb1(id number,name varchar2(10)) on commit preserve rows';
execute immediate str;

这个语句我试过,但如果是用这种形式的话那在存储过程里如何应用零时表呢例如:
open rst for select * from tmp_tb1;如果我再存储过程里写入这句的话就不法保存,提示找不到此表!

还有如何用循环读出零时表里的数据呢?麻烦告知谢谢?
yangzong19 2010-11-06
  • 打赏
  • 举报
回复
to wkc168
str:='create global temporary table tmp_tb1(id number,name varchar2(10)) on commit preserve rows';
execute immediate str;

这个语句我试过,但如果是用这种形式的话那在存储过程里如何应用零时表呢例如:
open rst for select * from tmp_tb1;如果我再存储过程里写入这句的话就不法保存,提示找不到此表!

还有如何用循环读出零时表里的数据呢?麻烦告知谢谢?
心中的彩虹 2010-11-06
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 yangzong19 的回复:]
to wkc168

create global temporary table tmp_tb1(id number,name varchar2(10))
on commit preserve rows
以上建表的语句我知道,但是我把它加到存储过程里保存的时候就会出错,你放在命令行里是可以运行,但我需要的是放到存储过程里来实现呀!麻烦再帮看看,谢谢!

CREATE OR REP……
[/Quote]




--拼接

CREATE OR REPLACE PROCEDURE sp_getResult(IDvalue in integer,rst out sys_refcursor)
is
str varchar2(1000);
begin
str:='create global temporary table tmp_tb1(id number,name varchar2(10)) on commit preserve rows';
execute immediate str;
open rst for select * from test1 where id =IDvalue;
end;








碧水幽幽泉 2010-11-06
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 yangzong19 的回复:]
to wkc168

create global temporary table tmp_tb1(id number,name varchar2(10))
on commit preserve rows
以上建表的语句我知道,但是我把它加到存储过程里保存的时候就会出错,你放在命令行里是可以运行,但我需要的是放到存储过程里来实现呀!麻烦再帮看看,谢谢!

CREATE OR REP……
[/Quote]

存储过程中不能直接使用DDL语句(如:create、alter等),需要转换下才能执行。
例如:
[Quote]
....
v_sql := 'create global temporary table tmp_tb1(id number,name varchar2(10)) on commit preserve rows';
....
execute immediate v_sql;
[/Quote]

yangzong19 2010-11-05
  • 打赏
  • 举报
回复
to wkc168

create global temporary table tmp_tb1(id number,name varchar2(10))
on commit preserve rows
以上建表的语句我知道,但是我把它加到存储过程里保存的时候就会出错,你放在命令行里是可以运行,但我需要的是放到存储过程里来实现呀!麻烦再帮看看,谢谢!

CREATE OR REPLACE PROCEDURE sp_getResult(IDvalue in integer,rst out sys_refcursor) is
begin

create global temporary table tmp_tb1(id number,name varchar2(10))
on commit preserve rows
如果存储过程里加上上面这段代码就保存不了,放在命令行是可以执行的

open rst for select * from test1 where id =IDvalue;
end;
tangren 2010-11-05
  • 打赏
  • 举报
回复
oracle的临时表与sqlserver的临时表有很大的区别,oracle中的临时表,更象是永久表,一般在存储过程外先建立好,只不过数据是临时的,有两种:提交数据时自动清除临时数据(基于事务) ;会话结束时自动清除临时数据(基于会话)。

心中的彩虹 2010-11-05
  • 打赏
  • 举报
回复
[Quote=引用楼主 yangzong19 的回复:]
在Orcale里如何建立和使用临时表?我写了一个返回数据集的存储过程,但我不知道如何在里面建立和使用临时表?

CREATE OR REPLACE PROCEDURE sp_getResult(IDvalue in integer,rst out sys_refcursor) is
begin
open rst for select * from test1 where id =IDval……
[/Quote]



SQL> create global temporary table tmp_tb1(id number,name varchar2(10))
2 on commit preserve rows
3 /

表已创建。

SQL> ---会话行的,会话结束数据就清空
SQL> create global temporary table tmp_tb2(id number,name varchar2(10))
2 on commit delete rows
3 /

表已创建。

SQL> --事件型的,事件完成就清空数据



17,140

社区成员

发帖
与我相关
我的任务
社区描述
Oracle开发相关技术讨论
社区管理员
  • 开发
  • Lucifer三思而后行
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧