oracle 游标结果不可用是怎么回事》????

作者&投稿:喻歪 (若有异议请与网页底部的电邮联系)
请问一下,oracle报错:游标结果不可用,请重新执行脚本打开游标,是怎么回事???~

这个错误是因为你所操作的游标读取数据时发现游标并没有被打开。
游标还是处于关于状态。
游标的数据读取是需要打开和关闭的。

那是系统数据错误,只有修改程序员命令才可以。
oracle存储过程结束会自动关闭游标吗
1.如果你是显式游标(open打开)、如果没有close就会出现死循环。
2.而隐式游标(for...loop)、没有end loop也是出现死循环。
3.直到用户进程断开连接服务器。

--创建存储过程
CREATE OR REPLACE PROCEDURE xxxxxxxxxxx_p
(
--参数IN表示输入参数,OUT表示输入参数,类型可以使用任意Oracle中的合法类型。
is_ym IN CHAR
)
AS
--定义变量
vs_msg VARCHAR2(4000); --错误信息变量
vs_ym_beg CHAR(6); --起始月份
vs_ym_end CHAR(6); --终止月份
vs_ym_sn_beg CHAR(6); --同期起始月份
vs_ym_sn_end CHAR(6); --同期终止月份
--定义游标(简单的说就是一个可以遍历的结果集)
CURSOR cur_1 IS
SELECT area_code,CMCODE,SUM(rmb_amt)/10000 rmb_amt_sn,SUM(usd_amt)/10000 usd_amt_sn
FROM BGD_AREA_CM_M_BASE_T
WHERE ym >= vs_ym_sn_beg
AND ym <= vs_ym_sn_end
GROUP BY area_code,CMCODE;

BEGIN
--用输入参数给变量赋初值,用到了Oralce的SUBSTR TO_CHAR ADD_MONTHS TO_DATE 等很常用的函数。
vs_ym_beg := SUBSTR(is_ym,1,6);
vs_ym_end := SUBSTR(is_ym,7,6);
vs_ym_sn_beg := TO_CHAR(ADD_MONTHS(TO_DATE(vs_ym_beg,'yyyymm'), -12),'yyyymm');
vs_ym_sn_end := TO_CHAR(ADD_MONTHS(TO_DATE(vs_ym_end,'yyyymm'), -12),'yyyymm');
--先删除表中特定条件的数据。
DELETE FROM xxxxxxxxxxx_T WHERE ym = is_ym;
--然后用内置的DBMS_OUTPUT对象的put_line方法打印出影响的记录行数,其中用到一个系统变量SQL%rowcount
DBMS_OUTPUT.put_line('del上月记录='||SQL%rowcount||'条');

INSERT INTO xxxxxxxxxxx_T(area_code,ym,CMCODE,rmb_amt,usd_amt)
SELECT area_code,is_ym,CMCODE,SUM(rmb_amt)/10000,SUM(usd_amt)/10000
FROM BGD_AREA_CM_M_BASE_T
WHERE ym >= vs_ym_beg
AND ym <= vs_ym_end
GROUP BY area_code,CMCODE;

DBMS_OUTPUT.put_line('ins当月记录='||SQL%rowcount||'条');
--遍历游标处理后更新到表。遍历游标有几种方法,用for语句是其中比较直观的一种。
FOR rec IN cur_1 LOOP
UPDATE xxxxxxxxxxx_T
SET rmb_amt_sn = rec.rmb_amt_sn,usd_amt_sn = rec.usd_amt_sn
WHERE area_code = rec.area_code
AND CMCODE = rec.CMCODE
AND ym = is_ym;
END LOOP;

COMMIT;
--错误处理部分。OTHERS表示除了声明外的任意错误。SQLERRM是系统内置变量保存了当前错误的详细信息。
EXCEPTION
WHEN OTHERS THEN
vs_msg := 'ERROR IN xxxxxxxxxxx_p('||is_ym||'):'||SUBSTR(SQLERRM,1,500);
ROLLBACK;
--把当前错误记录进日志表。
INSERT INTO LOG_INFO(proc_name,error_info,op_date)
VALUES('xxxxxxxxxxx_p',vs_msg,SYSDATE);
COMMIT;
RETURN;
END;

补充:
游标有两种类型:显式游标和隐式游标。游标一旦打开,数据就从数据库中传送到游标变量中,然后应用程序再从游标变量中分解出需要的数据,并进行处理。游标的属性有四种,分别是SQL %ISOPEN,SQL %FOUND,SQL %NOTFOUND,SQL %ROWCOUNT。

  SQL%ISOPEN返回的类型为布尔型,判断游标是否被打开,如果打开%ISOPEN等于true,否则等于false,即执行过程中为真,结束后为假。

  SQL%NOTFOUND返回值为布尔型,判断游标所在的行是否有效,如果有效,则%FOUNDD等于true,否则等于false,即与%FOUND属性返回值相反。

  SQL%FOUND返回值的类型为布尔型,值为TRUE代表插入 删除 更新或单行查询操作成功。

  SQL%ROWCOUNT返回值类型为整型,返回当前位置为止游标读取的记录行数,即成功执行的数据行数。 示例代码如下:

