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的用法

在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什么意思呢?

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序列的创建和使用

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循环调用存储过程)

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与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语法

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,而不会无限地重复。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
相关文档
最新文档