请教各位!急!很菜的问题
我在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;
问题点数:50、回复次数:19Top
1 楼hyee(小狗旺财)回复于 2004-12-02 22:16:44 得分 5
begin
open v_cur for 'select ...';
end;Top
2 楼zhpsam109(JACKY.昊昊)回复于 2004-12-03 09:00:42 得分 5
声明的时候用的是v_cur,怎么到后面成了v_cut?
cstr:='select * from cd_dwdm';
open v_cur for cstr;
Top
3 楼GerryYang(轻尘)回复于 2004-12-03 09:01:23 得分 5
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;
Top
4 楼gogowhy(123)回复于 2004-12-03 09:10:08 得分 30
看看是不是这样:
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;
Top
5 楼goodhy(剑走偏锋)回复于 2004-12-03 09:16:12 得分 0
to:zhpsam109(孤寂无边)
写错了,但是我改过来也还是不行,告诉我是一个无效的sql语句。
我如果把'OPEN v_cur FOR select * from cd_dwdm' 改成 'select * from cd_dwdm' 就可以不出错
所以我想知道怎么才能执行open v_cur这样的语句。Top
6 楼gogowhy(123)回复于 2004-12-03 09:16:22 得分 0
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;
Top
7 楼goodhy(剑走偏锋)回复于 2004-12-03 09:23:25 得分 0
to: gogowhy(123)
不行,照你说的改了,但是编译通不过,出错了。Top
8 楼zhaokeke2004(男人·海洋)回复于 2004-12-03 09:23:48 得分 5
为何一定要用execute immediate呢Top
9 楼zhaokeke2004(男人·海洋)回复于 2004-12-03 09:24:34 得分 0
OPEN v_cut FOR select * from cd_dwdm
.......
不行么Top
10 楼gogowhy(123)回复于 2004-12-03 09:25:52 得分 0
按照第二个应该不会错
呵呵~~
如果错的话,那就不是 execute immediate 的问题了
Top
11 楼gogowhy(123)回复于 2004-12-03 09:27:14 得分 0
--不信的话,试试这个
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 luckTop
12 楼goodhy(剑走偏锋)回复于 2004-12-03 09:30:16 得分 0
to:zhaokeke2004(大力)
因为要在oracle的存储过程中返回一个记录急,只有是通过游标返回,所以要用到游标。之所以execute immediate 是因为创建这个游标的sql语句是不确定的,使通过参数传进来的,所以想利用execute immediate 动态的生成游标Top
13 楼goodhy(剑走偏锋)回复于 2004-12-03 09:33:15 得分 0
还有什么办法可以在存储过程里执行一个变量中的sql语句,或者ddl语句,等等Top
14 楼goodhy(剑走偏锋)回复于 2004-12-03 09:36:52 得分 0
to:gogowhy(123)
非常感谢,可还是不行!通不过编译Top
15 楼gogowhy(123)回复于 2004-12-03 09:38:19 得分 0
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;Top
16 楼goodhy(剑走偏锋)回复于 2004-12-03 09:39:53 得分 0
啊!我是8.1.7Top
17 楼hero1981(英雄)回复于 2004-12-03 09:54:10 得分 0
upTop
18 楼goodhy(剑走偏锋)回复于 2004-12-06 09:55:45 得分 0
upTop
19 楼goodhy(剑走偏锋)回复于 2004-12-06 10:18:54 得分 0
正确答案由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;
Top




