写一个存储过程,判断如果表a存在则执行drop命令,否则就先创建表a
现在是这样的
create or replace procedure aaa Authid Current_User is
beginexecute immediate 'drop table a';--这个之前加一个判断,如果表存在则执行这个,不存在就直接执行下一条execute immediate 'create table a(a_id number(12) not null)';end aaa;能不能加一个判断条件,这样的话就不会出现不能执行的问题了
现在是这样的
create or replace procedure aaa Authid Current_User is
beginexecute immediate 'drop table a';--这个之前加一个判断,如果表存在则执行这个,不存在就直接执行下一条execute immediate 'create table a(a_id number(12) not null)';end aaa;能不能加一个判断条件,这样的话就不会出现不能执行的问题了
select * from all_tables where table_name='' and owner='';注意表名大写
因为重名的不一定就是table
sql := 'select object_name from user_objects where object_name ='';
execute sql into a ;
if a = 表名 thenelse end if;
好像是这样,记不太清了
create or replace....
dba_objects等
假设有个函数把这个名字占用了 删除的时候要写drop function
这样判断起来 情况就多了
已连接。
eygle@SZTYORA> create or replace procedure create_tb_proc(v_table varchar2)
2 Authid Current_User is
3 v_cnt number(18,0);
4 begin
5 select count(1) into v_cnt from user_tables where table_name=upper(v_table);
6 if v_cnt>0 then
7 execute immediate 'drop table '||v_table; --这个之前加一个判断,如果表存在则执行这个,不存在就直接执行下一条
8 end if;
9 execute immediate 'create table '||v_table||'(a_id number(12) not null)';
10 end create_tb_proc;
11 /过程已创建。eygle@SZTYORA> exec create_tb_proc('luoyoumou');PL/SQL 过程已成功完成。eygle@SZTYORA> desc luoyoumou;
名称 是否为空? 类型
----------------------------------------------------------------------------------------- -------- -----------------------------
A_ID NOT NULL NUMBER(12)eygle@SZTYORA> drop table luoyoumou;表已删除。eygle@SZTYORA> create sequence luoyoumou;序列已创建。eygle@SZTYORA> exec create_tb_proc('luoyoumou');
BEGIN create_tb_proc('luoyoumou'); END;*
第 1 行出现错误:
ORA-00955: 名称已由现有对象使用
ORA-06512: 在 "EYGLE.CREATE_TB_PROC", line 9
ORA-06512: 在 line 1
DROP 占用名字的那个对象?
那系统里这个地雷就被引爆了
1.会话特有的临时表
CREATE GLOBAL TEMPORARY <TABLE_NAME> ( <column specification> )
ON COMMIT PRESERVE ROWS; 2.事务特有的临时表
CREATE GLOBAL TEMPORARY <TABLE_NAME> ( <column specification> )
ON COMMIT DELETE ROWS;
默认情况下创建的是事物特有的临时表
在Oracle中,全局临时表并不会删除,实际上你只需要建立一次,以后直接应用就行了.
比如一个报表程序中,多人查询同一个报表,那么在别人对表做insert等dml操作时,你是无法删除的,只能等对方事物完毕才能删除,你可以想象效率有多低.而临时表很好的解决了这个问题.
排它锁是锁定表的结构与结果集,期间其他用户不能使用DML语句修改表的结果,出现commit或者出现rollback之后锁结束,下面对排它锁举例说明:用户SY,新建用户GYM,实验表zzz给GYM分配下权限
grant select,insert,update on zzz to GYM表zzz 1条记录yyyymm provid1 zz 下面用GYM
update sy.zzz set provid ='1' where yyyymm ='zz'不提交,然后用用户SY
delete from zzz where yyyymm ='zz'这时,我们发现,delete from zzz where yyyymm ='zz‘这条语句在持续执行,一直未完成。这正是由于用户GYM使用update语句产生排它锁所引起的,这时,提交用户GYM的语句,排它锁解除,发现SY用户的语句执行完成,产生新的排它锁。此时回滚,不提交用户SY语句,查看ZZZ表select yyyymm,provid fromzzzyyyymm providzz 1加入一条记录,重新执行用户GYM语句,此时产生排它锁
insert into sy.zzz(yyyymm) values('zz1')update sy.zzz set provid ='1' where yyyymm ='zz' 此时UPDATE锁定的数据是yyyymm='zz' 用户sy执行delete from zzz where yyyymm='zz1'发现可以完成,这说明排它锁只锁定DML正在处理的数据,而对于非锁定中的数据,其他用户的依然可以处理排它锁其实就是锁定资源,被锁定的资源不能进行修改truncate,或者DROP table都会出现资源正忙的错误------
校内日记,凑合着看吧
共享锁
lock table 表名 in share mode
有dml操作对ddl操作的描述么?
----
排它锁其实就是锁定资源,被锁定的资源不能进行修改truncate,或者DROP table都会出现资源正忙的错误
看这个吧
还是说,直接对临时表进行delete和insert操作就不删除表了来达到我之前要的效果?
能说个具体点的例子么?临时表什么场合什么情况用、达到什么效果?
也即是说两个session可以同时使用临时表,但是彼此看不到对方的数据,只能看到对方的数据.