資料庫中序列、檢視、遊標、包、動態SQL的使用
阿新 • • 發佈:2018-12-26
序列
Oracle資料庫的表中是不能實現自增功能的,所以要通過序列來實現自增功能
--建立序列
create sequence seq_users
start with 1 --開始值為1
increment by 1;--每次增長一個(步長、頻次)
--使用序列
insert into users values(seq_users.nextval,'admin','123','男','[email protected]')
--刪除
drop sequence seq_users;
動態SQL
什麼是動態的SQL?
編譯期間SQL語句是不確定的,並且在執行時允許發生改變
動態SQL應用場合?
要執行一個DDL語句時
需要增加程式的靈活性時
使用包DBMS_SQL動態執行SQL語句時
動態SQL的執行:
PL/SQl動態SQL建立表:
begin
execute immediate 'create table test_demo (id number primary key,uname varchar2(20) not null)';
end;
測試程式碼:
PL/SQL動態SQL綜合應用例項:建立表,首先判斷該表是否存在,若存在先刪除再重新建立declare id_v number :=1; uname_v VARCHAR2(20) :='admin'; sql_v VARCHAR2(50); begin --佔位符 :1代表隊第幾個引數 sql_v :='insert into test_demo values (:1,:2)'; execute immediate sql_v using id_v, uname_v; dbms_output.put_line('操作成功'); end;
檢視--建立使用者表tem_user --判斷該表是否存在,若存在先刪除 set serveroutput on; declare num binary_integer; id_v number :=1001; uname_v VARCHAR2(20) :='孫悟空'; age NUMBER :=30; drop_sql VARCHAR2(100); insert_sql VARCHAR2(100); select_sql VARCHAR2(100); begin select count(*) into num from all_tables where table_name='tem_user' and owner='theme'; if num >=0 then drop_sql:='drop table tem_user'; EXECUTE IMMEDIATE drop_sql; end if; execute immediate 'create table tem_user (id number primary key,uname varchar2(20) not null,age number)'; insert_sql :='insert into tem_user values(:1,:2,:3)'; EXECUTE IMMEDIATE insert_sql using id_v,uname_v,age; COMMIT; dbms_output.put_line('新增成功!!'); EXCEPTION when OTHERS then ROLLBACK; dbms_output.put_line('新增失敗!'); end;
檢視的特點:
1.是一個數據庫中虛擬的表
2.經過查詢操作形成的結果
3.具有普通表的結構
4.不能實現資料的儲存
5.對檢視的修改將會影響實際的資料表
檢視的應用:
--新增檢視
create or replace view emp_dept_view
as select * from emp NATURAL JOIN dept;
--查詢
select * from emp_dept_view;
--刪除檢視
drop view emp_dept_view;
遊標
遊標用來處理從資料庫中檢索的多行記錄(使用select語句),利用遊標,程式可以逐個的處理和遍歷一次檢索返回的整個記錄集
遊標的分類
靜態遊標:結果集已經確定
隱式遊標:所有的DML語句為隱式遊標(不需要開啟和關閉遊標)
顯式遊標:使用者顯示宣告(需要開啟和關閉遊標open、close)
動態遊標。
遊標的應用:
遊標的屬性:
遊標的基本屬性:遍歷for和loop例項
set serveroutput on;
--查詢所有的員工資訊,並列印資訊(loop迴圈)
declare
CURSOR emp_info is select * from emp;--一組資料
emp_ emp%rowtype; --定義變數,一條資料
begin
open emp_info;
loop
fetch emp_info into emp_;--把遊標資料(結果集)放入到變數中
exit when emp_info%notfound;--當不存在下一條資料時就結束迴圈
dbms_output.put_line('員工編號;'||emp_.empno||'員工姓名:'||emp_.ename||'員工基本工資:'||emp_.sal);
end loop;
close emp_info;--關閉遊標
end;
--for迴圈
declare
cursor emp_info is select * from emp;
emp_ emp%rowtype;
begin
for emp_ in emp_info loop
dbms_output.put_line('員工編號是'||emp_.empno||',員工姓名是'||emp_.ename||',基本工資是'||emp_.sal);
end loop;
end;
遊標屬性isopen例項:--遊標基本屬性isopen
set serveroutput on;
declare
CURSOR emp_info is select * from emp;
emp_ emp%rowtype;
begin
if emp_info%isopen
then dbms_output.put_line('遊標已打開啟');
else
open emp_info;
end if;
loop
fetch emp_info into emp_;
exit when emp_info%notfound;
dbms_output.put_line('員工編號;'||emp_.empno||'員工姓名:'||emp_.ename||'員工基本工資:'||emp_.sal);
end loop;
close emp_info;
end;
遊標屬性rowcount例項:
--rowcount
set serveroutput on;
declare
CURSOR emp_info is select * from emp;
emp_ emp%rowtype;
begin
if emp_info%isopen -- 判斷遊標是否開啟
then dbms_output.put_line('遊標已開啟');
else
open emp_info;
end if;
loop
fetch emp_info into emp_;
exit when emp_info%notfound;
dbms_output.put_line(emp_.empno||'當前的行號'||emp_info%rowcount);
end loop;
close emp_info;
end;
遊標屬性while迴圈例項:set serveroutput on;
declare
CURSOR emp_info is select * from emp;
emp_ emp%rowtype;
begin
open emp_info;--開啟遊標
loop
fetch emp_info into emp_;
if emp_info%found
then dbms_output.put_line('--------');
else
exit;
end if;
end loop;
close emp_info;
end;
declare
cursor emp_info is select * from emp;
emp_ emp%rowtype;
begin
open emp_info;
fetch emp_info into emp_;--第一步獲取第一條資料
while emp_info%found loop
dbms_output.put_line('編號:'||emp_.empno);
fetch emp_info into emp_;--第二步,迴圈下一條資料
end loop;
close emp_info;
end;
Oracle資料庫中的包
什麼是包?
包是有儲存在一起的相關物件組成的PL/SQL結構
用於邏輯組合相關的自定義型別、變數、遊標、過程和函式
包的組成
包的規範(又稱包頭)
用於定義常量、變數、遊標、過程和函式等使用者與程式的介面
可以在包內引用,也可以被外部程式呼叫
包的主體
是包規範的實現,包括變數、遊標、過程和函式等
包體內的內容不能被外部應用程式呼叫
包的規範
create or replace package test_package
as
--宣告一個儲存過程
procedure add_emp_pro(emp_ in emp1%rowtype);
--宣告一個函式
function sum_(num1 number,num2 number)
return number;
end test_package;
包的主體部分:
create or replace package body test_package
as
PROCEDURE add_emp_pro(emp_ in emp1%rowtype)
as
begin
dbms_output.put_line('成功新增一條資料');
end;
--實現函式
function sum_func(num1 number,num2 number)
RETURN NUMBER
as
BEGIN
RETURN num1+ num2;
end;
end test_package;
包的呼叫:
declare
emp_ emp1%rowtype;
begin
emp_.empno:=9527;
emp_.ename:='老張';
test_package.add_emp_pro(emp_);
end;
begin
dbms_output.put_line('兩數之和是'||test_package.sum_func(3,5));
end;