久久精品人人爽,华人av在线,亚洲性视频网站,欧美专区一二三

Oracle中SQL有哪些

210次閱讀
沒有評論

共計 10720 個字符,預計需要花費 27 分鐘才能閱讀完成。

這篇文章將為大家詳細講解有關 Oracle 中 SQL 有哪些,丸趣 TV 小編覺得挺實用的,因此分享給大家做個參考,希望大家閱讀完這篇文章后可以有所收獲。

100、————— 修改表結構,添加字段 ——————  

  alter table stu add(addr varchar2(29));  

 101、————— 刪除字段 ————————–  

  alter table stu drop (addr);  

 102、————— 修改表字段的長度 ——————  

  alter table  stu modify (addr varchar2(50));– 更改后的長度必須要能容納原先的數據  

 103、—————- 刪除約束條件 —————-  

  alter table stu drop constraint  約束名  

 104、———– 修改表結構添加約束條件 —————  

  alter table  stu add constraint stu_class_fk foreign key (class) references class (id);  

 105、————— 數據字典表 —————-  

  desc dictionary;  

  – 數據字典表共有兩個字段 table_name comments  

  –table_name 主要存放數據字典表的名字  

  –comments 主要是對這張數據字典表的描述  

   

 105、————— 查看當前用戶下面所有的表、視圖、約束 —– 數據字典表 user_tables—  

  select table_name from user_tables;  

  select view_name from user_views;  

  select constraint_name from user-constraints;  

 106、————- 索引 ——————  

  create index idx_stu_email on stu (email);– 在 stu 這張表的 email 字段上建立一個索引:idx_stu_email  

 107、———- 刪除索引 ——————  

  drop index index_stu_email;  

 108、——— 查看所有的索引 —————-  

  select index_name from user_indexes;  

 109、——— 創建視圖 ——————-  

  create view v$stu as selesct id,name,age from stu;  

  視圖的作用: 簡化查詢 保護我們的一些私有數據,通過視圖也可以用來更新數據,但是我們一般不這么用 缺點:要對視圖進行維護  

   

 110、———– 創建序列 ————  

  create sequence seq;– 創建序列  

  select seq.nextval from dual;– 查看 seq 序列的下一個值  

  drop sequence seq;– 刪除序列  

 111、———— 數據庫的三范式 ————–  

 (1)、要有主鍵,列不可分  

 (2)、不能存在部分依賴:當有多個字段聯合起來作為主鍵的時候,不是主鍵的字段不能部分依賴于主鍵中的某個字段  

 (3)、不能存在傳遞依賴    

 ==============================================PL/SQL==========================  

 112、——————- 在客戶端輸出 helloworld——————————-  

  set serveroutput on;– 默認是 off,設成 on 是讓 Oracle 可以在客戶端輸出數據  

 113、begin  

  dbms_output.put_line(helloworld  

  end;  

  /  

 114、—————-pl/sql 變量的賦值與輸出 —-  

  declare  

  v_name varchar2(20);– 聲明變量 v_name 變量的聲明以 v_開頭  

  begin  

  v_name := myname  

  dbms_output.put_line(v_name);  

  end;  

  /  

 115、———–pl/sql 對于異常的處理 (除數為 0)————-  

  declare  

  v_num number := 0;  

  begin  

  v_num := 2/v_num;  

  dbms_output.put_line(v_num);  

  exception  

  when others then  

  dbms_output.put_line(error  

  end;  

  /  

 116、———- 變量的聲明 ———-  

  binary_integer: 整數,主要用來計數而不是用來表示字段類型   比 number 效率高  

  number: 數字類型  

  char: 定長字符串  

  varchar2:變長字符串  

  date:日期  

  long:字符串,最長 2GB  

  boolean:布爾類型,可以取值 true,false,null– 最好給一初值  

 117、———- 變量的聲明,使用 %type 屬性  

  declare  

  v_empno number(4);  

  v_empno2 emp.empno%type;  

  v_empno3 v_empno2%type;  

  begin  

  dbms_output.put_line(Test  

  end;  

  /  

  – 使用 %type 屬性,可以使變量的聲明根據表字段的類型自動變換,省去了維護的麻煩,而且 %type 屬性,可以用于變量身上  

 118、—————Table 變量類型 (table 表示的是一個數組)——————-  

  declare  

  type type_table_emp_empno is table of emp.empno%type index by binary_integer;  

  v_empnos type_table type_table_empno;  

  begin  

  v_empnos(0) := 7345;  

  v_empnos(-1) :=9999;  

  dbms_output.put_line(v_empnos(-1));  

  end;  

 119、—————–Record 變量類型  

  declare  

  type type_record_dept is record  

  ( 

  deptno dept.deptno%type,  

  dname dept.dname%type,  

  loc dept.loc%type  

  );  

  begin  

  v_temp.deptno:=50;  

  v_temp.dname:= aaaa  

  v_temp.loc:= bj  

  dbms_output.put_line(v temp.deptno || || v temp.dname);  

  end;  

 120、———– 使用 %rowtype 聲明 record 變量  

  declare  

  v_temp dept%rowtype;  

  begin  

  v_temp.deptno:=50;  

  v_temp.dname:= aaaa  

  v_temp.loc:= bj  

  dbms_output.put_line(v temp.deptno || || v temp.dname)   

  end;  

   

 121、————–sql%count 統計上一條 sql 語句更新的記錄條數    

 122、————–sql 語句的運用  

  declare  

  v_ename emp.ename%type;  

  v_sal emp.sal%type;  

  begin  

  select ename,sal into v_ename,v_sal from emp where empno = 7369;  

  dbms_output.put_line(v_ename || || v_sal);  

  end;  

   

 123、  ——– pl/sql 語句的應用  

  declare  

  v_emp emp%rowtype;  

  begin  

  select * into v_emp from emp where empno=7369;  

  dbms_output_line(v_emp.ename);  

  end;  

 124、————-pl/sql 語句的應用    

  declare  

  v_deptno dept.deptno%type := 50;  

  v_dname dept.dname%type := aaa  

  v_loc dept.loc%type := bj  

  begin  

  insert into dept2 values(v_deptno,v_dname,v_loc);  

  commit;  

  end;  

 125、—————–ddl 語言,數據定義語言  

  begin  

  execute immediate create table T (nnn varchar(30) default a )  

  end;  

 126、——————if else 的運用  

  declare  

  v_sal emp.sal%type;  

  begin  

  select sal into v_sal from emp where empno = 7369;  

  if(v_sal 2000) then  

  dbms_output.put_line(low  

  elsif(v_sal 2000) then  

  dbms_output.put_line(middle  

  else   

  dbms_output.put_line(height  

  end if;  

  end;  

 127、——————- 循環 =====do while  

  declare  

  i binary_integer := 1;  

  begin  

  loop  

  dbms_output.put_line(i);  

  i := i + 1;  

  exit when (i =11);  

  end loop;  

  end;  

 128、———————while   

  declare  

  j binary_integer := 1;  

  begin  

  while j 11 loop  

  dbms_output.put_line(j);  

  j:=j+1;  

  end loop;  

  end;  

 129、———————for  

  begin  

  for k in 1..10 loop  

  dbms_output.put_line(k);  

  end loop;  

  for k in reverse 1..10 loop  

  dbms_output.put_line(k);  

  end loop;  

  end;  

 130、———————– 異常 (1)  

  declare  

  v_temp number(4);  

  begin  

  select empno into v_temp from emp where empno = 10;  

  exception  

  when too_many_rows then  

  dbms_output.put_line(太多記錄了  

  when others then  

  dbms_output.put_line(error    

  end;  

 131、———————– 異常 (2)  

  declare  

  v_temp number(4);  

  begin  

  select empno into v_temp from emp where empno = 2222;  

  exception  

  when no_data_found then  

  dbms_output.put_line(太多記錄了  

  end;  

 132、———————- 創建序列  

  create sequence seq_errorlog_id start with 1 increment by 1;  

 133、———————– 錯誤處理 (用表記錄:將系統日志存到數據庫便于以后查看)  

   

   

  — 創建日志表:  

  create table errorlog  

  ( 

  id number primary key,  

  errcode number,  

  errmsg varchar2(1024),  

  errdate date  

  );  

   

   

   

  declare  

  v_deptno dept.deptno%type := 10;  

  v_errcode  number;  

  v_errmsg varchar2(1024);  

  begin  

  delete from dept where deptno = v_deptno;  

  commit;  

  exception  

  when others then  

  rollback;  

  v_errcode := SQLCODE;  

  v_errmsg := SQLERRM;  

  insert into errorlog values (seq_errorlog_id.nextval, v_errcode,v_errmsg, sysdate);  

  commit;  

  end;  

 133———————PL/SQL 中的重點 cursor(游標) 和指針的概念差不多  

  declare  

  cursor c is  

  select * from emp; – 此處的語句不會立刻執行,而是當下面的 open c 的時候,才會真正執行  

  v_emp c%rowtype;  

  begin  

  open c;  

  fetch c into v_emp;  

  dbms_output.put_line(v_emp.ename); – 這樣會只輸出一條數據 134 將使用循環的方法輸出每一條記錄  

  close c;  

  end;  

 134———————- 使用 do while  循環遍歷游標中的每一個數據  

  declare  

  cursor c is  

  select * from emp;  

  v_emp c%rowtype;  

  begin  

  open c;   

  loop  

  fetch c into v_emp;  

  (1) exit when (c%notfound);  –notfound 是 oracle 中的關鍵字,作用是判斷是否還有下一條數據  

  (2) dbms_output.put_line(v_emp.ename);  –(1)(2) 的順序不能顛倒,最后一條數據,不會出錯,會把最后一條數據,再次的打印一遍  

  end loop;  

  close c;  

  end;  

 135————————while 循環,遍歷游標  

  declare  

  cursor c is  

  select * from emp;  

  v_emp emp%rowtype;  

  begin  

  open c;  

  fetch c into v_emp;  

  while(c%found) loop  

  dbms_output.put_line(v_emp.ename);  

  fetch c into v_emp;  

  end loop;  

  close c;  

  end;  

 136————————–for 循環,遍歷游標  

  declare  

  cursor c is  

  select * from emp;  

  begin  

  for v_emp in c loop  

  dbms_output.put_line(v_emp.ename);  

  end loop;  

  end;  

   

 137————————— 帶參數的游標  

  declare  

  cursor c(v_deptno emp.deptno%type, v_job emp.job%type)  

  is  

  select ename, sal from emp where deptno=v_deptno and job=v_job;  

  –v_temp c%rowtype; 此處不用聲明變量類型  

  begin  

  for v_temp in c(30, click) loop  

  dbms_output.put_line(v_temp.ename);  

  end loop;  

  end;  

 138—————————– 可更新的游標  

  declare  

  cursor c  – 有點小錯誤  

  is  

  select * from emp2 for update;  

  -v_temp c%rowtype;  

  begin  

  for v_temp in c loop  

  if(v_temp.sal 2000) then  

  update emp2 set sal = sal * 2 where current of c;  

  else if (v_temp.sal =5000) then  

  delete from emp2 where current of c;  

  end if;  

  end loop;  

  commit;  

  end;  

 139———————————–procedure 存儲過程 (帶有名字的程序塊)  

  create or replace procedure p  

  is– 這兩句除了替代 declare,下面的語句全部都一樣    

  cursor c is  

  select * from emp2 for update;  

  begin  

  for v_emp in c loop  

  if(v_emp.deptno = 10) then  

  update emp2 set sal = sal +10 where current of c;  

  else if(v_emp.deptno =20) then  

  update emp2 set sal =  sal + 20 where current of c;  

  else  

  update emp2 set sal = sal + 50 where current of c;  

  end if;  

  end loop;  

  commit;  

  end;  

   

  – 執行存儲過程的兩種方法: 

 (1)exec p;(p 是存儲過程的名稱)  

 (2) 

  begin  

  p;  

  end;  

  /  

 140——————————- 帶參數的存儲過程  

  create or replace procedure p  

  (v_a in number, v_b number, v_ret out number, v_temp in out number)  

  is  

   

  begin  

  if(v_a v_b) then  

  v_ret := v_a;  

  else  

  v_ret := v_b;  

  end if;  

  v_temp := v_temp + 1;  

  end;  

 141———————- 調用 140  

  declare  

  v_a  number := 3;  

  v_b  number := 4;  

  v_ret number;  

  v_temp number := 5;  

   

  begin  

  p(v_a, v_b, v_ret, v_temp);  

  dbms_output.put_line(v_ret);  

  dbms_output.put_line(v_temp);  

  end;  

   

 142—————— 刪除存儲過程  

  drop procedure p;  

 143———————— 創建函數計算個人所得稅    

  create or replace function sal_tax  

  (v_sal  number)   

  return number  

  is  

  begin  

  if(v_sal 2000) then  

  return 0.10;  

  elsif(v_sal 2750) then  

  return 0.15;  

  else  

  return 0.20;  

  end if;  

  end;  

 —-144————————- 創建觸發器(trigger)  觸發器不能單獨的存在,必須依附在某一張表上  

   

  – 創建觸發器的依附表  

   

  create table emp2_log  

  ( 

  ename varchar2(30) ,  

  eaction varchar2(20),  

  etime date  

  );   

   

  create or replace trigger trig  

  after insert or delete or update on emp2 —for each row 加上此句,每更新一行,觸發一次,不加入則值觸發一次  

  begin  

  if inserting then  

  insert into emp2_log values(USER, insert , sysdate);  

  elsif updating then  

  insert into emp2_log values(USER, update , sysdate);  

  elsif deleting then  

  insert into emp2_log values(USER, delete , sysdate);  

  end if;  

  end;  

 145——————————- 通過觸發器更新數據  

  create or replace trigger trig  

  after update on dept  

  for each row  

  begin  

  update emp set deptno =:NEW.deptno where deptno =: OLD.deptno;  

  end;  

   

   

  —— 只編譯不顯示的解決辦法 set serveroutput on;  

 145——————————- 通過創建存儲過程完成遞歸  

  create or replace procedure p(v_pid article.pid%type,v_level binary_integer) is  

  cursor c is select * from article where pid = v_pid;  

  v_preStr varchar2(1024) :=  

  begin  

  for i in 0..v_leave loop  

  v_preStr := v_preStr || ****  

  end loop;  

   

  for v_article in c loop  

  dbms_output.put_line(v_article.cont);  

  if(v_article.isleaf = 0) then  

  p(v_article.id);  

  end if;  

  end loop;  

   

  end;  

 146——————————- 查看當前用戶下有哪些表 —  

  – 首先,用這個用戶登錄然后使用語句: 

  select * from tab;  

   

 147—————————– 用 Oracle 進行分頁!————–  

  – 因為 Oracle 中的隱含字段 rownum 不支持 所以: 

  select * from ( 

  select rownum rn, t.* from ( 

  select * from t_user where user_id root  

  ) t where rownum 6  

  ) where rn 3  

 148————————Oracle 下面的清屏命令 —————-  

  clear screen; 或者 cle scr;  

   

 149———– 將創建好的 guohailong 的這個用戶的密碼改為 abc————–  

  alter user guohailong identified by abc  

  – 當密碼使用的是數字的時候可能會不行  

   

   

   

   

   

   

  – 使用在 10 Oracle 以上的正則表達式在 dual 表查詢

  with test1 as(

  select ao name from dual union all

  select yang from dual union all

  select feng from dual  )

  select distinct regexp_replace(name, [0-9] , ) from test1

   

 ——————————————

 with tab as (

  select hong   name from dual union all

  select qi name from dual union all

  select gong name from dual)

  select translate(name, \\0123456789 , \\) from tab;

 

   

   

   

   

   

   

 CREATE OR REPLACE PROCEDURE

  calc(i_birth VARCHAR2) IS

  s VARCHAR2(8);  

  o VARCHAR2(8);  

  PROCEDURE cc(num VARCHAR2, s OUT VARCHAR2) IS

  BEGIN

  FOR i

  IN REVERSE 2 .. length(num) LOOP

  s := s || substr(substr(num, i, 1) + substr(num, i – 1, 1), -1);

  END LOOP;

  SELECT REVERSE(s) INTO s FROM dual;

  END;

  BEGIN o := i_birth;

  LOOP

  cc(o, s);

  o := s;

  dbms_output.put_line(s);

  EXIT WHEN length(o)

  END LOOP;

  END;

  set serveroutput on;

   

  exec calc(19880323  

關于“Oracle 中 SQL 有哪些”這篇文章就分享到這里了,希望以上內容可以對大家有一定的幫助,使各位可以學到更多知識,如果覺得文章不錯,請把它分享出去讓更多的人看到。

正文完
 
丸趣
版權聲明:本站原創文章,由 丸趣 2023-07-19發表,共計10720字。
轉載說明:除特殊說明外本站除技術相關以外文章皆由網絡搜集發布,轉載請注明出處。
評論(沒有評論)
主站蜘蛛池模板: 苏州市| 隆尧县| 宁远县| 景东| 确山县| 苍溪县| 福建省| 五河县| 临澧县| 梁平县| 庆安县| 芦山县| 临汾市| 温泉县| 平武县| 文安县| 呈贡县| 珲春市| 平昌县| 南溪县| 郴州市| 天等县| 旬邑县| 阳泉市| 东辽县| 德阳市| 文成县| 黄浦区| 进贤县| 上犹县| 高邑县| 梅州市| 河南省| 滨州市| 土默特右旗| 资阳市| 和林格尔县| 通辽市| 普宁市| 格尔木市| 巴东县|