oracle查询表用for in loop循环出来更新

oracle查询表用for in loop循环出来更新,第1张

1、查看当前用户使用的表空间情况,使用命令select from user_users即可,其中username标识用户名,default_tablespace表示默认的表空间。

2、查看oracle下面所有的表空间,使用命令select from Dba_Tablespaces即可,呈现的信息包括表空间名称以及表空间的大小。

3、表空间是非常重要的资源,如果我们想查看表空间的使用情况,比如表空间利用率等指标,首先我们查询的用户必须有dba权限,使用如下的命令查询即可。

4、查看表空间物理文件的名称、位置及大小信息,表空间文件通常以dbf的后缀方式存储。

5、有些查询表空间的语句需要执行用户需要高的权限,使用命令select from user_role_privs即可。

6、在查询到表空间的信息之后,我们有时需要删除没用的表空间,使用命令drop tablespace xxx including contents and datafiles;即可。

要对表中的字段进行遍历吗? 用user_tab_cols
begin
for i in (
select column_name from user_tab_cols where table_name=upper('表名'))
loop
dbms_outputput_line(icolumn_name);
end loop;
end;

外循环i 从1取到100,内循环j 从1取到100。
你可以想象一下执行步骤:
①i=1
j从1取到100,result都不会等于500,故内循环完全执行。即下一个外循环之前的result应该是1100(i=1,j=100)。
②接下来:i=2,类似i=1,result<500,故最后打印出来的result=200
③一直到:i=5,result=500的时候内循环也执行完了。
④当i=6,7,8,9,ij永远不会等于500,故每次内循环都执行完毕才打印result,因此result依次等于600,700,800,900
⑤当i=10,内循环j=50的时候,result=500,这时候(exit when result=500),所以跳出本次内循环,接着执行下一个外循环i=11
⑥……等等 往下你可以思考一下,有哪些i会使内循环提前跳出?
对,很聪明,当i是500的约数的时候,内循环中会产生等于500的result,所以会提前跳出内循环。
同理,当ij=1000的时候跳出外循环,也就是整个循环。最早发生的应该是i=10,j=100,但i=10的时候,不等j取到100的时候result会取到500(i=10,j=50),因此这个被pass掉。
这种情况也要求i是1000的约数,由于500<1000,当i同时是500和1000的约数的时候,不等result=1000,result=500的时候就跳出内循环了,result是取不到1000的。
因此我们要找的是能整除1000而不能整除500的自然数里面最小的那个!
于是,i=40!
于是,当i=40,j=25的时候会跳出循环。上一个打印的时候i=39,j=100
其实嵌套循环就是循环里面套循环,这个只不过是加上了循环控制标识<<outer>>和<<inner>>(放在for前面,用于标记是哪个循环,里面的名字可以随便起),这样一来,我们就可以通过exit outer/inner…语句来控制跳出哪个循环了。

使用loop循环,比如:\r\nfor item in (select a,b,c from table_a where 条件) loop\r\n insert into table_b(a,b,c) values (itema,itemb,itemc);\r\nend loop;\r\n也可以使用索引表循环,以上只是一个简单的例子,需要根据你的具体情况选择循环方式

你这个其实挺复杂的,要建立一系列的东西来满足你这个需求

给你做个实验吧

先建立一个表

create table test
(id varchar2(20) not null primary key ,
name varchar2(100));

创建一个序列

create sequence seqTest 
increment by 1 
start with 1 
maxvalue 999
nocycle 
cache 10;

创建一个存储过程,这个很重要,每天半夜12点执行一次,这个主要是把序列重新置0用的,然后还需要定义一个job来调用这个存储过程

create or replace procedure p_seq
as
n number(10);
v_sql varchar2(100);
begin
select seqTestnextval into n from dual;
n:=-(n-1);
v_sql:='alter sequence seqTest increment by'|| n;
execute immediate v_sql;
select seqTestnextval into n from dual;
v_sql:='alter sequence seqTest increment by 1';
execute immediate v_sql;
end;

然后创建一个触发器

create or replace trigger t_test       
before insert on test       
for each row       
begin       
select to_char(sysdate,'yyyymmdd')||'_'||lpad(seqTestnextval,3,0) into :newid from dual;     
end ;

存储过程我没测试,但是编译能过去

现在做个试验

执行这样一个语句

insert into test(name) values ('aa');

然后你检查下数据,然后继续插入再看看

select  from test;


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/13406504.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-07-30
下一篇 2023-07-30

发表评论

登录后才能评论

评论列表(0条)

保存