您好,登錄后才能下訂單哦!
這篇文章將為大家詳細講解有關Oracle中SQL有哪些,小編覺得挺實用的,因此分享給大家做個參考,希望大家閱讀完這篇文章后可以有所收獲。
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) < 2;
END LOOP;
END;
set serveroutput on;
exec calc('19880323');
關于“Oracle中SQL有哪些”這篇文章就分享到這里了,希望以上內容可以對大家有一定的幫助,使各位可以學到更多知識,如果覺得文章不錯,請把它分享出去讓更多的人看到。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。