oracle 筆記下

建立表空間:建立表空間使用create tablespace 命令
只有擁有dba 或是擁有create datebase權限的用戶可以創建

SQL> create tablespace demon001 datafile 'd:\demon001.dbf' size 2m uniform size 128k;(這裏的

uniform就是我們所指的區)


向指定表空間中添加表
create table mypart(deptno number(4),dname varchar2(14),loc varchar2(13)) tablespace demon001;

改變表空間狀態 一般還是特權用戶或是dba

(1)使表空間脫機
alter tablespace 表空間名 offline

(2)使表空間聯機
alter tablespace 表空間名 online

(3)只讀表空間,當建立表空間時,表空間可以讀寫,如果不希望該表空間上執行update,delete
,insert 操作,那麼可以將表空間改爲只讀狀態
alter tablespace 表空間名 read only;
如果要恢復則 alter tablespace 表空間名 read write;

(4)知道表空間得到其下面的表
select * from all_tables where tablespace_name='DEMON001';


(5) 知道一個表,查看屬於哪個表空間
SQL> select tablespace_name,table_name from user_tables where table_name='表名';

(6)刪除表空間
drop tablespace '表空間名' Including contends and datafiles;
說明:在刪除表空間時,會把所有的數據對象和數據庫文件也刪除;

(7)當表空間達到足夠大時,就增加不了數據了。這時候可以使用三種方式來增加表空間大小;
a.增加數據文件的數量
alter tablespace demon001 add datafile 'd:\demon002.dbf' size 20m;

b.增加數據文件大小
alter tablespace '表空間名' resize 20m;

c.設置文件的自動增長
alter tablespace '表空間名' autoextend on next 10m maxsize 500m;

(8)移動數據文件
如果你的數據文件所在的磁盤損壞時,該數據文件將不再使用,爲了能夠重新使用,需要將這些文件的副本移動到

其他磁盤,然後恢復
下面以demon001.dbf 爲例說明 :
a.確定數據文件所在的表空間
select tablespace_name from dba_data_files where file_name='d:\demon001.dbf';

b.使表空間脫機,確保數據文件的一致性,將表空間轉換爲offline的狀態
alter tablespace demon001 offline;

c.使用命令移動數據文件到指定的目標位置
host move d:\demon001.dbf e:\demon001.dbf

d.在物理上移動數據後,還必須執行alter tablespace 命令對數據文件進行邏輯修改
alter tablespace demon001 rename datafile 'd:\demon001.dbf' to 'e:\demon001.dbf';

e.在移動數據文件後,爲了使用戶可以訪問該表空間,必須將其轉化成online狀態
alter tablespace '表空間名' online


.權限
1.系統權限 (用戶針對數據庫的一些操作如建庫 建表 創建用戶 )
system---》tom授權(登錄)--》ken 當回收tom權限時,ken 是否可以再登錄
系統權限不是級聯回收
2.對象權限(對錶的增刪改查 ,索引等等操作)
對象權限是級聯回收的

角色:是一些相關聯權限的結合
預定義角色:是oracle所提供的角色,是執行一些特定的管理任務。
下面介紹三個常見的預定義角色:
a.resource:
b.connect
c.dba
自定義角色:一般是dba或是有create role 權限的用戶

create role 角色名 not identified;
grant create session to 角色名 with admin option;
grant select on scott.emp to 角色名;
.........;

授角色(一般是dba 或是擁有grand any role 的權限)
grant 角色名 to 用戶 with admin option;

消除角色 drop role 角色名 執行完該命令後,將不會再有登錄權限


plsql
存儲過程:
create table mytest(username varchar2(10),password varchar2(10));

創建:SQL> create or replace procedure insert_prol is//後面的or replace 是可選的
2 begin
3 insert into mytest values('dim','123');
4 end;
5 /

刪除 drop procedure insert_prol;

執行 exec insert_prol;
call insert_prol;


例1:最簡單的塊

SQL> set serveroutput on;
SQL> begin
2 dbms_output.put_line('hell');//和java中的包中含有方法和函數相似
3 end;
4 /

例2:定義變量(假如輸入爲7788)

SQL> declare
2 v_name varchar(9);
3 v_sal number(5);
4 begin
5 select ename,sal into v_name,v_sal from emp where EMPNO=&no;// &是從控制檯輸入變量
6 dbms_output.put_line('用戶名是:'||v_name||' 工資:'||v_sal);//"||"是連接符
exception
7 when no_data_found then
8 dbms_output.put_line('輸入有誤!');
9 end;
10 /

用戶名是:SCOTT 工資:3000

2.1 定義常量的方法:“:=”
SQL> declare
2 c_tax_rate number(3,2):=0.03;
3 v_tax_sal number(7,2);
4 v_name varchar2(5);
v_sal number(7,2);
6 begin
7 select ename,sal into v_name,v_sal from emp where empno=&no;
8 v_tax_sal := v_sal*c_tax_rate;
9 dbms_output.put_line('姓名:'||v_name ||'工資:' ||v_sal ||'納稅:' ||v_tax_sal);
10 end;
11 /

