1. 程式人生 > >Oracle常用語句語法彙總

Oracle常用語句語法彙總

第一篇  基本操作

--解鎖使用者   alter user 使用者 account unlock;
--鎖定使用者   alter user 使用者 account lock;
alter user scott account unlock;


--建立一個使用者yc   密碼為a       create user 使用者名稱   identified by 密碼;
create user yc identified by a;


--登入不成功,會缺少create session 許可權,賦予許可權的語法         grant 許可權名   to  使用者;
grant create session to yc;


--修改密碼     alter user 使用者名稱   identified  by  新密碼;
alter user yc identified  by  b;


--刪除使用者
drop user yc ;

--查詢表空間
select *from dba_tablespaces;
--查詢使用者資訊
select *from dba_users;
--建立表空間
create tablespace ycspace
datafile  'E:\oracle\app\product\11.2.0\dbhome_1\oradata\ycspace.dbf'
size 2m
autoextend on next 2m maxsize 5m
offline ;


--建立臨時表空間
create temporary yctempspace
tempfile 'E:\oracle\app\product\11.2.0\dbhome_1\oradata\ycspace.dbf'
size 2m
autoextend on next 2m maxsize 5m
offline ;


--查詢資料檔案
select *from dba_data_files;


--修改表空間


       --1、修改表空間的狀態
             --預設情況下是online,只有在非離線情況下才可以進行修改
       alter tablespace ycspace  offline ;  --離線狀態,不允許任何物件對該表空間的使用,使用情況:應用需要更新或維護的時候;資料庫備份的時候
       alter tablespace ycspace read write;--讀寫狀態
       alter tablespace ycspace online;  
       alter tablespace ycspace read only;  --只讀,可以查詢資訊,可以刪除表空間的物件,但是不能建立物件和修改物件  。使用情況:資料存檔的時候
       
       --2、修改表空間的大小
             --增加檔案的大小
             alter database  datafile 'E:\oracle\app\product\11.2.0\dbhome_1\oradata\ycspace.dbf'  resize 10m;
             --增加資料檔案
             alter tablespace ycspace add datafile 'E:\oracle\app\product\11.2.0\dbhome_1\oradata\add.dbf' size 2m;
       
      --刪除表空間的資料檔案
      alter  tablespace  表空間的名字  drop datafile 資料檔名;

   --刪除表空間
       drop tablespace ycspace;
       
   --刪除表空間且表空間中的內容和資料檔案
       drop tablespace ycspace including contents and datafiles;
       
   --指定表空間 的  建立使用者的語法
       create user yc1 identified by a default tablespace  ycspace temporary  tablespace temp;
       
--刪除使用者
drop user yc1;


--許可權
     --賦予建立會話的許可權
     grant create session to yc1;
     
     --建立一個表
     create table  studentInfo(
            sid int,
            sname varchar2(10)
       );
       
      --賦予yc1使用者建立表的許可權
      grant create table to yc1;
      --賦予yc1使用表空間的許可權
      grant unlimited tablespace to yc1;


--系統許可權


--物件許可權


      --插入
      insert into studentInfo values (2,'abcd');
      --查詢
      select *from studentInfo;
      --修改
      update studentInfo set sid=1;
      --刪除 
      delete studentInfo ;
      drop table studentInfo;        --系統許可權刪除表
      

--賦權的語法
     
      --系統許可權
            grant 許可權名(系統許可權或物件許可權,角色,all) to 使用者(角色,public)  with admin option;
      
      --物件許可權
 
grant 許可權名(系統許可權或物件許可權,角色,all) on 使用者(角色,public)  with grant option;

--收權語法
 --系統許可權
revoke 許可權名(系統許可權或物件許可權,角色,all) from 使用者(角色,public) with admin option;
 --物件許可權
            revoke 許可權名(系統許可權或物件許可權,角色,all) from 使用者(角色,public) with grant option;


--賦予建立使用者的許可權並且把這個許可權傳遞下去,即yc1可以給別人賦權
      grant create user to yc1 with admin option;


--收回許可權,只能收回scottd ,不能收回由scott賦權的yc1的許可權
      revoke create user from scott;


