数据库详细介绍
分区操作链接
需要先备份表,然后新建这个表,拷贝数据,删除备份表
alter table test_part rename to test_part_temp;
create table test_part
(
ID NUMBER(20) not null,
REMARK VARCHAR2(1000),
create_time DATE
)
PARTITION BY RANGE (CREATE_TIME) INTERVAL (numtoyminterval(1, 'month'))
(partition part_t1 values less than(to_date('2018-11-01', 'yyyy-mm-dd')));
alter table test_part add constraint test_part_pk_1 primary key (ID) using INDEX;
insert into test_part_temp select * from test_part;
create index test_part_create_time_1 on TEST_PART (create_time);
drop table test_part_temp purge;
-- 当某一行更新时,如果更新的是分区列,并且更新后的列植不属于原来的这个分区,
-- 如果开启了这个选项,就会把这行从这个分区中 delete 掉,并加到更新后所属的分区,此时就会发生 rowid 的改变。
-- 相当于一个隐式的 delete + insert ,但是不会触发 insert/delete 触发器。
alter table test_part enable row movement;
在使用存储过程进行建表时,提示没有权限 :ORA-01031: insufficient privileges
但是sql命令窗口是能正常执行建表语句的。
CREATE OR REPLACE PROCEDURE sp_test IS
v_sql VARCHAR2(500);
----------备份表
v_sql := 'create table t_test as select * from user_tables' ;
EXECUTE IMMEDIATE v_sql;
--清空
END;
CREATE OR REPLACE PROCEDURE sp_test Authid Current_User IS
v_sql VARCHAR2(500);
BEGIN
----------备份表
v_sql := 'create table t_test as select * from user_tables';
EXECUTE IMMEDIATE v_sql;
--清空
END;
--注意事项
```sql
需要注意的是,如果涉及到嵌套调用,另外一个存过调用包含create table的存过时也需要添加 Authid Current_User。
不然同样不能正常调用。
还发现拥有 SELECT_CATALOG_ROLE 角色可以不用添加 Authid Current_User。
同义词–Oracle官网
create [public] synonym <synonym_name> for [schema.] object[@db_link];
-- 示例
create public synonym jobs for hr.jobs;
-- 用 scott 用户访问
select * from jobs;
-- 删除
drop synonym jobs;
-- 说明
当原对象被删除时,同义词依旧保留
但又存在原对象时,同义词依旧可以使用
1. 相关权限语句
create synonym :创建私有同义词权限
create public synonym :创建公有同义词权限
create any synonym :上述都有
drop any synonym
drop public synonym
-- 亦可通过下列查询语句知晓
select distinct t.privilege
from dba_sys_privs t
where t.privilege like '%SYNONYM%'
order by t.privilege;
2. 授权&回收
grant create any synonym to scott; -- 授权
revoke create any synonym to scott; -- 回收
3. 查询同义词对象
select * from dba_synonyms; -- 仅 DBA 用户
select * from all_synonyms;
select * from user_synonyms;
定时任务示例操作
游标的作用就相当于指针,通过游标PL/SQL程序可以一次处理查询结果集中的一行,并可以对该行数据执行特定操作
--声明游标
cursor cur_name[(input_parameter1[,input_parameter2]…)]
[return ret_type]
is select_sentence;
cur_name:表示所声明的游标名称。
input_parameter1:作为游标的“输入参数”,可以有多个,这是一个可选项。它指定用户在打开游标后向游标中传递的值。
ret_type:表示执行游标操作后的返回值类型,这是一个可选项。
select_sentence:游标所使用的SELECT语句,它为游标的反复读取提供了结果集。
--打开游标
open cur_name[(para_value1[,para_value2]…)];
cur_name:要打开的游标名称。
para_value1:指定“输入参数”的值。
--读取游标
fetch cur_name into {variable};
cur_name:要读取的游标名称。
variable:表示一个变量列表或“记录”变量(RECORD类型),Oracle使用“记录”变量来存储游标中的数据,要比使用变量列表方便得多。
--关闭游标
close cur_name;
cur_name:表示要关闭的游标名称。
(1)%found:布尔型属性,如果SQL语句至少影响到一行数据,则该属性为true,否则为fasle。
(2)%notfound:布尔型属性,与%found属性的功能相反。
(3)%rowcount:数字型属性,返回受SQL语句影响的行数。
(4)%isopen:布尔型属性,当游标已经打开时返回true,游标关闭时则为false。
步骤包括:声明游标、打开游标、读取游标和关闭游标4个步骤
声明一个检索emp表中雇员信息的游标,然后打开游标,并指定检索职务是“MANAGER”的雇员信息,接着使用fetch…into语句和while循环读取游标中的所有雇员信息,并输出读取的雇员信息,最后使用close语句关闭游标。
create table emp(empno number,ename varchar2(500),sal number(10,2),job varchar2(500));
insert into emp (empno,ename,sal,job)
select 1,'liudehua',10000,'SALESMAN' from dual
union all
select 2,'liming',10000,'MANAGER' from dual
;
DECLARE
/*声明游标,检索雇员信息*/
CURSOR CUR_EMP(VAR_JOB IN VARCHAR2:='SALESMAN')
IS SELECT EMPNO,ENAME,SAL
FROM EMP
WHERE JOB=VAR_JOB;
TYPE RECORD_EMP IS RECORD --声明一个记录类型(RECORD类型)
(
/*定义当前记录的成员变量*/
VAR_EMPNO EMP.EMPNO%TYPE,
VAR_ENAME EMP.ENAME%TYPE,
VAR_SAL EMP.SAL%TYPE
);
EMP_ROW RECORD_EMP; --声明一个RECORD_EMP类型的变量
BEGIN
OPEN CUR_EMP('MANAGER'); --打开游标
FETCH CUR_EMP INTO EMP_ROW; --先让指针指向结果集中的第一行,并将值保存到EMP_ROW中
WHILE CUR_EMP%FOUND LOOP
DBMS_OUTPUT.PUT_LINE(EMP_ROW.VAR_ENAME||'的编号是'||EMP_ROW.VAR_EMPNO||',工资是'||EMP_ROW.VAR_SAL);
FETCH CUR_EMP INTO EMP_ROW; --让指针指向结果集中的下一行,并将值保存到EMP_ROW中
END LOOP;
CLOSE CUR_EMP; --关闭游标
END;
liming的编号是2,工资是10000
在SCOTT模式下,把emp表中的销售员(即SALESMAN)的工资上调20%,然后使用隐式游标sql的%rowcount属性输出上调工资的员工数量。
begin
update emp
set sal=sal*(1+0.2)
where job='SALESMAN'; --把销售员的工资上调20%
if sql%notfound then --若update语句没有影响到任何一行数据
dbms_output.put_line('没有雇员需要上调工资');
else --若update语句至少影响到一行数据
dbms_output.put_line('有'||sql%rowcount||'个雇员工资上调20%');
end if;
end;
–执行结果
有1个雇员工资上调20%
begin
for emp_record in (select empno,ename,sal from emp where job='SALESMAN')
loop
dbms_output.put_line('雇员编号:'||emp_record.empno); --输出雇员编号
dbms_output.put_line(';雇员名称:'||emp_record.ename); --输出雇员名称
dbms_output.put_line(';雇员工资:'||emp_record.sal); --输出雇员工资
end loop;
end;
–执行结果
雇员编号:1
;雇员名称:liudehua
;雇员工资:12000
declare
cursor cur_emp is
select * from emp
where empno=2; --检索部门编号为30的雇员信息
begin
for emp_record in cur_emp --遍历雇员信息
loop
dbms_output.put_line('雇员编号:'||emp_record.empno); --输出雇员编号
dbms_output.put_line(';雇员名称:'||emp_record.ename); --输出雇员名称
dbms_output.put_line(';雇员工资:'||emp_record.sal); --输出雇员工资
end loop;
end;
–执行结果
雇员编号:2
;雇员名称:liming
;雇员工资:10000
其它学习资料