1. 程式人生 > >資料庫中序列、檢視、遊標、包、動態SQL的使用

資料庫中序列、檢視、遊標、包、動態SQL的使用

序列

  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;
測試程式碼:
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;
PL/SQL動態SQL綜合應用例項:建立表,首先判斷該表是否存在,若存在先刪除再重新建立
--建立使用者表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;