扫二维码与项目经理沟通
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流
以下的文章主要是介绍Oracle ;查看和修改其最大的游标数 本文主要是通过相关代码的方式来引出Oracle查看和修改其最大的游标数的实际操作步骤 以下就是文章的具体内容的描述 望你在浏览完之后 会有所收获
创新互联公司专业为企业提供卧龙网站建设、卧龙做网站、卧龙网站设计、卧龙网站制作等企业网站建设、网页设计与制作、卧龙企业网站模板建站服务,十余年卧龙做网站经验,不只是建网站,更提供有价值的思路和整体网络服务。
Oracle查看Oracle最大游标数
C:\Documents and Settings\Administratorsqlplus sys/admin@test as sysdba
(sys以dba登录test 服务)
SQL*Plus: Release Production on 星期四 月 : :
Copyright (c) Oracle Corporation All rights reserved
连接到:
Oracle i Enterprise Edition Release Production
With the Partitioning OLAP and Oracle Data Mining options
JServer Release Production
SQL show parameter open_cursors;
NAME TYPE VALUE
open_cursors integer
Oracle查看当前打开的游标数目
SQL select count(*) from v$open_cursor;
COUNT(*)
修改Oracle最大游标数
SQL alter system set open_cursors= scope=both;
系统已更改
SQL show parameter open_cursors;
NAME TYPE VALUE
open_cursors integer
lishixinzhi/Article/program/Oracle/201311/18528
declare
cursor bb(depno number) is select deptno from emp where deptno=depno for update;
BEGIN
for v_current in bb(30) loop
delete from emp where current of bb;
end loop;
end;
/
试试这个
"把重复的ID删掉,保留一条最大的ID"
这句话有问题,id有重复,就是有一样的,怎么在保留最大的。
明白了,这样写:
CREATE OR REPLACE PROCEDURE test_pro(v_khlx IN VARCHAR2,
v_message out varchar2) is
TYPE TCUR IS REF CURSOR;
cur TCUR;
v_id varchar2(1000);
v_fp_dm varchar2(1000);
v_fp_hm varchar2(1000);
BEGIN
open cur for ' select max(fp_id),fp_dm,fp_hm from a_test group by fp_dm,fp_hm';
loop
fetch cur
into v_id,v_fp_dm,v_fp_hm ;
exit when cur%notfound;
delete from a_test t where t.fp_dm = v_fp_dm and t.fp_hm = v_fp_hm and t.fp_id != v_id ;
end loop;
close cur;
commit;
dbms_output.put_line('');
END;
这样的问法好笼统,不过,还是把我整理的给你看看吧~个人整理,无复制的哦~
A:分类:
1:隐式游标:非用户明确声明而产生的游标. 你根本看不到cursor这个关键字.
2:显示游标:用户明确通过cursor关键字来声明的游标.
3:引用游标:
B:什么是隐式游标:
1:什么时候产生:
会在执行任何合法的SQL语句中产生.他不一定存放数据.也有可能存放记录集所影响的行数.
如果执行SELECT语句,这个时候游标会存放数据.如果执行INSERT、UPDATE、 DELETE会存放记录影响的行数.
C:隐式游标叫什么名字:
名字叫sql
关于sql的游标变量到底有哪些呢?
作用:返回最近一次执行SQL语句所涉及的游标相关信息.因为每执行一次SQL语句,都会产生一个隐式游标.那么当前执行的SQL语句就是当前的隐式游标.
sql%found
sql%notfound
sql%rowcount
sql%isopen
D:关于隐式游标的例子:
create table 学生基本信息表
(
StuID number(2),
StuName varchar2(20)
)
alter table 学生基本信息表 add constraint PK_STUID primary key(StuID)
declare
num number:=0;
begin
num:=num;
delete from 学生基本信息表 where StuID=num;
if sql%notfound then
dbms_output.put_line('该行数据没有发现');
else
dbms_output.put_line('数据被发现并删除,影响的行数为:'||sql%rowcount);
end if;
end;
E:关于显示游标的例子:
1:如何定义显示游标
declare cursor cursor_name is [select语句];
declare cursor mycur is select empno,ename,job from scott.emp;
2:如何打开游标:
open cursor_name;
open mycur;
3:如何通过游标来读取数据
fetch cursor_name into variable_list
4:如何关闭游标:
close cursor_name;
close mycur;
注意:在Oracle中,不需要显示销毁游标.因为在Oracle中,很多东西是由JAVA写的.Oracle会自动销毁游标.
5:举例:
declare
cursor mycur is select empno,ename,job from emp; --创建游标
vempno emp.empno%type;
vename emp.ename%type;
vjob emp.job%type;
begin
open mycur;--打开游标
fetch mycur into vempno,vename,vjob;--使用数据
dbms_output.put_line('I Found You!'||mycur%rowcount||'行');
dbms_output.put_line('读取的数据为'||vempno||' '||vename||' '||vjob);
close mycur;
end;
因为只读出来一条,所以要遍历一下:
declare
cursor mycur is select empno,ename,job from emp;
vempno emp.empno%type;
vename emp.ename%type;
vjob emp.job%type;
begin
open mycur;
loop—循环,遍历
fetch mycur into vempno,vename,vjob;
exit when mycur%notfound;
if mycur%found then
dbms_output.put_line('读取的数据为'||vempno||' '||vename||' '||vjob);
end if;
end loop;
dbms_output.put_line('I Found You!'||mycur%rowcount||'行');
close mycur;
end;
6:通常情况下我们在读取表数据的时候,我们需要动态的去查询.所以能不能在Oracle中给游标带参数呢?可以!
1):如何定义带参数的游标:
declare cursor cursor_name(参数名称 参数类型描述) is select xxxxx from bbbbb where aaa==??? and ccc=???;
2):例子:
游标是一个集合,读取数据有两种方式
第一种方式: open fetch close
第二种方式: for 一但使用了for循环 ,在循环刚刚开始的时候,相当于执行open,在处理循环的时候,相当于执行fetch,在退出循环的时候,相当于执行了close
Declare cursor query(vname varchar) is select empno,ename,job from emp where ename like'%'||vname||'%';
三种游标的例子:
--
DECLARE
CURSOR TEST_CUR IS
SELECT * FROM EMP;
MY_CUR EMP%ROWTYPE;
BEGIN
OPEN TEST_CUR;
FETCH TEST_CUR INTO MY_CUR;
WHILE TEST_CUR%FOUND
LOOP
DBMS_OUTPUT.PUT_LINE(MY_CUR.EMPNO||','||MY_CUR.ENAME);
FETCH TEST_CUR INTO MY_CUR;
END LOOP;
CLOSE TEST_CUR;
END;
--
DECLARE
CURSOR TEST_CUR IS
SELECT * FROM EMP;
BEGIN
FOR MY_CUR IN TEST_CUR
LOOP
DBMS_OUTPUT.PUT_LINE(MY_CUR.EMPNO||','||MY_CUR.ENAME);
END LOOP;
END;
--
DECLARE
CURSOR TEST_CUR(V_SAL NUMBER) IS
SELECT *
FROM EMP
WHERE SAL V_SAL;
V_SAL1 NUMBER ;
BEGIN
V_SAL1 := 2000;
FOR MY_CUR IN TEST_CUR(V_SAL1)
LOOP
DBMS_OUTPUT.PUT_LINE(MY_CUR.EMPNO||','||MY_CUR.ENAME);
END LOOP;
END;
TRUNCATE TABLE速度更快,不备份日志
DELETE FROM TABLE + COMMIT ,速度稍慢,备份日志
两者都是删除表内容不删除表结构。
应该是这样的,因为没有环境,没测试,你试下。
CREATE OR REPLACE PROCEDURE PRC_XXX() AS
C SYS_REFCURSOR;
TP INTEGER;
BEGIN
OPEN C FOR
SELECT TOYPRICE
FROM TOYS; --取出主键和toyprice字段值
LOOP
FETCH C
INTO TP; --最好是把主键一起取出来,作为删除和更新的条件
EXIT WHEN CURSOR%NOTFOUND;
IF TP 150
THEN
UPDATE TOYS
SET TOYPRICE = 150
WHERE TOYPRICE = TP;
ELSE
IF TP 200
THEN
DBMS_OUTPUT.PUTLINE(TP);
ELSE
IF TP 300
THEN
DELETE FROM TOYS
WHERE TOYPRICE = TP;
END IF;
END IF;
END IF;
END LOOP;
COMMIT;
CLOSE C;
END PRC_XXX;
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流