--檢視使用者所具有的許可權
      select *from user_sys_privs;

--物件許可權詳解
select * from emp;
--使用yc1來查詢scott裡面的emp表
       select * from  scott.emp;


--賦予yc1查詢emp表和插入的許可權
grant select on emp to yc1;
grant insert on emp to yc1;
grant update(empno,ename)  on emp to yc1;


grant delete on emp to yc1;


--對scott的emp表新增資料
insert into scott.emp(empno,ename)  value(111,'acv');
update scott.emp  set ename='yc'where empno=111;


--賦予查詢、賦予刪除、新增、修改
grant select on 表名 to  使用者


--grant select,delete,update,insert on 表名  to  使用者
grant select,delete,update,insert on emp  to  yc1;
grant all on dept to yc1; --all代表所有的物件許可權


select *from scott.emp;


select *from scott.dept;
insert into scott.dept values(50,'企事業文化部','bumen');


--檢視角色
--dba:資料庫管理員,系統最高許可權,可以建立資料結構(表空間等)
--resource:可以建立實體(表、檢視),不可以建立資料庫的結構
--connect:連線的許可權,可以登入資料庫,但是不可以建立實體和不可以建立資料庫結構


select  *from role_sys_privs;


grant connect to yc1;


--將可以連線的角色賦予給yc1,則yc1就是應該可以連線資料庫的人,類似於 create session 。
create table StuInfos(sid int);


select *from StuInfos;

create table stuInfo(
       sid int primary key , --主鍵  primary key  非空且唯一   (主鍵約束)
       sname varchar2(10) not null,   --姓名不能為空,(非空約束)
       sex char(2) check(sex in('男','女')), --(檢查約束),check,
       age number(3,1)  constraint ck_stuInfo_age  check(age>10 and age<100) , --也可以用varchar     ;age between 10 and 100     ,在10和100之間,是一個閉區間
       tel number(15)  unique   not null,  --唯一約束,   
       address  varchar2(200)  default '什麼鬼' 
  )


  insert into stuInfo values(3,'大大','男',18,4321543,default);
  insert into stuInfo values(1,'張三','男',10);
  select *from  stuInfo;    
  
  drop table stuInfo;


       create table classInfo(
              cid int primary key,  --班級id
              cname varchar2(20) not null  unique  --班級名
       )
       create table stuInfo(
              sid int primary key,
              sname varchar2(20),
              cid int constraint   fofk_stuInfo_cid references classInfo(cid) on delete cascade 
       )
       insert into classInfo values(1,'1班');
       insert into classInfo values(2,'2班');
       insert into classInfo values(3,'3班');
       insert into classInfo values(4,'4班');


       select *from classInfo;
       select *from stuInfo;
       
       insert into stuInfo values(1001,'張三',2);
       insert into stuInfo values(1002,'張四',4);
       
       update classInfo set cid=1  where cid=8;
       
        drop table stuInfo;--要先刪除這個
       drop table classInfo; --再刪除這個
      
       delete classInfo where cid=4 ;--同時刪除這兩個表中的4
       
       
       --刪除使用者的時候
       drop user yc1 [cascade]    --刪除使用者的同時把它建立的物件都一起刪除
       
       
       --修改表
                 --1、新增表中欄位
                 --alter table 表名 add 欄位名  型別  
                       alter table classInfo add status varchar2(10) default '未畢業'


                 --2、修改已有欄位的資料型別
                 --alter table  表名 modify 欄位名 型別
                 alter  table classInfo  modify status number(1) 
                 
                 --3、修改欄位名
                 --alter table 表名  rename column 舊欄位名 to 新的欄位名
                 alter table classInfo rename column cname to 班級名;
                 
                 --4、刪除欄位
                 --alter table 表名  drop column 欄位名
                 alter table classInfo drop column status ;


                 --5、修改表名
                 --rename 舊錶名  to 新表名
                 rename classInfo to 班級資訊;
                 
         --刪除表
         --1、截斷表效率高,每刪除一次會產生一次日誌      2、截斷會釋放空間,而delete不會釋放空間
                 --刪除表結構和資料
                 drop table 表名; 
                  --刪除表中所有資料
                  truncate table classInfo;
                  delete classInfo;


           create table classInfo(
              cid int primary key,  --班級id
              cname varchar2(20) not null  unique , --班級名
              stasuts varchar2(100)
            );
            select *from classInfo;
            
 --資料的操作
         
           --增加資料語法
           --insert into 表名[(列名,....)]  values (對應的資料的值);
           insert into classInfo values(1,'一班','未畢業');--需要按照表結構的順序插入
           insert into classInfo values(4,'六班','未畢業');
           insert into classInfo(cname,cid)  values('二班',2);  --需要按照括號中的順序插入,但是 not null primary key 必須插入的。
           insert into classInfo(cname,cid)  values('三班',3); 
           
           --刪除的語法
           --delete 表名 [where  條件]  
           delete classInfo where cid>=2;
           
           --修改記錄的語法
           --update 表名 set  [欄位='值' ]   [where 條件]
           update classInfo set cname='三班';  --會修改所有該欄位
           update classInfo set cname='四班' where cid=1;  
           update classInfo set cname='五班', stasuts ='未畢業'  where cid=3;
           
           --alter table classInfo drop constraint SYS_C0011213;
           
           --新增多個時可以使用序列
           --用序列來做自動增長
           create sequence seq_classInfo_cid start with 1001 increment by 1;
           
         insert into classInfo values(seq_classInfo_cid.Nextval,'七班','未畢業');
         insert into classInfo values(seq_classInfo_cid.Nextval,'八班','未畢業');  
         insert into classInfo values(seq_classInfo_cid.Nextval,'九班','未畢業');
         insert into classInfo values(seq_classInfo_cid.Nextval,'十班','未畢業');
 
 
 
 
         create table classInfo2(
              cid int primary key,  --班級id
              cname varchar2(20) not null  unique , --班級名
              stasuts varchar2(100)
    
            );
            select *from classInfo2;
            drop table classInfo2;
            
            insert into classInfo2 select *from classInfo;
            insert into classInfo(cname,cid)  select cname,cid from classInfo;
            alter table classInfo2 drop constraint SYS_C0011213;
 
            select seq_classInfo_cid.nextval from dual;
            select seq_classInfo_cid.Currval from dual;
 
            
     --直接建立一個新表,並拿到另一個表其中的資料
     create table newTable as select cname,cid from classInfo;
     create table newTable1 as select *from classInfo;
     
     select *from newTable;
     select *from newTable1;
     insert into newTable1 values(1008,'dg','');
 
 

