小弟近日研究动态SQL的使用,下面是我写的程序
运行于oracle 9i 下,pl/sql developer v7.0版本下
运行前先建表及数据如下
create table zlh_table (SERVICE_TYPE VARCHAR2(30));
insert into zlh_table 
select '111222333' from dual;
insert into zlh_table 
select '111222334' from dual;
insert into zlh_table 
select '111222335' from dual;
insert into zlh_table 
select '111222336' from dual;
insert into zlh_table 
select '111222337' from dual;
insert into zlh_table 
select '111222338' from dual;
insert into zlh_table 
select '111222339' from dual;
insert into zlh_table 
select '1112223310' from dual;
commit;
存储过程如下
create or replace procedure zlh_dbmd_sql_stu(my_table_name in varchar   )  as /* nColCursor := DBMS_SQL.OPEN_CURSOR;--取得游标ID
DBMS_SQL.PARSE(nColCursor, szColSyntax, DBMS_SQL.V7);  --执行游标程序
DBMS_SQL.DEFINE_COLUMN(nColCursor, 1, szColName, 33); --执行后变量1的值输出到szColName中。33为变量szColName的长度
nDbmsRet    := DBMS_SQL.EXECUTE(nColCursor); ----执行SQL文,如果是DML语句,则返回处理的行数 
v_ReturnRow:=DBMS_SQL.FETCH_ROWS(v_CursorID)--将匹配查询的行提取到缓冲区,每次一行,返回取到的行数,=0表示不再取到值 
*/
sql_1 varchar2(255):=' ';
sql_2 varchar2(255):=' ';
ybID        number(38);
nDbmsRet    number(10);
v_varch1   varchar2(100);
begin
sql_1 :='select distinct SERVICE_TYPE aa from '||my_table_name ;
ybID :=DBMS_SQL.OPEN_CURSOR;--取得游标ID
DBMS_SQL.PARSE(ybID, sql_1, DBMS_SQL.native); 
DBMS_SQL.DEFINE_COLUMN(ybID, 1, v_varch1,100);
loop 
 --将匹配查询的行提取到缓冲区,每次一行,返回取到的行数,=0表示不再取到值 
nDbmsRet:=DBMS_SQL.FETCH_ROWS(ybID ); 
  if nDbmsRet=0 then 
 exit; 
 end if; 
 --将缓冲区中的数据提取到PL/SQL变量中 
DBMS_SQL.DEFINE_COLUMN(ybID, 1, v_varch1,100); 
sql_2 :=v_varch1;
end loop; 
null;
end ;
---这个过程在编译正常通过,但在执行中出错,跟踪到nDbmsRet:=DBMS_SQL.FETCH_ROWS(ybID );这个语法出错,报错为ora-01002 fetch out of sequence 请各位老大指正,是我使用的语法不正确,还是动态SQL在使用过程中有其它的要求。非常感谢。

解决方案 »

  1.   

    有必要用DBMS_SQL.OPEN_CURSOR这些东西么?我就从不学这个,我写代码也从不用这东西
      

  2.   

    主要是我们单们的程序有不少是用这个东东写的,另外,我发现以前写SQL的人都用这个东东,是不是6以前都没别的方法啊
      

  3.   

    ORA-01002 ORA-01002fetch out of sequence Cause:In a host language program, a FETCH call was issued out of sequence. A successful parse-and-execute call must be issued before a fetch. This can occur if an attempt was made to FETCH from an active set after all records have been fetched. This may be caused by fetching from a SELECT FOR UPDATE cursor after a commit. A PL/SQL cursor loop implicitly does fetches and may also cause this error. Action:Parse and execute a SQL statement before attempting to fetch the data.没碰到过这样的情况,这是文档的东西,看看对你有没有用
      

  4.   

    错误相当的明显
    没有执行SQL语句,你就去Fetch游标,当然报错。
    查看下dbms_sql.execute()的用法。BTW:dbms_sql现在很少用了,直接动态SQL岂不是很好。