嗯可以实现从A到Z的循环,想从A到ZZ只能自己动手编个函数了,
从A到Z如下:
--创建自增变量emp_sq、
create sequence emp_sq
minvalue 65 --最小值为65
maxvalue 90 ---最大值为90
start with 65 --起始值65
increment by 1 ---自增量1
cache 20
cycle --可循环;使用chr(emp_sq.nextval)就变成从A到Z了
select chr(emp_sq.nextval) from dual
从A到Z如下:
--创建自增变量emp_sq、
create sequence emp_sq
minvalue 65 --最小值为65
maxvalue 90 ---最大值为90
start with 65 --起始值65
increment by 1 ---自增量1
cache 20
cycle --可循环;使用chr(emp_sq.nextval)就变成从A到Z了
select chr(emp_sq.nextval) from dual
===========================================
我是新手,这个函数不会写的帮我写一个呀,谢谢
两种方法
方法一:
用触发器建一个序列
create sequence a_seq increment by 1 start with 100;
建一个触发器, 自动+1
create or replace trigger your_seq_tri
before insert on your_table1 for each row
declare
next_id number;
begin
select your_seq.nextval into next_id from dual;
:new.id := next_id;
end;
方法二:
建一个序列
create sequence a_seq increment by 1 start with 100;
在语句中+1
insert into tbl(id,....)
values (a_seq.nextval,....)
另外: 自增字段可能会有跳序的情况。Oracle的序列在创建的时候有一个cache值是20,这样的话如果在使用的过程中重起过数据库的话,下一次就会从下一个20开始计数了!
还有一种常见的情况,就是序列对于每个session(可以看成是一个连接)是相互不影响的,如果低一个连接里使用序列从1开始,同时第二个连接也在使用序列就会从21开始了,第一个连接在使用到20以后就会跳到41,如果41杯第三个连接使用了就会跳到61,等等这是cache为20的情况
如果不信,可以同时打开两个sqlplus试试!
A-Z 表示 0-25SQL> desc t;
名称 空? 类型
----------------------------------------- -------- ----------------
ID VARCHAR2(20)
COLA --创建一个序列 用于自增加
SQL> create sequence seq_demo increment by 1 start with 1 maxvalue 999999999;序列已创建。已用时间: 00: 00: 00.20 VARCHAR2(20)
--定义将数字转换成A-Z的函数
SQL> create or replace function f_numtochr(num number)
2 return varchar2
3 as
4 v_mod number;
5 v_return varchar2(20);
6 begin
7 v_mod:=num;
8 while v_mod>0 loop --循环处理生成每一个字符
9 v_return:=chr(mod(v_mod,26)+65)||v_return;
10 v_mod:=trunc(v_mod/26);
11 end loop;
12 return v_return;
13 end f_numtochr;
14 /函数已创建。已用时间: 00: 00: 00.50--生成部分数据,测试
SQL> begin
2 for i in 1..30 loop
3 insert into t(cola) values('a');
4 end loop;
5 end;
6 /PL/SQL 过程已成功完成。已用时间: 00: 00: 00.50
SQL> select * from t;ID COLA
-------------------- ------------
B a
C a
D a
E a
F a
G a
H a
I a
J a
K a
L aID COLA
-------------------- ------------
M a
N a
O a
P a
Q a
R a
S a
T a
U a
V a
W aID COLA
-------------------- ------------
X a
Y a
Z a
BA a
BB a
BC a
BD a
BE a
BF a
BG a注意:A 表示0 ;B 表示1;
因此 Z的下一个 应当是 BA,而不是AA!OK!
create or replace function f_numtochr(num number)
return varchar2
as
v_mod number;
v_return varchar2(20);
begin
v_mod:=num;
while v_mod>0 loop --循环处理生成每一个字符
if mod(v_mod,27) = 0 then
execute immediate 'select seq_demo.nextval from dual' into v_mod;
end if;
v_return:=chr(mod(v_mod,27)+64)||v_return;
v_mod:=trunc(v_mod/27);
end loop;
return v_return;
end f_numtochr;
/SQL> create sequence seq_demo increment by 1 start with 1 maxvalue 999999999;Sequence created.SQL> begin
2 for i in 1..30 loop
3 insert into aaaa values(f_numtochr(seq_demo.nextval));
4 end loop;
5 end;
6 /PL/SQL procedure successfully completed.SQL> select * from aaaa;A
-----
A
B
C
D
E
F
G
H
I
J
KA
-----
L
M
N
O
P
Q
R
S
T
U
VA
-----
W
X
Y
Z
AA
AB
AC
AD30 rows selected.
当第2次向表中的NUM字段插入1时,其相应的STR字段自动变为:B
当第3次向表中的NUM字段插入1时,其相应的STR字段自动变为:C
当第4次向表中的NUM字段插入1时,其相应的STR字段自动变为:D
……
当第26次向表中的NUM字段插入1时,其相应的STR字段自动变为:Z
当第27次向表中的NUM字段插入1时,其相应的STR字段自动变为:AA
当第28次向表中的NUM字段插入1时,其相应的STR字段自动变为:AB
当第29次向表中的NUM字段插入1时,其相应的STR字段自动变为:AC
……
当第52次向表中的NUM字段插入1时,其相应的STR字段自动变为:AZ
当第53次向表中的NUM字段插入1时,其相应的STR字段自动变为:BA
当第54次向表中的NUM字段插入1时,其相应的STR字段自动变为:BB
……同理:
当第1次向表中的NUM字段插入2时,其相应的STR字段自动变为:A
当第2次向表中的NUM字段插入2时,其相应的STR字段自动变为:B
当第3次向表中的NUM字段插入2时,其相应的STR字段自动变为:C
当第4次向表中的NUM字段插入2时,其相应的STR字段自动变为:D
……
当第26次向表中的NUM字段插入2时,其相应的STR字段自动变为:Z
当第27次向表中的NUM字段插入2时,其相应的STR字段自动变为:AA
当第28次向表中的NUM字段插入2时,其相应的STR字段自动变为:AB
当第29次向表中的NUM字段插入2时,其相应的STR字段自动变为:AC
……
当第52次向表中的NUM字段插入2时,其相应的STR字段自动变为:AZ
当第53次向表中的NUM字段插入2时,其相应的STR字段自动变为:BA
当第54次向表中的NUM字段插入2时,其相应的STR字段自动变为:BB
……
当第1次向表中的NUM字段插入3时,其相应的STR字段自动变为:A
……
……
……
ID记录号最大为ZZ
举例如下:NUM STR
1 A
1 B
1 C
2 A
2 B
3 A
1 D
1 E
2 C
create table a(a1 varchar2(4),num number,n number); create or replace function f_numtochr(num number)
return varchar2
as
v_mod number;
v_return varchar2(20);
begin
v_mod:=num;
while v_mod>0 loop --循环处理生成每一个字符
if mod(v_mod,27) = 0 then
v_mod:=v_mod+1;
end if;
v_return:=chr(mod(v_mod,27)+64)||v_return;
v_mod:=trunc(v_mod/27);
end loop;
return v_return;
end f_numtochr;
/ create or replace procedure f_num(n number)
return varchar2
as
v_return varchar2(20);
v_num number;
begin
execute immediate 'select nvl(max(num),0) from a where n='||n into v_num;
if mod(v_num+1,27) = 0 then
v_num := v_num + 2;
else
v_num := v_num + 1;
end if;
insert into a values(f_numtochr(v_num),v_num,n);
commit;
end f_num;
/
begin
for i in 1..30 loop
f_num(2);
end loop;
end;
/PL/SQL procedure successfully completedSQL> select * from a;A1 NUM N
---- ---------- ----------
B 2 1
A 1 1
C 3 1
D 4 1
E 5 1
F 6 1
G 7 1
H 8 1
I 9 1
J 10 1
K 11 1A1 NUM N
---- ---------- ----------
L 12 1
M 13 1
N 14 1
O 15 1
P 16 1
Q 17 1
R 18 1
S 19 1
T 20 1
U 21 1
V 22 1A1 NUM N
---- ---------- ----------
W 23 1
X 24 1
Y 25 1
Z 26 1
AA 28 1
AB 29 1
AC 30 1
AD 31 130 rows selected.SQL> begin
2 for i in 1..30 loop
3 f_num(2);
4 end loop;
5 end;
6 /PL/SQL procedure successfully compSQL> select * from a;A1 NUM N
---- ---------- ----------
B 2 1
A 1 1
C 3 1
D 4 1
E 5 1
F 6 1
G 7 1
H 8 1
I 9 1
J 10 1
K 11 1A1 NUM N
---- ---------- ----------
L 12 1
M 13 1
N 14 1
O 15 1
P 16 1
Q 17 1
R 18 1
S 19 1
T 20 1
U 21 1
V 22 1A1 NUM N
---- ---------- ----------
W 23 1
X 24 1
Y 25 1
Z 26 1
AA 28 1
AB 29 1
AC 30 1
AD 31 1
A 1 2
B 2 2
C 3 2A1 NUM N
---- ---------- ----------
D 4 2
E 5 2
F 6 2
G 7 2
H 8 2
I 9 2
J 10 2
K 11 2
L 12 2
M 13 2
N 14 2A1 NUM N
---- ---------- ----------
O 15 2
P 16 2
Q 17 2
R 18 2
S 19 2
T 20 2
U 21 2
V 22 2
W 23 2
X 24 2
Y 25 2A1 NUM N
---- ---------- ----------
Z 26 2
AA 28 2
AB 29 2
AC 30 2
AD 31 260 rows selected.
create or replace function f_numtochr(num number)
create or replace procedure f_num(n number)然后
begin
for i in 1..30 loop
f_num(2);
end loop;
end;上面提示:
对象f_num无效
这是怎么会事啊?
create or replace procedure f_num(n number)
as
v_return varchar2(20);
v_num number;
begin
execute immediate 'select nvl(max(num),0) from a where n='||n into v_num;
if mod(v_num+1,27) = 0 then
v_num := v_num + 2;
else
v_num := v_num + 1;
end if;
insert into a values(f_numtochr(v_num),v_num,n);
commit;
end f_num;
上面提示:
对象f_num无效谢谢
begin
for i in 1..30 loop
f_num(2);
end loop;
end;
现在已测试成功了但我想插入一条数据该怎么写啊?
这样写不对
f_num(2);
例
create or replace procedure f_num(n number,a varchar2,b varchar2.....)
as
v_return varchar2(20);
v_num number;
begin
execute immediate 'select nvl(max(num),0) from a where n='||n into v_num;
if mod(v_num+1,27) = 0 then
v_num := v_num + 2;
else
v_num := v_num + 1;
end if;
insert into a values(f_numtochr(v_num),v_num,n,a,b.....);
commit;
end f_num;
俺笨的让大家笑掉大牙啦
我的意思是这样的下面的语句可以在表中添加30条记录
begin
for i in 1..30 loop
f_num(2);
end loop;
end;现在我只想在表中添加一条记录
该怎么写啊
for i in 1..1 loop
f_num(2,'i7777i');
end loop;
end;这样也能添加一条记录,但感觉有点不对劲!
f_num(2);
end;
添加一条
上面的功能无非就是:
当插入数据时,用A、B、C……表示插入相同字段的次数,这里是一个字段不过现在我又在表中多加了一个字段,用A、B、C……表示插入相同的两个字段的次数.
f_num(2,'str');//传两个参数进去
create table a(a1 varchar2(4),num number,n number,str varchar2(4));
程序看不懂,请再帮忙把程序修改一下,谢谢啦
不知道我上面描述的清楚吗,如果你不清楚可以问我呀,谢谢
不知道楼主指的是什么?