標量:%type 解決字符串的不匹配:
還是上面的例子,如果我們得到的名字的個數大於5 那麼就會報錯(numeric or value error: character

string buffer too small),這是可以使用

declare
c_tax_rate number(3,2):=0.03;
v_tax_sal number(7,2);
v_name emp.ename%type;//這裏是表示該變量的到的buffer大小和emp表中ename的大小相同
v_sal number(7,2);
begin
select ename,sal into v_name,v_sal from emp where empno=&no;
v_tax_sal := v_sal*c_tax_rate;
dbms_output.put_line('姓名:'||v_name ||'工資:' ||v_sal ||'納稅:' ||v_tax_sal);
end;

複合類型--pl/sql 記錄實例【相當java中的結構體

declare
--定義一個pl/sql的記錄類型emp_record_type 包含三個部分 name,salary,title
type emp_record_type is record(name emp.ename%type,salary emp.sal%type,title emp.job%type);
--定義一個emp_record_type類型的變量
dim_record emp_record_type;
begin
select ename,sal,job into dim_record from emp where empno=7788;
dbms_output.put_line('該記錄的用戶名是:'||dim_record.name);
end;

該記錄的用戶名是:SCOTT
如果沒有顯示結果,可能是沒有設置:set serveroutput on;

複合類型--pl/sql 表實例 【相當java中的數組

SQL>
SQL> declare
2 --定義一個pl/sql的表類型 存放的類型是:emp.ename%type
3 --index by binary_integer 表示下標是整數
4 type emp_table_type is table of emp.ename%type index by binary_integer;
5 --定義一個emp_table_type類型的變量
6 dim_table emp_table_type;
7 begin
8 select ename into dim_table(-1) from emp where empno=7788;
9 dbms_output.put_line('該記錄的用戶名是:'||dim_table(-1));
10 end;
11 /

該記錄的用戶名是:SCOTT

【在這裏如果把where 後的去掉就會出現錯誤 ,因爲返回的個數大於一 :解決問題如下:使用遊標

declare
2 --定義遊標類型dim_emp_cursor
3 type dim_emp_cursor is ref cursor;
4 --定義一個遊標變量
5 test_cursor dim_emp_cursor;
6 --定義變量
7 v_ename emp.ename%type;
8 v_sal emp.sal%type;
9 begin
10 --把test_cursor 和一個select 結合
11 open test_cursor for select ename,sal from emp where deptno=&no;
12 --循環取出
13 loop
14 fetch test_cursor into v_ename,v_sal;
15 exit when test_cursor%notfound;
16 dbms_output.put_line('名字:'||v_ename||'工資:'||v_sal);
17 end loop;
18 --關閉遊標
19 close test_cursor;
20 end;
21 /

函數:
create function dim_fun1 (s_name varchar2) return
2 number is yearSal number(7,2);
3 begin
4 select sal*12+nvl(comm,0)*12 into yearSal from emp where ename=s_name;
5 return yearSal;
6 end;
7 /

執行:SQL> var year_sal number;
SQL> call dim_fun1('SCOTT') into:year_sal;

Method called
year_sal
---------
36000


包的創建 包體的創建 及包的使用
create package dim_pag is
2 procedure update_sal (name varchar2,newSal number);
3 function total_income(name varchar2) return number;
4 end;
5 /

Package created

SQL>
SQL> create package body dim_pag is
2 procedure update_sal(name varchar2,newSal number)
3 is
4 begin
5 update emp set sal=newSal where ename=name;
6 end;
7 function total_income(name varchar2)
8 return number is
9 all_sal number;
10 begin
11 select sal*12+nvl(comm,0) into all_sal from emp
12 where ename=name;
13 return all_sal;
14 end;
15 end;
16 /

Package body created

SQL> exec dim_pag.update_sal('SCOTT',200);


帶有輸入輸出參數:
--輸入參數 in(默認) 輸出參數用out
create or replace procedure dim_inout(v_no in number,v_name out varchar2,v_sal out number)
is
begin
select ename,sal into v_name,v_sal from emp where empno=&v_no;
end;

在java中調用:
try {
Class.forName("oracle.jdbc.driver.OracleDriver");
Connection con = DriverManager.getConnection

("jdbc:oracle:thin:@localhost:1521:ORCL","SCOTT","pass");
CallableStatement cs = con.prepareCall("{call dim_inout(?,?,?)}");
cs.setInt(1, 7788);
//給第二個?賦值
cs.registerOutParameter(2, oracle.jdbc.OracleTypes.VARCHAR);
cs.registerOutParameter(3, oracle.jdbc.OracleTypes.NUMBER);
cs.execute();

String name = cs.getString(2);
double sal = cs.getDouble(3);
System.out.println("7788的用戶名是:"+name+"工資是:"+sal);
} catch (Exception e) {
e.printStackTrace();
}


一般情況下,我們使用返回結果集的方式得到
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章