存储过程中的游标问题
我的存储过程如下,为什么打开游标那一句老是出错,提示:出现符号 "FOR"在需要下列之一时: := . ( @ % ; not null range default character 符号 ":=在 "FOR" 继续之前已插入。
(
itable1 varchar,
itable2 varchar,
ReturnValue out number
)
as
begin
Declare
var_sql varchar2(8000); --存放构造游标的sql语句
type mycursor is ref cursor; --定义游标类型
mycur mycursor; --定义动态游标
var_sql := 'select a.acct_id,b.acc_nbr,a.acct_item_type_id,a.charge '
|| 'from '||itable1||' a,'
|| itable2||' b '
|| 'where a.id=b.id ';
open mycur for var_sql; --打开游标
.........
.........
.........
......... --执行代码
问题点数:20、回复次数:8Top
1 楼yuyu1980()回复于 2006-07-03 12:38:05 得分 0
varchar2(8000) 长度是不是越界了?Top
2 楼lxj2000()回复于 2006-07-03 12:43:42 得分 0
改小了也不行Top
3 楼lxj2000()回复于 2006-07-03 13:14:50 得分 0
是csdn的人气不够旺吗,还是分少,分少可以加.Top
4 楼h_lj(贝塔)回复于 2006-07-03 14:19:35 得分 5
as
begin
Declare
var_sql varchar2(8000); --存放构造游标的sql语句
type mycursor is ref cursor; --定义游标类型
mycur mycursor; --定义动态游标
有这么写法的吗?我真的怀疑你是在逗我们。不过还是指出一下吧。
1.变量定义要在as之后。并且不要用declare.
2.begin要在变量定义之后写。Top
5 楼sozdream(Dream.Zhang)回复于 2006-07-03 16:26:35 得分 5
楼上正解~
定义存储过程不需要 declare 关键字~
只需要:
create or replace procedure name as
.....--定义
begin
... --内容
exception
... --异常
end;
只有在写test script时,才需要declare关键字.
declare
... --定义
begin
... --内容
exception
... --异常
end;Top
6 楼sozdream(Dream.Zhang)回复于 2006-07-03 16:27:42 得分 5
给你个例子~ 我测试通过的.
create or replace procedure ex_dsql_cursorvariable(colName varchar2, colValue varchar2) is
--表名,列名等object schema不确定时,不能使用cursor;
--必须使用ref cursor; (即cursor variable)
type CurTypeTerm is ref cursor;
curTerm CurTypeTerm;
sqlSelect varchar(100);
recTerm term%rowtype;
begin
--千万不可在 :colValue 前后加%, 参照本例中在using时加%.
sqlSelect:='select * from term where '||colName||' like :colValue ';
open curTerm for sqlSelect using '%'||colValue||'%';
loop
fetch curTerm into recTerm;
exit when curTerm%notfound;
dbms_output.put_line('Result '||curTerm%rowcount||':');
dbms_output.put_line(' '||recTerm.eng_name);
dbms_output.put_line(' '||recTerm.eng_abbr_name);
dbms_output.put_line(' '||recTerm.chn_name);
end loop;
close curTerm;
exception
when others then
dbms_output.put_line(sqlerrm);
raise;
end;
Top
7 楼hhmjenny(麦饼)回复于 2006-07-03 16:54:49 得分 5
CREATE PROCEDURE RP_TEST(
itable1 varchar,
itable2 varchar,
ReturnValue out number
)
IS
var_sql varchar2(8000);
BEGIN
DECLARE
CURSOR C IS SELECT * FROM ...;
BEGIN
OPEN C;
LOOP
............
END;
不知道这种类型的写法是不是你需要的?Top
8 楼cky417(cky417)回复于 2006-10-25 10:55:06 得分 0
hhmjenny(麦饼)的写法合适你Top