第二篇:高階操作


直接在使用scott登陸,進行查詢操作
----------------------------------------------------------------------------------
--簡單查詢
select *from emp;


select empno as id,ename as name from emp;


select empno  編號,ename 姓名 from emp;

       --去除重複
       select job from emp;
       select distinct job from emp;
       select job,deptno from emp;
       select distinct job,deptno from emp;
       


       --字串的連線
       select '員工編號是' ||empno || '姓名是' ||ename  ||'工作是'||job  from emp;
      
        --乘法
       select ename,sal *12 from emp;
       --加減乘除都類似
       
 ---------------------------------------------------------------------      
--限定查詢
       --獎金大於1500的
       select *from emp where sal>1500;
       --有獎金的
       select *from emp where comm is not null;
       --沒有獎金的
       select *from emp where comm is null;
       --有獎金且大於1500的
       select *from emp where sal>1500 and comm is not null;
       --工資大於1500或者有獎金的
       select *from emp where sal>1500 or comm is not null;
       --工資不大於1500且沒獎金的
       select *from emp where sal<=1500 and comm is null;
       select *from emp where not (sal >1500 or comm is not null);
       --工資大於1500但是小於3000的
       select *from emp where sal>1500 and sal<3000;
       select *from emp where sal between 1500 and 3000;   --between是閉區間,是包含1500和3000的
       --時間區間
       select *from emp where hiredate between to_date('1981-01-01','yyyy-MM-dd') and to_date('1981-12-31','yyyy-MM-dd');
       --查詢僱員名字
       select *from emp where ename='SMITH';
       --查詢員工編號
       select *from emp where empno=7369 or empno=7499 or empno=7521;
       select *from emp where empno in(7369,7499,7521);  
        select *from emp where empno not in(7369,7499,7521); --排除這3個,其他的都可以查
       
       --模糊查詢
       select *from emp where ename like '_M%';  --第2個字母為M的
       select *from emp where ename like '%M%';
       select *from emp where ename like '%%';   --全查詢
       
       --不等號的用法
       select * from emp where empno !=7369;
       select *from emp where empno<> 7369;
       
 


    --對結果集排序      
       --查詢工資從低到高
       select *from emp order by sal asc;
       select *from emp order by sal desc,hiredate desc;   --asc 當導遊列相同時就按第二個來排序
     --字元函式
     select *from dual;--偽表
     select 2*3 from dual;
     select sysdate from dual;
     --變成大寫 
     select upper('smith') from dual;
     --變成小寫
     select lower('SMITH') from dual;
     --首字母大寫
     select initcap('smith') from dual;
     --連線字串
     select concat('jr','smith') from dual;  --只能在oracle中使用
     select 'jr' ||'smith' from dual;  --推薦使用 
     --擷取字串
     select substr('hello',1,3) from dual;  --索引從1開始
     --獲取字串長度
     select length('hello') from dual;
     --字串替換
     select replace('hello','l','x') from dual; --把l替換為x
 --------------------------------------------------------------------------------------------------    
 --通用函式
     --數值函式
     --四捨五入
     select round(12.234) from dual;--取整的四捨五入  12
     select round (12.657,2) from dual;  --保留2位小數
     select trunc(12.48) from dual;--取整
     select trunc(12.48675,2) from dual;  --保留2位小數
     --取餘
     select mod(10,3) from dual;--10/3取餘    =1
     
     --日期函式
     --日期-數字=日期     日期+數字=日期     日期-日期=數字
     
     --查詢員工進入公司的週數
     select ename,round((sysdate -hiredate)/7)  weeks from emp;
     --查詢所有員工進入公司的月數
     select ename,round(months_between(sysdate,hiredate))  months from emp;
     --求三個月後的日期
     select add_months(sysdate,6) from dual;
     select next_day(sysdate,'星期一') from dual;   --下星期
     select last_day(sysdate) from dual;   --本月最後一天
     select last_day(to_date('1997-1-23','yyyy-MM-dd')) from dual;
     
     --轉換函式
     select ename ,
            to_char(hiredate,'yyyy') 年,
            to_char(hiredate,'mm')月,
            to_char(hiredate,'dd') 日  
      from emp;
     
     select to_char(10000000,'$999,999,999') from emp;
     
     select to_number('20')+to_number('80') from dual;    --數字相加
     
  --查詢員工年薪
     select ename,(sal*12+nvl(comm,0))  yearsal from  emp; --空和任何數計算都是空
    
   --Decode函式,類似if else  if  (常用)
     select decode(1,1,'one',2,'two','no name') from dual;
     
     --查詢所有職位的中文名
   select ename, decode(job,
              'CLERK',
              '業務員',
              'SALESMAN',
              '銷售',
              'MANAGER',
              '經理',
              'ANALYST',
              '分析員',
              'PRESIDENT',
              '總裁',
              '無業')
  from emp; 
     
 select ename,
        case
          when job = 'CLERK' then
           '業務員'
          when job = 'SALESMAN' then
           '銷售'
          when job = 'MANAGER' then
           '經理'
          when job = 'ANALYST' then
           '分析員'
          when job = 'PRESIDENT' then
           '總裁'
          else
           '無業'
        end
   from emp;
     
     
 -------------------------------------------------------------------------------------------
    
 --多表查詢
   
     select *from  dept;
     select *from emp,dept order by emp.deptno;
     select *from emp e,dept d where e.deptno=d.deptno;
     select e.*,d.dname,d.loc from emp e,dept d where e.deptno=d.deptno;
     
     --查詢出僱員的編號,姓名,部門編號,和名稱,地址
      select e.empno,e.ename,e.deptno,d.dname,d.loc from emp e,dept d where e.deptno=d.deptno;
     
     --查詢出每個員工的上級領導
     select  e.empno,e.ename,e1.empno,e1.ename from emp e,emp e1 where e.mgr=e1.empno;
     
     select e.empno,e.ename,d.dname 
      from emp e,dept d ,salgrade s, emp e1 
      where e.deptno=d.deptno 
      and e.sal between s.losal 
      and s.hisal
      and e.mgr=e1.empno;
      
      select e.empno,e.ename,e1.empno,e1.ename from emp e,emp e1 where e.mgr=e1.empno(+) ;
     


