关于动态游标的问题?比较急。

tucarrot 2003-08-21 11:12:20
我现在要使用一个动态游标,我定义的方法如下:
首先在 PACKAGE P_HEAD 中定义一函数和一游标
FUNCTION MY_FUNCTION RETURN NUMBER;
TYPE MY_CURSOR REF CURSOR;
SQL_STR CHAR(2000);
.
.
.
然后再到PACKAGEBODY P_BODY 写实现过程,简化代码如下
PACKAGEBODY P_BODY
IS
FUNCTION MY_FUNCTION RETURN NUMBER IS
FAC_STA NUMBER;
BEGIN
SQL_STR := 'SELECT * FROM T_TABLE';
OPEN MY_CURSOR FOR SQL_STR;
RETURN(0);
END MY_FUNCTION;
END;
但我生成有错,不能正常执行,我看了一些有关动态游标的写法,好像跟我写的差不多,由于初次写例似代码,不知错在何处,希望大家指教。
...全文
48 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
liyifang 2003-09-11
  • 打赏
  • 举报
回复
一下动态游标在oracle9.2上可以通过,但是在oracle8.0.5上通不过
请教一下,oracle8.0.5是不是不支持动态游标?
CREATE OR REPLACE PROCEDURE mydyn_cursor
(
DEPT_CODE IN VARCHAR
)
IS

sql_select1 VARCHAR2(2000);
type cursor_dyn is REF CURSOR;

GET_DETAILS cursor_dyn;
V_DETAILS simple_table%ROWTYPE; -- *** THIS IS WERE THE PROBLEM IS ***

begin

-- make sql statement for cursor, containing records from multiple tables.
sql_select1 :='select emp.emp_no, dep.dept_name from employee@db2 emp, departments@db2 dep where emp.dep_code = dep.dep_code and emp.dep_code = '''||DEPT_CODE||'''';

open GET_DETAILS for sql_select1;
loop
FETCH GET_DETAILS into V_DETAILS;
EXIT WHEN GET_DETAILS%NOTFOUND;

dbms_output.put_line(V_DETAILS.f1);
end loop;
close GET_DETAILS;
END mydyn_cursor;
tucarrot 2003-08-24
  • 打赏
  • 举报
回复
大家说对了。
谢谢各位。
加分。
deyi 2003-08-22
  • 打赏
  • 举报
回复
FUNCTION MY_FUNCTION RETURN NUMBER;
TYPE MY_CURSOR is REF CURSOR;
SQL_STR CHAR(2000);
.
.
.
PACKAGEBODY P_BODY
IS
FUNCTION MY_FUNCTION RETURN NUMBER IS

cur_var MY_CURSOR ;

FAC_STA NUMBER;
BEGIN
SQL_STR := 'SELECT * FROM T_TABLE';
OPEN cur_var FOR SQL_STR;
RETURN(0);
END MY_FUNCTION;
END;
TwinkleCrystals 2003-08-22
  • 打赏
  • 举报
回复

应该加上v_cursor MY_cursor;
要声明引用游标类型的变量,才能使用该变量

chinayk11 2003-08-22
  • 打赏
  • 举报
回复
多了'
sijian2001 2003-08-22
  • 打赏
  • 举报
回复
MY_CURSOR只是你声明的一个TYPE,正确的应该像这样
-----------------------------------------------
CREATE OR REPLACE PACKAGE BODY P
IS

FUNCTION MY_FUNCTION RETURN NUMBER IS
C_MY_CURSOR MY_CURSOR;
FAC_STA NUMBER;
BEGIN
SQL_STR := 'SELECT * FROM T_TABLE';
OPEN C_MY_CURSOR FOR SQL_STR;
RETURN(0);
END MY_FUNCTION;

END P;
-----------------------------------------------
chinayk11 2003-08-22
  • 打赏
  • 举报
回复
PACKAGEBODY P_BODY
IS
FUNCTION MY_FUNCTION RETURN NUMBER IS
FAC_STA NUMBER;
declare
v_cursor MY_cursor;
BEGIN
OPEN v_CURSOR FOR 'SELECT * FROM T_TABLE;
RETURN(0);
END MY_FUNCTION;
END;
tiangou 2003-08-22
  • 打赏
  • 举报
回复
你将

FUNCTION MY_FUNCTION RETURN NUMBER;
TYPE MY_CURSOR REF CURSOR;

的位置换一下,改成

TYPE MY_CURSOR REF CURSOR;
FUNCTION MY_FUNCTION RETURN NUMBER;

我刚才试了一下,位置不对会报错
tucarrot 2003-08-22
  • 打赏
  • 举报
回复
is 我加了,还是出错。
报 PLS-00306 "My_cursor" 类型或引用不正确
jiezhi 2003-08-22
  • 打赏
  • 举报
回复
TYPE MY_CURSOR is REF CURSOR;
beckhambobo 2003-08-22
  • 打赏
  • 举报
回复
不是返回记录集就根本没需要使用包头定义游标. 直接在函数体内定义:
FUNCTION MY_FUNCTION RETURN NUMBER;

SQL_STR CHAR(2000);
.
.
.
PACKAGEBODY P_BODY
IS
FUNCTION MY_FUNCTION RETURN NUMBER IS
TYPE MY_CURSOR is REF CURSOR;
cur_var MY_CURSOR ;

FAC_STA NUMBER;
BEGIN
SQL_STR := 'SELECT * FROM T_TABLE';
OPEN cur_var FOR SQL_STR;
RETURN(0);
END MY_FUNCTION;
END;

17,377

社区成员

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

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