set serveroutput on;
  declare
  varno varchar2(20);
  varprice varchar2(20);
  CURSOR mycur(vartype number) is
  select emp_no,emp_zc from cus_emp_basic
  where com_no = vartype;
  begin
  if mycur%isopen = false then
  open mycur(043925);
  end if;
  fetch mycur into varno,varprice;
  while mycur%found
  loop
  dbms_output.put_line(varno||','||varprice);
  if mycur%rowcount=2 then
  exit;
  end if;
  fetch mycur into varno,varprice;
  end loop;
  close mycur;
  end;

  记录并不保存在数据库中,它与变量一样,保存在内存空间中,在使用记录时候,要首先定义记录结构,然后声明记录变量。可以把PL/SQL记录看作是一个用户自定义的数据类型。

更加详细见 http://database.ctocio.com.cn/tips/286/8265286.shtml

http://wenku.baidu.com/view/4171c179168884868762d66c.html

怎么个不可用法?有无ora错误,最好贴出来


宁安市13653507393: 请问一下,oracle报错:游标结果不可用,请重新执行脚本打开游标,是怎么回事??? -
亥雍甲磺: 这个错误是因为你所操作的游标读取数据时发现游标并没有被打开.游标还是处于关于状态.游标的数据读取是需要打开和关闭的.

宁安市13653507393: 编写Oracle存储过程执行循环游标的时候,出现无法引用游标的 myRow中的具体的值 -
亥雍甲磺: CREATE OR REPLACE PROCEDURE TEST1 IS Cursor MyCursor Is Select * From emp; MYROW1 MyCursor%ROWTYPE; BEGIN FOR MYROW1 IN MyCursor LOOP insert into test111 VALUES(myrow1.empno,MYROW1.ENAME,MYROW1.JOB,MYROW1.MGR,MYROW1.HIREDATE,MYROW1.SAL,MYROW1.COMM,MYROW1.DEPTNO); END LOOP; END TEST1; 我这样写测试没有问题,你照这样改改看看.

宁安市13653507393: OraclePLSQL在游标中用while循环为什么没有结果输出 -
亥雍甲磺: @@fetch_status=0 是游标提取数据失败,即数据提取结束到最后了. 游标主要作用是,操作SQL查询结果集. 以下为典型游标的应用: create proc cursorTest @_id int=0, @_name varchar(50)='' as--创建游标 declare @cursor cursor-...

宁安市13653507393: 在java中调用oracle过程,游标无效 -
亥雍甲磺: rs_cursor out 是返回的游标,但是一般都不这么用,而且游标都要关闭,如果你想返回List 或结果集的话,不般都不用游标来返回记录集的,除非自定义oracle 或sqlserver的数据库 集合类型.如果你是用java ,肯定用到 ibatis,hibernate 等数据中...

宁安市13653507393: 4出现ORA— - 1034:TNS:ORACLE不可用错误是什么意思,一般需要如何修复? -
亥雍甲磺: ORA - 1034:TNS的:由于ORACLE不可用原因:ORACLE的数据库服务正确启动,但是数据库没有打开!使用命令:1)svrmgrl启动服务管理器2)连接内部为登陆3)启动内部打开数据库“/ p>

宁安市13653507393: oracle在测试窗口调试游标出现错误,无法启动调试?出现什么系统没有调试session?怎么办? -
亥雍甲磺: 缺失 DEBUG CONNECT SESSION 系统权限所致.解决办法:以SYS用户登录数据库,执行赋权操作: grant DEBUG CONNECT SESSION to user_name;

宁安市13653507393: ORACLE存储过程中游标作为输出参数调用时怎么报错 -
亥雍甲磺: 你的意思是不是要获取到“当前用户:user_id”这个的内容,如果是,两个方式可以解决: 1.通过存储过程的出参,将“当前用户:user_id”连接串返回; 比如: 假设你的过程叫,prc_test,在参数列表中增加出参. create or replace ...

宁安市13653507393: ORA - 01034:ORACLE 不可用 -
亥雍甲磺: 这种情况是新安装的新手都会遇见的.问题的原因是安装oracle,默认scott账户为锁定,需要你安装时的sys的身份来解锁.我给你详细步骤.前提是,你要记住你安装oracle时输入的口令.假设口令为aaaaaa.1.开始---所有程序---Oracle OraDb...

宁安市13653507393: Oracle视图调用函数,函数返回的是游标,出现这个错. -
亥雍甲磺: 不可以 可以调用返回类型是table type的

宁安市13653507393: oracle存储过程返回游标,取值报错 -
亥雍甲磺: 第一,你首先要保证你的过程是正确的,然后才可以去考虑调用的问题;第二,你调用的语句有问题,在你的存储过程中,OPEN 已经打开了游标,而你采用FOR游标,它又要去打开一次,建议你采用简单得LOOP去遍历游标.可能就没有问题...

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网