oracle循环
oracle循环
主要有以下五种循环:Exit When、Loop、While、For(普通循环)、For(游标循环),下⾯举例⼀⼀说明(均为存储过程)。
1、Exit When循环:
create or replace procedure proc_test_exit_when is
i number;
begin
i:=0;
LOOP
Exit When(i>5);
Dbms_Output.put_line(i);
i:=i+1;
END LOOP;
end proc_test_exit_when;
——————————————————–俺是分割线—————————————————————–
2、Loop循环:
create or replace procedure proc_test_loop is
i number;
begin
i:=0;
loop
i:=i+1;
dbms_output.put_line(i);
if i>5 then
exit;
end if;
end loop;
end proc_test_loop;
——————————————————–俺是分割线—————————————————————–
3、While循环:
create or replace procedure proc_test_while is
i number;
begin
i:=0;
while i<5 loop
i:=i+1;
dbms_output.put_line(i);
end loop;
end proc_test_while;
——————————————————–俺是分割线—————————————————————–
4、For普通循环:
create or replace procedure proc_test_for is
i number;
begin
i:=0;
for i in 1..5 loop
dbms_output.put_line(i);
end loop;
end proc_test_for;
——————————————————–俺是分割线—————————————————————–
5、For游标循环:
create or replace procedure proc_test_cursor is
userRow test%rowtype;
cursor userRows is
select * from test;
begin
for userRow in userRows loop
dbms_output.put_line(userRow.id||’,'||userRow.Name||’,'||userRows%rowcount);
end loop;
end proc_test_cursor;
——————————————————–俺是分割线—————————————————————–上⾯所⽰为存储过程相应代码,你可以通过如下⽅式进⾏测试:
进⼊pl/sql, 执⾏ ⽂件->新建->程序窗⼝->空⽩,拷贝以上各段代码,到pl/sql空⽩窗⼝中,安F8执⾏编译。
再 执⾏ ⽂件->新建->命令窗⼝ 进⼊命令窗⼝ 执⾏⼀下 set serveroutput on 这句代码,然后,输⼊exec 相应存储过程,ok。
第5中循环 要求新建⼀个名为test的表 字段 id、name,插⼊⼏条数据,进⾏测试即可。
1.--创建⼀个FUNCTION , 名为get_salary,并且有参数no,也有返回值salary。
2.CREATE OR REPLACE FUNCTION get_salary(no NUMBER)
3.RETURN NUMBER IS
4. salary NUMBER(5,2) := 110; --为salary赋值,salary变量临时存放⼯资的值
5.BEGIN
6. --查询出来的sal值,存放⼊salary变量中
7. SELECT e.sal into salary FROM emp e WHERE e.empno = no;
8. --返回salary
9. RETURN salary;
10.END;
11.
12.--下⾯有两种测试⽅法
13.
14.--测试⼀
15.DECLARE
16.salary NUMBER(5,2);
17.begin
18. salary := get_salary(7369);
19. dbms_output.put_line(salary);
20.end;
21.
22.--测试⼆
23.SELECT get_salary(7369) FROM dual;
Oracle学习之数组 Oracle数组⼀般可以分为固定数组和可变数组
固定数组declare
type v_ar is varray(10) of varchar2(30);
my_ar v_ar:=v_ar('g','m','d','龚','帅');
begin
for i in 1..my_ar.count
loop
dbms_output.put_line(my_ar(i));
end loop;
end;
可变数组
⼀维数组 declare
type v_table is table of varchar2(30) index by binary_integer;
--类型可以是前⾯的类型定义,index by binary_integer⼦句代表以符号整数为索引,
--这样访问表类型变量中的数据⽅法就是“表变量名(索引符号整数)”。
my_table v_table;
begin
for i in 1..20
loop
my_table(i):=i;
dbms_output.put_line(my_table(i));
end loop;
end;
多维数组--多条记录declare
type v_table is table of liutest%rowtype index by binary_integer;
my_table v_table;
begin
select * bulk collect into my_table from liutest; for i in 1..my_table.count/10 --my_table.count/10取到的值为四舍五⼊值
loop
dbms_output.put_line('name--'||my_table(i).name);
dbms_output.put_line('address---'||my_table(i).address);
dbms_output.put_line('age----'||my_table(i).age);
end loop;
end;
多维数组--单条记录declare
type v_table is table of liutest%rowtype index by binary_integer;
my_table v_table;
begin
select * into my_table(1) from liutest where id=1;
--my_table(i) i可以为任意整数,但取值时必须保持以i⼀致;
dbms_output.put_line('--name--'||my_table(1).name||'--address--'||my_table(1).address);
end;
⾃定义数组 create or replace type varray_list as varray(30) of varchar2(50);
--使⽤⾃定义数组
create or replace procedure show_list(p_varlist in varray_list)
is
v_str varchar2(50);
begin
for i in 1..p_varlist.count
loop
v_str:=p_varlist(i);
dbms_output.put_line('v_str='||v_str);
dbms_output.put_line('p_varlist('||i||')='||p_varlist(i));
end loop;
end;
declare
my_var varray_list:=varray_list('g','m','d','龚','帅');
begin
show_list(my_var);
end;
-- Created on 2012-4-26 星期四 by ADMINISTRATOR
declare
-- Local variables here
i integer;
s varchar2(200) :='g-m-d-龚-帅';
--type v_ar is varray(10) of varchar2(30);
my_ar ty_str_split;
begin
-- Test statements here
my_ar :=fn_split(s,'-');
for i in 1..my_ar.count
loop
dbms_output.put_line(my_ar(i));
end loop;
dbms_output.put_line(0.2+ 0.1*(0.22-0.23));
end;
oracle use_nl的用法
oracle use_nl的用法
在Oracle数据库中,USE_NL是一个查询提示,用于指示查询计划使用嵌套循环连接(Nested Loops Join)来执行连接操作。
嵌套循环连接是一种连接操作的执行方式,其中,外部表的每一行都会与内部表的每一行进行比较,并返回符合连接条件的结果。这种连接方式适用于内部表较小的情况。
USE_NL提示的语法如下:
SELECT /*+ USE_NL(alias1 alias2 ...) */ column_list
FROM table1 alias1, table2 alias2...
WHERE join_condition;
在这个提示中,alias1,alias2等是表的别名,column_list是要查询的列,table1,table2等是要连接的表,join_condition是连接条件。
通过使用USE_NL提示,Oracle优化器会将嵌套循环连接纳入查询计划中。但需要注意的是,USE_NL只是一个提示,最终的执行计划仍然由Oracle优化器决定,它可能会选择其他连接方式,比如哈希连接(Hash Join)或者排序-合并连接(Sort-Merge Join)。
为了进行有效的查询优化,我们可以考虑以下几点:
1. 使用USE_NL只在需要时使用,对于较小的表进行嵌套循环连接可能会提高性能,但对于大型表可能会导致性能下降。
2. 考虑使用其他连接操作,如哈希连接或者排序-合并连接,根据实际情况选择最优的连接方式。
3. 使用合适的索引来加速连接操作,确保连接列上有适当的索引。
4. 注意连接条件的选择,确保它们是准确的,并且索引统计信息是最新的。
总之,USE_NL提示可以在一些情况下提供查询性能的改进,但使用时需要谨慎考虑实际情况,并综合考虑其他查询优化技术和最佳实践。
Oracle中selectXX_id_seq.nextvalfromdual什么意思呢?
Oracle中selectXX_id_seq.nextvalfromdual什么意思呢?
说明
今天看别⼈的代码 ,遇见了 ⼀条sql select ctg_fault_list_id_seq.nextval from dual 不懂意思,然后就研究了下 dual :是oracle 数据库中的虚拟表,并不是真实存在的 XX_id_seq:这个是我们创建序列时⾃定义的⼀个序列名称 ctg_fault_list_id_seq.nextval:这个是取出序列的下⼀个值,序列可以⽤户id⽣成器,每次我们都通过序列取到不同的值,并且不会重复序列基本⽤法
序列: 是oacle提供的⽤于产⽣⼀系列唯⼀数字的数据库对象。 (1)⾃动提供唯⼀的数值 (2)共享对象 (3)主要⽤于提供主键值 (4)将序列值装⼊内存可以提⾼访问效率创建序列要有创建序列的权限create sequence 或 create any sequence创建序列的语法
CREATE SEQUENCE sequence //创建序列名称 [INCREMENT BY n] //递增的序列值是n 如果n是正数就递增,如果是负数就递减 默认是1
[START WITH n] //开始的值,递增默认是minvalue 递减是maxvalue
[{MAXVALUE n | NOMAXVALUE}] //最⼤值
[{MINVALUE n | NOMINVALUE}] //最⼩值
[{CYCLE | NOCYCLE}] //循环/不循环
[{CACHE n | NOCACHE}];//分配并存⼊到内存中
NEXTVAL 返回序列中下⼀个有效的值,任何⽤户都可以引⽤
CURRVAL 中存放序列的当前值
NEXTVAL 应在 CURRVAL 之前指定 ,⼆者应同时有效
⽰例
Create sequence seqEmp increment by 1 start with 1 maxvalue 3 minvalue 1
Oracle序列的创建和使用
Oracle序列的创建和使⽤
1.创建序列
语法:
create sequence 序列名 [可选参数]
(序列名常定义为‘seq_XXX’的形式,创建序列不能使⽤replace)
可选参数说明:
increment by:序列每次增加的值,负数表⽰递减,缺省值为1;
start with:序列的初始值,缺省值为1;
maxvalue:序列可⽣成的最⼤值,缺省值为nomaxvalue,即不设置最⼤值;系统能产⽣的最⼤值为10的27次⽅;
minvalue:序列可⽣成的最⼩值,缺省值为nominvalue,即不设置最⼩值;
cycle:定义当序列达到最⼤/⼩值后是否循环,缺省值为不循环;nocycle:不循环;cycle:循环;如果不使⽤循环达到限制值后继续产
⽣新值就会出错;使⽤循环达到最⼤值后的下⼀个值为1,和start with设置的值⽆关,递增还是increment by设置的值;
cache:定义缓存序列的个数,缺省值为20,nocache表⽰不设置缓存;使⽤缓存可以提⾼序列的性能,但数据库出错时会造成数据丢失
使序列不连续;
例:创建⼀个循环不使⽤cache的序列
create sequence seq_userid
increment by 1
start with 1
maxvalue 99999
cycle
nocache;
2.序列的使⽤
语法:
序列名.[currval/nextval]
currval:表⽰当前值,新序列若没使⽤过nextval不能直接使⽤当前值,会报错;
nextval:表⽰序列的下⼀个值
例:查询序列的值
select seq_name.nextval from dual; --序列seq_name的下⼀个值
例:SQL语句中使⽤序列
insert into 表名 value(seq_name.currval)
3.删除修改序列
语法:
drop sequence [⽤户名.]序列名
alert sequence [⽤户名.]序列名 [可选参数]
Oracle之带参存储过程(存储过程中for循环调用存储过程)
Oracle之带参存储过程(存储过程中for循环调⽤存储过程)
⼀段业务代码改编,⼤概意思是搜索指定时间段内的信息,未详细说明业务内容,仅供参考⼏个参数的位置。
--带参存储过程 testdate,参数为v,内部定义参数i
create or replace procedure testdate(v in number) is
i number;
begin
i:=v; --v赋值给i
select EN_ID,EN_NAME,ASA_CODE,ASA_NAME,AS_YESTERDAY,DATEKEEY
from test2table
where datekeey = i;
commit;
end testdate;
--存储过程中for循环调⽤存储过程,testdate2调⽤testdate
create or replace procedure testdate2 is
Cursor datekeey is
select to_number(to_char(datekeey,'yyyyMMdd')) datekeey from (
select date'2017-01-01' + (rownum - 1) datekeey
from dual connect by rownum <= (date'2018-09-18' - date'2017-01-01' + 1)
); --从2017-01-01到2018-09-18遍历⽇期
i number;
begin
for i in datekeey LOOP
begin
testdate(i.datekeey); --调⽤testdate存储过程
end;
end LOOP;
commit;
end testdate2;
mysql的三种循环while、loop、repeat与oracle的三种loop的
mysql的三种循环while、loop、repeat与oracle的三种loop的
-- MySQL中的三中循环 while 、 loop 、repeat 求 1-n 的和
-- 第⼀种 while 循环
-- 求 1-n 的和
/* while循环语法:
while 条件 DO
循环体;
end while;
*/
create procedure sum1(a int)
begin
declare sum int default 0; -- default 是指定该变量的默认值
declare i int default 1;
while i<=a DO -- 循环开始
set sum=sum+i;
set i=i+1;
end while; -- 循环结束
select sum; -- 输出结果
end;
-- 执⾏存储过程
call sum1(100);
-- 删除存储过程
drop procedure if exists sum1;
==============================
-- 第⼆种 loop 循环
/* loop循环语法:
loop_name:loop
if 条件 then --满⾜条件时离开循环
leave loop_name; -- 和break差不多都是结束语
end if;
end loop;
*/
create procedure sums(a int)
begin
declare sum int default 0;
declare i int default 1;
loop_name:loop -- 循环开始
if i>a then
leave loop_name; -- 判断条件成⽴则结束循环 好⽐java中的 boeak
end if;
set sum=sum+i;
set i=i+1;
end loop; -- 循环结束
select sum; -- 输出结果
end;
-- 执⾏存储过程
call sums(100);
oracle 的alter sequence语法
一、ALTER SEQUENCE语法概述
在Oracle数据库中,ALTER SEQUENCE语句用于修改已存在的序列对象的属性。通过ALTER SEQUENCE语法,用户可以改变序列对象的起始值、递增量、最小值、最大值、循环属性和缓存值等属性。
二、ALTER SEQUENCE语法详解
1.修改序列的起始值
用户可以使用ALTER SEQUENCE语句来修改序列对象的起始值。语法如下:
ALTER SEQUENCE sequence_name
INCREMENT BY new_start_value;
其中sequence_name是要修改的序列对象的名称,INCREMENT BY关键字后面是新的起始值。例如:
ALTER SEQUENCE seq_employee
INCREMENT BY 100;
上述语句将序列seq_employee的起始值修改为100。
2.修改序列的递增量
除了修改起始值外,用户还可以使用ALTER SEQUENCE语句来修改序列对象的递增量。语法如下:
ALTER SEQUENCE sequence_name
INCREMENT BY new_increment_value;
其中sequence_name是要修改的序列对象的名称,INCREMENT BY关键字后面是新的递增量。例如:
ALTER SEQUENCE seq_employee
INCREMENT BY 50;
上述语句将序列seq_employee的递增量修改为50。
3.修改序列的最小值和最大值
用户可以使用ALTER SEQUENCE语句来修改序列对象的最小值和最大值。语法如下:
ALTER SEQUENCE sequence_name
MINVALUE new_min_value
MAXVALUE new_max_value;
其中sequence_name是要修改的序列对象的名称,MINVALUE关键字后面是新的最小值,MAXVALUE关键字后面是新的最大值。例如:
oracle 实现循环for while loop goto
长春大学计算机科学技术学院实验报告
日期_______________ 地点______________ 指导教师_____________ 成绩
班级 学号
实验五 PL/SQL的使用
1完成什么功能
答:完成1--8的输出
2用for语句改写 declare
j number:=0;
begin
j:=1;
loop
dbms_output.put_line(j||'---');
exit when j>7;
j:=j+1;
end loop;
dbms_output.put_line('结束');
end; /
3用while语句改写
4用goto语句改写
oracle 条件语句
oracle 条件语句
标题:Oracle条件语句示例
一、IF-THEN语句
IF-THEN语句是Oracle中常用的条件语句之一,用于在满足条件时执行一组语句。下面是一个示例:
```sql
DECLARE
var_name VARCHAR2(20) := 'John';
BEGIN
IF var_name = 'John' THEN
DBMS_OUTPUT.PUT_LINE('Hello, John!');
END IF;
END;
```
二、IF-THEN-ELSE语句
IF-THEN-ELSE语句是在满足条件时执行一组语句,否则执行另一组语句。下面是一个示例:
```sql
DECLARE
var_grade NUMBER := 80; BEGIN
IF var_grade >= 60 THEN
DBMS_OUTPUT.PUT_LINE('You passed the exam!');
ELSE
DBMS_OUTPUT.PUT_LINE('You failed the exam!');
END IF;
END;
```
三、CASE语句
CASE语句是根据一个表达式的值选择要执行的语句块。下面是一个示例:
```sql
DECLARE
var_day VARCHAR2(10) := 'Monday';
BEGIN
CASE var_day
WHEN 'Monday' THEN
DBMS_OUTPUT.PUT_LINE('Today is Monday!');
WHEN 'Tuesday' THEN
DBMS_OUTPUT.PUT_LINE('Today is Tuesday!');
ELSE DBMS_OUTPUT.PUT_LINE('Today is not Monday or
oracle中mod函数的使用方法
oracle中mod函数的使用方法
Mod函数是Oracle数据库中常用的一种函数,它用于求取两个数相除的余数。Mod函数的语法格式为:MOD(dividend, divisor),其中dividend为被除数,divisor为除数,返回值为余数。在本文中,我们将详细介绍Mod函数的使用方法及其应用场景。
一、Mod函数的基本用法
1.使用Mod函数求取整数相除的余数:
例如,我们需要求取10除以3的余数,可以使用以下SQL语句:
SELECT MOD(10, 3) FROM DUAL;
执行以上语句,将返回余数为1的结果。
2.使用Mod函数求取小数相除的余数:
例如,我们需要求取10.5除以2.5的余数,可以使用以下SQL语句:
SELECT MOD(10.5, 2.5) FROM DUAL;
执行以上语句,将返回余数为0.5的结果。
3.使用Mod函数求取负数相除的余数:
例如,我们需要求取-10除以3的余数,可以使用以下SQL语句:
SELECT MOD(-10, 3) FROM DUAL;
执行以上语句,将返回余数为2的结果。需要注意的是,Mod函数对于负数的处理需要按照以下规则进行:若dividend为正数,divisor为负数,则返回值为正数余数;若dividend为负数,divisor为正数,则返回值为负数余数;若dividend和divisor均为负数,则返回值为负数余数的绝对值。
二、Mod函数的应用场景
1.求取数据循环周期
在某些场景下,需要对数据进行循环处理,例如对一周的天数进行循环统计。此时,可以使用Mod函数来求取数据在循环周期内的位置,然后进行分组统计。
例如,我们需要对某个表按照星期进行统计,可以使用以下SQL语句:
SELECT
TO_CHAR(date_field, 'DAY') AS day_of_week,
COUNT(*) AS cnt
oracle nocycle用法
oracle nocycle用法
Oracle数据库是目前广泛使用的关系型数据库管理系统之一,在企业中被广泛用于数据存储和管理。在Oracle数据库中,NOCYCLE是一个重要的参数,用于控制循环引用链的查询结果。
1. 概述
NOCYCLE是在使用Oracle数据库中的CONNECT BY语句时使用的一个关键字。CONNECT BY是用于查询一个具有分层结构的表的语句。在CONNECT BY查询中,通过使用CONNECT BY语句和PRIOR关键字,可以根据一列的父子关系递归地查询表中的数据。
2. NOCYCLE用法
在CONNECT BY查询中,如果表中存在循环引用链,即某个记录作为其后代的祖先,那么查询可能会陷入死循环。例如,表中的数据可以表示为一个树状结构,如果某个记录的祖先又是其后代,就构成了循环引用链。
为了避免查询进入死循环,可以在CONNECT BY语句后添加NOCYCLE关键字。NOCYCLE关键字的作用是当查询到达循环引用链时,停止继续查询该循环引用链。这样可以避免无限递归的情况发生。
3. NOCYCLE示例
假设有一个表employee,包含了员工的雇员ID(emp_id)和直接上级的雇员ID(manager_id)。表的数据如下: ```
EMP_ID MANAGER_ID
1 2
2 3
3 1
4 3
```
现在需要查询员工1的所有下属。可以使用以下SQL查询语句:
```
SELECT emp_id FROM employee
START WITH emp_id = 1
CONNECT BY NOCYCLE PRIOR emp_id = manager_id;
```
由于员工表中存在循环引用链(1 > 2 > 3 > 1),如果没有使用NOCYCLE关键字,查询结果将会进入死循环。使用NOCYCLE关键字后,查询结果将会是1、2、3,而不会无限地重复。