--外連線
      select *from emp order by deptno;
     --查詢出每個部門的員工
     /*
     分析:部門表是全量表,員工表示非全量表,
     在做連線條件時,全量表在非全量表的哪端,那麼連線時全量表的連線條件就在等號哪斷
     */
     --左連線
     select * from dept d,emp e where d.deptno=e.deptno(+)  order by e.deptno;  
     --右連線
      select * from emp e,dept d where e.deptno(+)=d.deptno  order by e.deptno;
     
     
  -----------------------------作業
  --查詢與smith相同部門的員工姓名和僱傭日期
     select *from emp t 
     where  t.deptno= (select e.deptno from emp e  where e.ename='SMITH')
     and t.ename<> 'SMITH';
     
   --查詢工資比公司平均工資高的員工的員工號,姓名和工資
   select t.empno,t.ename,t.sal 
   from emp t
   where t.sal>(select avg(sal)  from   emp);
     
     --查詢各部門中工資比本部門平均工資高的員工號,姓名和工資
    select t.empno,t.ename,t.sal  
    from  emp t,  (select avg(e.sal) avgsal,e.deptno from emp e group by e.deptno) a
    where t.sal>a.avgsal  and t.deptno=a.deptno;
     
    --查詢姓名中包含字母u的員工在相同部門的員工的員工號和姓名
    select t.empno,t.ename from emp t 
    where t.deptno in( select e.deptno from emp e where e.ename like '%U%')
    and t.empno not in  ( select e.empno from emp e where e.ename like '%U%')  ;
     
     --查詢管理者是king的員工姓名和工資
     select t.ename,t.sal from emp t 
     where t.mgr in
     (select e.empno from emp e where e.ename='KING');
     
     
     
 -------------------------------------------------------------------------------------    
 ---sql1999語法   
     select *from emp join dept using(deptno) where deptno=20;
    select *from emp natural join dept;
    select *from emp e join dept d on e.deptno=d.deptno;
    select *from dept;
    select *from  dept d left join emp e on d.deptno=e.deptno;
    select *from dept d,emp e where d.deptno=e.deptno(+);
    
