共計 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 有哪些”這篇文章就分享到這里了,希望以上內容可以對大家有一定的幫助,使各位可以學到更多知識,如果覺得文章不錯,請把它分享出去讓更多的人看到。