小弟近日研究动态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在使用过程中有其它的要求。非常感谢。
运行于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在使用过程中有其它的要求。非常感谢。
解决方案 »
- ORACLE数据库运行一段时间后(一个星期左右),登陆总是出现"ora-12560错误,TNS:协议适配器错误"。
- oracle+hibernate4.0release连接数据库
- 已经建里的表分区,怎么插入数据
- 求一条select语句?
- : 小妹想向数据库方向发展,将来做个DBA,我该从什么方向去努力呢,还有该从什么什么样的职位做起发展更好啊。
- 那位帮帮忙!立马给分
- 这个动态游标的执行sql怎么写
- 谁有远程安装ORACLE817的经验,在P4机器上的?
- 怎么不能删除了?(在线等待 急!)
- oracle 带有括号的字段怎么查?
- procedure里面 commit时候的问题
- 求助SQLLDR 数据装载问题 急!!!
没有执行SQL语句,你就去Fetch游标,当然报错。
查看下dbms_sql.execute()的用法。BTW:dbms_sql现在很少用了,直接动态SQL岂不是很好。