---分組  
    select  count(empno) from emp group by deptno;
    select deptno,job,count(*) from emp group by deptno,job order by deptno;
    select *from EMP for UPDATE;
    
     --group by 後面有的欄位,select後才可以有,group by後面沒有的欄位,select後面絕對不能有
  select  d.dname, d.loc, count(e.empno) from emp e, dept d where e.deptno = d.deptno group by  d.dname, d.loc ;
    
    
    
----------------------------------------------------------------------------------------------------
    --子查詢
    select *from emp t where t.sal>(select *from emp e where e.empno=7654);
    
    select rownum ,t.* from emp t where rownum <6 ;
    
    --pagesize 5
    select *from(select rownum rw,a.* from (select *from emp )  a where rownum <16) b where b.rw>10;
    select *from (select *from emp) where rownum>0;
    
    --索引
    create index person_index on person(p_name);
    
    
    --檢視
    create view view2 as select *from emp t where t.deptno=20;
    select *from view2;
    
    
    
--------------------------------------------------------------------------------------------------------    
    --pl/sql
    --plsql是對sql語言的過程化擴充套件
    -----
    declare 
    begin
      dbms_output.put_line('hello world');
     end;
    -------
    declare
      age   number(3);
      marry boolean := true;   --boolean不能直接輸出
      pname varchar2(10) := 're jeknc';
    begin
      age := 20;
      dbms_output.put_line(age);
      if marry then
        dbms_output.put_line('true');
      else
        dbms_output.put_line('false');
      end if ;
      dbms_output.put_line(pname);
    end;
     
    --常量和變數
    --引用變數,引用表中的欄位的型別
    Myname  emp.ename%type;   --使用into來賦值
    
    
    declare 
          pname emp.ename%type;  
    begin   
      select t.ename into pname from emp t where t.empno=7369;
      dbms_output.put_line(pname);
     end;
    
    --記錄型變數
    Emprec emp%rowtype;    --使用into來賦值
    
    declare 
           Emprec emp%rowtype;
    begin
      select t.* into Emprec from emp t where t.empno=7369;
      dbms_output.put_line(Emprec.empno || ' '||Emprec.ename||' '||Emprec.job);
     end;
    
    --if分支
    
      語法1:
           IF   條件  THEN 語句1;
             語句2; 
             END IF;
      語法2:
           IF  條件  THEN  語句序列1;   
             ELSE   語句序列 2;
             END   IF; 
      語法3:
            IF   條件  THEN 語句;
            ELSIF  條件  THEN  語句;
            ELSE  語句;
            END  IF; 
     --1
    declare       
            pname number:=&num;
    begin
            if pname = 1  then
              dbms_output.put_line('我是1');
            else
                 dbms_output.put_line('我不是1'); 
             end if;
    end;
    
     --2
    declare
      pname number := &num;
    begin
      if pname = 1 then
        dbms_output.put_line('我是1');
      elsif pname = 2 then
        dbms_output.put_line('我是2');
      else
        dbms_output.put_line('我不是12');
      end if;
    end;
       
      
           
      --loop迴圈語句
      語法2:
            Loop
            EXIT [when   條件];
            ……
            End loop


       --1    
      declare
        pnum number(4):=0;
      
      begin
        while pnum < 10 loop
          dbms_output.put_line(pnum);
          pnum := pnum + 1;
        end loop;
      end;
    
      --2  (最常用的迴圈)
      declare 
        pnum number(4):=0;
      begin
        loop
          exit when pnum=10;
          pnum:=pnum+1;
          dbms_output.put_line(pnum);
        end loop;
        end;
    
      --3
      declare
        pnum number(4);
      begin
        for pnum in 1 .. 10 loop
          dbms_output.put_line(pnum);
        end loop;
      end;
       
      ----------------------------------
      --遊標
      語法:
        CURSOR  遊標名  [ (引數名  資料型別,引數名 資料型別,...)]  IS  SELECT   語句;
      例如:cursor c1 is select ename from emp;
      
       
    declare
      cursor c1 is
        select * from emp;
      emprec emp%rowtype;
    begin
      open c1;
      loop
        fetch c1
          into emprec;
        exit when c1%notfound;
        dbms_output.put_line(emprec.empno || '  ' || emprec.ename);
      end loop;
      close c1;   --要記得關閉遊標
    end;
    
 
    --------例外
    --異常,用來增強程式的健壯性和容錯性
        -- no_data_found    (沒有找到資料)
        --too_many_rows          (select …into語句匹配多個行) 
        --zero_divide   ( 被零除)
        --value_error     (算術或轉換錯誤)
        --timeout_on_resource      (在等待資源時發生超時)


    
    --寫出被0除的例外程式
    declare
      pnum number(4) := 10;
    begin
      pnum := pnum / 0;
    exception
      when zero_divide then
        dbms_output.put_line('被0除了');
      when value_error then
        dbms_output.put_line('算術或轉換錯誤');
      when others then
        dbms_output.put_line('其他異常');
    end;
    
    --自定義異常
    --No_data    exception;
    --要丟擲raise no_data;
    
   declare
     cursor c1 is
       select * from emp t where t.deptno = 20;
     no_data exception;
     emprec emp%rowtype;
   begin
     open c1;
     loop
       fetch c1
         into emprec;
       if c1%notfound then
         raise no_data;
       else
         dbms_output.put_line(emprec.empno || '  ' || emprec.ename);
       end if;
     end loop;
     close c1;
   
   exception
     when no_data then
       dbms_output.put_line('無員工');
     when others then
       dbms_output.put_line('其他異常');
   end;
    
    
    --儲存過程
    語法:
        create [or replace] PROCEDURE 過程名[(引數名 in/out 資料型別)]  
        AS 
        begin
                PLSQL子程式體;
        End;


        或者


        create [or replace] PROCEDURE 過程名[(引數名 in/out 資料型別)]  
        is
        begin
                PLSQL子程式體;
        End  過程名;
        
        -----建立一個儲存過程helloworld
        create or replace procedure helloworld is
        begin
          dbms_output.put_line('hello world');
        end helloworld;


        ------建立一個漲工資的
        create or replace procedure addsal(eno in emp.empno%type) is
          emprec emp%rowtype;
        begin
          select * into emprec from emp t where t.empno = eno;
        
          update emp t set t.sal = t.sal + 100 where t.empno = eno;
          dbms_output.put_line('漲工資前是' || emprec.sal || ',漲工資後是' ||
                               (emprec.sal + 100));
        end addsal;
    
    
    ----------------------------------------------
    --java程式碼呼叫儲存過程和函式
    --儲存過程
    --
    create or replace procedure acc_yealsal(eno in emp.empno%type,yearsal out number) is
           pcomm emp.comm%type;
           psal emp.sal%type;
     begin
           select t.sal,t.comm into psal,pcomm from emp t where t.empno=eno;
           yearsal :=psal*12 +nvl(pcomm,0);
      end;
      
      ----儲存函式
          create or replace function 函式名(Name in type, Name in type, .. .)
            return 資料型別 is
            結果變數 資料型別;
          begin


            return(結果變數);
            end函式名;
          --儲存函式計算年薪
          create or replace function accf_yearsal(eno in emp.empno%type)
            return number is
            Result number;
            psal   emp.sal%type;
            pcomm  emp.comm%type;
          begin
            select t.sal, t.comm into psal, pcomm from emp t where t.empno = eno;
            Result := psal * 12 + nvl(pcomm, 0);
            return(Result);
          end accf_yearsal;
            


    -----------------------------------
    ---觸發器
    --觸發語句:增刪改:
    語法:
        CREATE  [or REPLACE] TRIGGER  觸發器名
           {BEFORE | AFTER}
           {DELETE | INSERT | UPDATE [OF 列名]}
           ON  表名
           [FOR EACH ROW [WHEN(條件) ] ]
        begin
           PLSQL 塊 
        End 觸發器名
        
        ---插入一個新員工則觸發
        create or replace trigger insert_person  
        after insert    on emp
        begin
          dbms_output.put_line('插入新員工');
        end;


    select *from emp;
    insert into emp values(1001,'李四','管理',7902,sysdate,100,100,20);
    
    
    --raise_application_error(-20001, '不能在非法時間插入員工')
    
   
    
    --==============================================================================
    SQL> @ E:\powerDesigner\A_指令碼\user.sql   --匯入指令碼檔案
    
    select *from H_USER ;
    
    insert into  h_user valuer(sequserid.nextval,'a','a',sysdate,'北京',1);
    
    
    --------------------------------------------------------------
    --資料庫建模
    --一對多:多的一端是2,箭頭指向的是表1,即少的一端
    --在實體類中一的一端的實體類有多的一端的實體類的集合屬性
    --使用powerDesiger進行資料庫建模,然後將資料匯入,匯入到plsql中進行使用
    
    
 --------------------連線遠端資料庫
 --方法1,修改localhost的地址
      ORCL =
        (DESCRIPTION =
          (ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 1521))
          (CONNECT_DATA =
            (SERVER = DEDICATED)
            (SERVICE_NAME = orcl.lan)
          )
        )
    --方法2
   --或者直接在登陸介面在database中輸入遠端資料庫的ip地址和埠號進行遠端登陸 
--------------------- 
作者:朱培 
來源:CSDN 
原文:https://blog.csdn.net/sdksdk0/article/details/51058519 
版權宣告:本文為博主原創文章,轉載請附上博文連結!