请教各位!急!很菜的问题

goodhy 2004-12-02 06:59:53
我在PL程序块中给一个varchar2类型的变量赋值,内容是打开一个游标,请问怎么样让oracle去执行这个varchar2变量中的语句。

create or replace procedure DotNetPagination()
is
type t_cursor is ref cursor;
v_cur t_cursor;
Cstr varchar2(1000);
begin
Cstr := 'OPEN v_cut FOR select * from cd_dwdm';

execute immediate Cstr; --这句话出错。

end;
...全文
159 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
goodhy 2004-12-06
  • 打赏
  • 举报
回复
正确答案由liuyi8903(juventus)提供
create or replace procedure DotNetPagination
is
type t_cursor is ref cursor;
v_cur t_cursor;
Cstr varchar2(1000);
begin
Cstr := ' select * from cd_dwdm';

execute immediate Cstr;
OPEN v_cur For cstr;

end DotNetPagination;

goodhy 2004-12-06
  • 打赏
  • 举报
回复
up
马前小卒 2004-12-03
  • 打赏
  • 举报
回复
up
goodhy 2004-12-03
  • 打赏
  • 举报
回复
啊!我是8.1.7
gogowhy 2004-12-03
  • 打赏
  • 举报
回复

to: goodhy(剑走偏锋)

你在什么地方测试的?

下面这个存储过程绝对没有问题,我测试过的。 oracle9i


create or replace procedure DotNetPagination
is
type t_cursor is ref cursor;
v_cur t_cursor;
Cstr varchar2(1000);
begin

Cstr := 'OPEN :aa FOR select * from tab';

execute immediate Cstr using v_cur;

end;
goodhy 2004-12-03
  • 打赏
  • 举报
回复
to:gogowhy(123)
非常感谢,可还是不行!通不过编译
goodhy 2004-12-03
  • 打赏
  • 举报
回复
还有什么办法可以在存储过程里执行一个变量中的sql语句,或者ddl语句,等等
goodhy 2004-12-03
  • 打赏
  • 举报
回复
to:zhaokeke2004(大力)
因为要在oracle的存储过程中返回一个记录急,只有是通过游标返回,所以要用到游标。之所以execute immediate 是因为创建这个游标的sql语句是不确定的,使通过参数传进来的,所以想利用execute immediate 动态的生成游标
gogowhy 2004-12-03
  • 打赏
  • 举报
回复
--不信的话,试试这个

create or replace procedure DotNetPagination
is
type t_cursor is ref cursor;
v_cur t_cursor;
Cstr varchar2(1000);
begin

Cstr := 'OPEN :aa FOR select * from tab';

execute immediate Cstr using v_cur;

end;
/



--good luck
gogowhy 2004-12-03
  • 打赏
  • 举报
回复

按照第二个应该不会错
呵呵~~

如果错的话,那就不是 execute immediate 的问题了

zhaokeke2004 2004-12-03
  • 打赏
  • 举报
回复
OPEN v_cut FOR select * from cd_dwdm
.......
不行么
zhaokeke2004 2004-12-03
  • 打赏
  • 举报
回复
为何一定要用execute immediate呢
goodhy 2004-12-03
  • 打赏
  • 举报
回复
to: gogowhy(123)
不行,照你说的改了,但是编译通不过,出错了。
gogowhy 2004-12-03
  • 打赏
  • 举报
回复
sorry ,笔误了

create or replace procedure DotNetPagination --如果没有参数,好象不用()
is
type t_cursor is ref cursor;
v_cur t_cursor;
Cstr varchar2(1000);
begin

Cstr := 'OPEN :v_cur111 FOR select * from cd_dwdm'; --变量前加了":",这里可以随意的名字

execute immediate Cstr using v_cur; --关键字 using

--如果是多个变量,那就按照string里面的顺序
--如:execute immediate Cstr using v_cur,v_cur2,v_cur3;

end;
goodhy 2004-12-03
  • 打赏
  • 举报
回复
to:zhpsam109(孤寂无边)
写错了,但是我改过来也还是不行,告诉我是一个无效的sql语句。
我如果把'OPEN v_cur FOR select * from cd_dwdm' 改成 'select * from cd_dwdm' 就可以不出错
所以我想知道怎么才能执行open v_cur这样的语句。
gogowhy 2004-12-03
  • 打赏
  • 举报
回复
看看是不是这样:

create or replace procedure DotNetPagination()
is
type t_cursor is ref cursor;
v_cur t_cursor;
Cstr varchar2(1000);
begin

Cstr := 'OPEN :v_cut FOR select * from cd_dwdm'; --变量前加了":"

execute immediate Cstr using v_cut; --关键字 using

--如果是多个变量,那就按照string里面的顺序
--如:execute immediate Cstr using v_cut,v_cut2,v_cut3;

end;
GerryYang 2004-12-03
  • 打赏
  • 举报
回复
create or replace procedure DotNetPagination()
is
type t_cursor is ref cursor;
v_cur t_cursor;
Cstr varchar2(1000);
cursor cur is select * from cd_dwdm;//定义邮标

begin
Open cursor; //打开邮标
close cursor;//关闭邮标
end;

zhpsam109 2004-12-03
  • 打赏
  • 举报
回复
声明的时候用的是v_cur,怎么到后面成了v_cut?

cstr:='select * from cd_dwdm';
open v_cur for cstr;

hyee 2004-12-02
  • 打赏
  • 举报
回复
begin
open v_cur for 'select ...';
end;

17,377

社区成员

发帖
与我相关
我的任务
社区描述
Oracle 基础和管理
社区管理员
  • 基础和管理社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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