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

oracle pl/sql模板代碼怎么寫

157次閱讀
沒有評論

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

oracle pl/sql 模板代碼怎么寫,很多新手對此不是很清楚,為了幫助大家解決這個難題,下面丸趣 TV 小編將為大家詳細講解,有這方面需求的人可以來學習下,希望你能有所收獲。

select * from scott.emp;

==============for 循環 =======================

declare
  empno NUMBER(4,0);
 ename VARCHAR2(10 BYTE);
  sal NUMBER(7,2);
begin
  for REC in
  (select empno, ename, sal from scott.emp)
  loop
  begin
  empno := REC.empno;
  ename := REC.ename;
  sal := REC.sal;
  /*——————————— 寫入一條明細開始 ——————————*/
  if NVL(empno,0) 0 then
  begin
  dbms_output.put_line(記錄:|| empno || || ename || || sal);
  end;
  end if;
  /*——————————— 寫入一條明細開始 ——————————*/
  end;
  end loop;
end;
/

–=============== 帶參數的游標 ==================–
DECLARE
  dept_code emp.deptno%TYPE; – 聲明列類型變量三個
  emp_code  emp.empno%TYPE;
  emp_name  emp.ename%TYPE;
  CURSOR emp_cur(deptparam NUMBER) IS
  SELECT empno, ename FROM EMP WHERE deptno = deptparam; – 聲明顯示游標
BEGIN
  dept_code := 部門編號; – 請用戶輸入想查看的部門編號
  OPEN emp_cur(dept_code); – 打開游標
  LOOP
  – 死循環
  FETCH emp_cur
  INTO emp_code, emp_name; – 提取游標值賦給上面聲明的變量
  EXIT WHEN emp_cur%NOTFOUND; – 如果游標里沒有數據則退出循環
  DBMS_OUTPUT.PUT_LINE(emp_code || || emp_name); – 輸出查詢
  END LOOP;
  CLOSE emp_cur; – 關閉游標
END;

–=================REF 游標 ==================–

ACCEPT tab FROMPT 你想查看什么信息? 員工 (E) 或部門信息 (D): – 使用 ACCEPT 命令彈出對話框讓用戶輸入數據
DECLARE
  TYPE refcur_t IS REF CURSOR; – 聲明 REF 游標類型
  refcur  refcur_t; – 聲明 REF 游標類型的變量
  pid  NUMBER;
  p_name  VARCHAR2(100);
  selection VARCHAR2(1) := UPPER(SUBSTR( tab , 1, 1)); – 截取用戶輸入的字符串并轉換為大寫
BEGIN
  IF selection = E THEN
  – 如果輸入的是 E , 則打開 refcurr 游標, 并將員工表查詢出來賦值給此游標
  OPEN refcur FOR
  SELECT EMPNO ID, ENAME NAME FROM EMP;
  DBMS_OUTPUT.PUT_LINE(===== 員工信息 =====
  ELSIF selection = D THEN
  – 如果輸入是 D , 則打開部門表
  OPEN refcur FOR
  SELECT deptno id, dname name FROM DEPT;
  DBMS_OUTPUT.PUT_LINE(===== 部門信息 ======
  ELSE
  – 否則返回結束
  DBMS_OUTPUT.PUT_LINE(請輸入員工信息(E) 或部門信息(D)
  RETURN;
  END IF;
  FETCH refcur
  INTO pid, p_name; – 提取行
  WHILE refcur%FOUND LOOP
  DBMS_OUTPUT.PUT_LINE(# || pid || : || p_name);
  FETCH refcur
  INTO pid, p_name;
  END LOOP;
  CLOSE refcur; – 關閉游標
END;

–=================== 動態 SQL=================–
VARIABLE maxsal NUMBER; – 聲明變量
EXECUTE :maxsal := 2500; – 執行引用并給變量賦值
DECLARE
  r_emp EMP%ROWTYPE; – 聲明一個行類型變量
  TYPE c_type IS REF CURSOR; – 聲明 REF 游標類型
  cur  c_type; – 聲明 REF 游標類型的變量
  p_salary NUMBER; – 聲明一個標量變量
BEGIN
  p_salary := :maxsal; – 引用變量
  – 使用 USING 語句將引用到的值傳給動態 SQL 語句 SAL : 1 中的 1
  OPEN cur FOR SELECT * FROM EMP WHERE SAL : 1 ORDER BY SAL DESC
  USING p_salary;
  DBMS_OUTPUT.PUT_LINE(薪水大于 || p_salary || 的員工有:
  LOOP
  FETCH cur
  INTO r_emp;
  EXIT WHEN cur%NOTFOUND;
  DBMS_OUTPUT.PUT_LINE(編號: || r_emp.empno || 姓名: || r_emp.ename ||
  薪水: || r_emp.sal);
  END LOOP;
  CLOSE cur; – 關閉游標
END;

— 例子:
CREATE OR REPLACE PROCEDURE x_ne_change
AS
  CURSOR cur_new
  IS
  SELECT int_id, omc_id || : || msc_id || : || bsc_id AS related_id,
  omc_id, msc_id, bsc_id, ne_name, cell_id, lac, freq_band,
  trx_count, tch, sdcch, gprs_enabled, gprs_trx, dedicated_pdch,
  max_pdch, device_type, software_version, dumpfre_type, site_no,
  cell_no, rac, ncc, bcc, sms_cb_used, bsc_omc_int_id, omc_int_id,
  TIMESTAMP
  FROM appuser.K_C_CELL
  WHERE TIMESTAMP = 2004-04-23 8 AND cell_id 2000;

  CURSOR cur_old (c_no NUMBER)
  IS
  SELECT int_id, omc_id || : || msc_id || : || bsc_id AS related_id,
  omc_id, msc_id, bsc_id, ne_name, cell_id, lac, freq_band,
  trx_count, tch, sdcch, gprs_enabled, gprs_trx, dedicated_pdch,
  max_pdch, device_type, software_version, dumpfre_type, site_no,
  cell_no, rac, ncc, bcc, sms_cb_used, bsc_omc_int_id, omc_int_id,
  TIMESTAMP
  FROM appuser.K_C_CELL
  WHERE TIMESTAMP = 2004-04-21 6 AND cell_id = c_no;
BEGIN
  FOR v_new IN cur_new
  LOOP
  FOR v_old IN cur_old (v_new.cell_id)
  LOOP
  BEGIN
  IF v_new.related_id ; v_old.related_id
  THEN
  INSERT INTO TEST_NE_CHANGE
  (omc_id, omc_int_id, ne_id,
  old_value, now_value,
  modify_item, modify_time
  )
  VALUES (v_new.omc_id, v_new.omc_int_id, v_new.cell_id,
  v_old.related_id, v_new.related_id,
  related_id , v_new.TIMESTAMP
  );

  COMMIT;
  END IF;

  IF v_new.tch ; v_old.tch
  THEN
  INSERT INTO TEST_NE_CHANGE
  (omc_id, omc_int_id, ne_id,
  old_value, now_value, modify_item, modify_time
  )
  VALUES (v_new.omc_id, v_new.omc_int_id, v_new.cell_id,
  v_old.tch, v_new.tch, TCH , v_new.TIMESTAMP
  );

  COMMIT;
  END IF;
  END;
  END LOOP;
  END LOOP;
END;

— 多行數據提取
declare
 cursor cur_tsalary is
  select employeeid,positionid from tsalary whererownum
 type rec_tsalary isrecord(
 employeeid tsalary.employeeid%type,
 positionid tsalary.positionid%type);
 type all_rec_tsalary_type istableof rec_tsalary;
 all_rec_tsalary all_rec_tsalary_type;
begin
 – 一次處理所有
  fetch cur_tsalary bulkcollectinto all_rec_tsalary limit5;
  for i in1..all_rec_tsalary.countloop  dbms_output.put_line(all_rec_tsalary(i).employeeid||all_rec_tsalary(i).positionid);
  endloop;
– 使用 limit 分批提出大量數據
 open cur_tsalary;
 loop
  fetch cur_tsalary bulkcollectinto all_rec_tsalary limit5;
  for i in1..all_rec_tsalary.countloop  dbms_output.put_line(all_rec_tsalary(i).employeeid||all_rec_tsalary(i).positionid);
  endloop;
  exitwhen cur_tsalary%notfound;
 endloop;
 close cur_tsalary;
end;

 — 例六:%NotFound
 
 BEGIN
  DELETE  FROM  Rs_Employees
  Where  HeTongId = WL-090001
 
  if  sql % Notfound  then
  Dbms_Output.put_line(沒有找到要刪除的記錄
  else
  Dbms_Output.put_line(已刪除記錄
  end  if ;

 END ;
 
 
 
 — 例七:%RowCount,查詢記錄行數
 Declare
  v_name Rs_Employees.Name % type;
 BEGIN
  SELECT  Name  Into  v_Name
  FROM  Rs_Employees
  Where  HeTongId = WL-090010
 
  if  sql % RowCount  0  Then
  Dbms_Output.put_line(已從表中選擇行,Name 為:|| v_Name);
  else
  Dbms_Output.put_line(從表中未選擇行
  end  if ;

 END ;
 
 — 再演示以下代碼
 BEGIN
  DELETE  FROM  Rs_Employees
  Where  HeTongId = WL-090010
 
  Dbms_Output.put_line(已從表中刪除 || To_Char(sql % RowCount) || 條記錄
 END ; 
 
 
 
 — 例八:顯式游標
— 以下示例在所有游標的記錄中的 Name 字段中加一字串
— 同時在此示范了如何使用 %NotFound 屬性
— set serveroutput on;
 Declare
  v_Id  Rs_Employees.Hetongid % type;
  v_name  Rs_Employees.Name % type;
  v_Count  Number : = 0 ;
 
  Cursor  MyCur  Is
  SELECT  HetongId,Name  FROM  Rs_Employees
  Where  HeTongId = WL-090010
 
 BEGIN
  — 打開游標  
  Open  MyCur;
  — 進入循環
  Loop
  Fetch  MyCur  Into  v_id,v_name;
  Exit  When  MyCur % NotFound;
 
  Update  Rs_Employees
  Set  Name  =  Name  ||  X
  Where  HeTongId = v_Id;
  v_Count : =  v_Count  +  1 ;
  End  Loop;
 
  Dbms_Output.put_line(已更新 || v_Count || 行
 END ;

 — 例 10:以下示范 %RowCount 和 %IsOpen,同時示范了 %RowType 的使用
— 例 10:以下示例 %RowCount
 Declare
  v_Row  Rs_Employees % RowType;
 
  Cursor  MyCur  Is
  SELECT  *  FROM  Rs_Employees
  Where  HeTongId = WL-090010
 BEGIN
  if  Not  MyCur % IsOpen  then
  Dbms_Output.put_line(游標未打開
  — 打開游標  
  Open  MyCur;
  end  if ;

  — 進入循環
  Loop
  Fetch  MyCur  Into  v_row;
  Exit  When  MyCur % NotFound;
 
  Dbms_Output.put_line(當前已取得 || MyCur % RowCount || 行
  Dbms_Output.put_line(姓名:|| v_row.Name ||   || 合同號:|| v_row.HeTongId);
  Dbms_Output.put_line(
  End  Loop;
 
  Dbms_Output.put_line(總共已取得 || MyCur % RowCount || 行
 
  if  MyCur % IsOpen  then
  Dbms_Output.put_line(游標已打開
  Close  MyCur;
  end  if ;

  if  Not  MyCur % IsOpen  then
  Dbms_Output.put_line(游標已關閉
  end  if ;
 
 END ;

 — 例 12:查詢嵌套表中數據的游標
— 1 創建類型
  CREATE  OR  REPLACE  TYPE emp_type  As  Object
  (eno  number ,
  ename  varchar2 (20),
  esal  number );
 — 2 使用 Table of 子句創建 Table 類型
  CREATE  TYPE emp_nt  AS  Table  Of  emp_type;
 — 3 使用 emp_nt 數據類型創建 myemp 表
  CREATE  TABLE  myemp
  (deptno  number ,
  edet  emp_nt)
  NESTED  TABLE  edet Store  As  myemployee;
 — 4 初始化 myemp 的數據
  Insert  Into  myemp  values
  (10 ,emp_nt(emp_type( 1000 , James ,  10000),
  emp_type(1001 , Daniel , 20000)));
  Commit ;
 
 — 執行下列代碼  
 Declare
  sal  number ;
  ena  varchar2 (20);
 
  Cursor  MyCur  Is
  SELECT  a.esal,a.ename
  FROM  the
  (Select  edet  From  myemp
  Where  deptno = 10 ) a;
 BEGIN
  — 打開游標  
  Open  MyCur;
  — 進入循環
  Loop
  Fetch  MyCur  Into  sal,ena;
  Exit  When  MyCur % NotFound;
  Dbms_Output.put_line(ena ||   || sal);
  End  Loop;
 
  Close  MyCur;
 END ;

 — 例 13:此例改自例 10,示范循環游標的用法
 Declare
  Cursor  MyCur  Is
  SELECT  *  FROM  Rs_Employees
  Where  HeTongId = WL-090010
 BEGIN
 
  For  tmp_cur  In  MyCur
  Loop
  Dbms_Output.put_line(當前已取得 || MyCur % RowCount || 行
  Dbms_Output.put_line(姓名:|| tmp_cur.Name ||   || 合同號:|| tmp_cur.HeTongId);
  End  Loop;

  — 在這種情況下,下面這條語句不能執行
  — Dbms_Output.put_line(當前已取得 ||MyCur%RowCount|| 行
 END ;

 — 再示范帶參數的游標
 Declare
  Cursor  MyCur(m_HeTongId Rs_Employees.Hetongid % type)  Is
  SELECT  *  FROM  Rs_Employees
  Where  HeTongId = m_HeTongId;
 BEGIN
 
  For  tmp_cur  In  MyCur(WL-090020)
  Loop
  Dbms_Output.put_line(當前已取得 || MyCur % RowCount || 行
  Dbms_Output.put_line(姓名:|| tmp_cur.Name ||   || 合同號:|| tmp_cur.HeTongId);
  End  Loop;

  — 在這種情況下,下面這條語句不能執行
  — Dbms_Output.put_line(當前已取得 ||MyCur%RowCount|| 行
 END ;

 — 再示范以下寫法
— 在循環游標中使用查詢
 Declare
  v_HeTongId  Rs_Employees.Hetongid % type;
 BEGIN
  v_HeTongId : =  WL-090020
 
  For  tmp_cur  In  (SELECT  *  FROM  Rs_Employees
  Where  HeTongId = v_HeTongId)
  Loop
  Dbms_Output.put_line(姓名:|| tmp_cur.Name ||   || 合同號:|| tmp_cur.HeTongId);
  End  Loop;
 END ;

 — 例 15:示范游標變量
— 此例要在 Command window 或 Sql Plus 中示范,結果會有點區別
— SET SERVEROUTPUT ON;
 Declare
  TYPE r1_cur  IS  REF  CURSOR ;
  var1 r1_cur;
  no  varchar2 (20);
 
  v_czy  sc_chukudan.czy % type;
  v_pid  sc_chukudanDetail.Productid % type;
 
 BEGIN
  no : =  你選擇的

  IF  UPPER (no)  =  MASTER   then
  OPEN  var1  For
  Select  Czy  FROM  sc_chukudan
  Where  ChuKuDanId  =  SCKD04020001
  FETCH  var1  into  v_Czy;
  Dbms_Output.put_line(操作員是:|| v_czy);
  CLOSE  var1;
  ELSE
  OPEN  var1  For
  Select  Productid  FROM  sc_chukudanDetail
  Where  ChuKuDanId  =  SCKD04020001
  LOOP
  FETCH  var1  into  v_pid;
  EXIT  WHEN  var1 % NotFound;
  Dbms_Output.put_line(生產通知單 ID 是:|| v_pid);
  END  LOOP;
  CLOSE  var1;
  END  IF ; 
 END ;

 — 例 16: 游標中的更新和刪除
— 此例改自例 8
 Declare
  — 當打開此游標,將鎖住了相關記錄
  Cursor  MyCur  Is
  SELECT  Name  FROM  Rs_Employees
  Where  HeTongId = WL-090010
  For  Update  OF  Name;
 
 BEGIN
  For  tmp_cur  in  MyCur
  Loop
  Update  Rs_Employees
  Set  Name  =  Name  ||  X
  Where  Current  of  MyCur;
  End  Loop;
 END ;
 
 
 — 示例一:Create Table 命令,區別較小
 Create  Table  vendor_master
(
 vencode  varchar2 (5),
 venname  varchar2 (20),
 venadd1  varchar2 (20),
 venadd2  varchar2 (20),
 venadd3  varchar2 (20)
 )
 
 — 示例二:Alter Table Modify 命令,區別較大
 Alter  Table  vendor_master Modify (venname  varchar2 ( 25))

 — 示例三:Alter Table Add 命令,區別較小,主要是數據類型
 Alter  Table  vendor_master
  add  (tel_no  number ( 12),
  tngst_no  number (12))
 
 — 示例四:Drop Column 命令:完全一樣
 Alter  Table  vendor_master  Drop  Column  tngst_no

 — 示例五:Oracle 獨有
 alter  Table  vendor_master  set  unused(tel_no)

 — 示例六:Truncate Table 命令:完全一樣
 truncate  table  vendor_master

 — 示例八:Desc 命令:完全不一樣
 Desc  vendor_master

 — 示例九:Drop Table 命令:完全一樣
 drop  table  vendor_master

 — 示例 10:Insert 命令
 Insert  into  vendor_master  values  (v001 , John smith , 11 E main st , West Avenue , alabama , 1234567)

 — 以下這種方法只在 Orace 中有效,l 但不推薦使用此方法
 Insert  into  vendor_master  values  (vencode , venname , venadd1 , venadd2 , venadd3 , telno)

 — 示例 15:Select 命令
 select  *  from  vendor_master

 — 示例 20:Update 命令:注意大小寫
 update  vendor_master  set  tel_no  =  987654  where  vencode = V001   —  v001
 
 
 — 示例 24:Grant 和 Revoke 命令
 grant  all  on  vendor_master  to  sys
 revoke  all  on  vendor_master  from  sys

 **********************************************************************************************
 // 用戶

connect system / manager @ydgl ;

 — 刪除已有的用戶和表空間
 
 — drop tablespace freemandatabase;
— drop tablespace tempfreemandatabase;
 
 — 創建表空間
 create  tablespace FreeManDataBase
datafile  c:/FreeManDataBase.ora
size 25M;

 — 創建臨時表空間
 create  temporary  tablespace tempFreeManDataBase
tempfile  c:/tempFreeManDataBase.ora
size 25M;

 — 創建用戶
 create  user  zong identified  by  123456
 default  tablespace FreeManDataBase
 temporary  tablespace tempFreeManDataBase;

 — 賦權限
 grant  connect  to  zong;
 grant  resource  to  zong;
 grant  dba  to  aaa;

 — 登錄
 connect zong / 123456 @ydgl ;

 create  table  zong.ccc(bh  varchar2 ( 10), xm  varchar2 (10), age  number , salary  number , birthday date)
  — 事務處理  
  insert  into  zong.ccc(bh,xm,age,salary,birthday)  values  (000 , aaa , 56 , 12345 ,to_date( 1978-1-1 , yyyy-mm-dd));
  insert  into  zong.ccc(bh,xm,age,salary,birthday)  values (004 , peng , 24 , 3456.3 ,to_date( 1976-1-1 , yyyy-mm-dd));
  savepoint ppp;
  insert  into  zong.ccc(bh,xm,age,salary,birthday)  values (005 , cao , 21 , 345.3 ,to_date( 1996-1-1 , yyyy-mm-dd));
  rollback  to  ppp;
  insert  into  zong.ccc(bh,xm,age,salary,birthday)  values (006 , li , 28 , 31456.3 ,to_date( 1966-1-1 , yyyy-mm-dd));
  update  zong.ccc  set  bh = 008   ,salary = 5000 ,age = 33  where  bh = 004
  commit  ;
 —  清除數據
  truncate  table  zong.cc
  delete  from  zong.ccc  where  bh = 006
 
 
  create  table  zong.firsttable (xm  varchar2 ( 10),age  number (4),salary  number (7 , 2))
  — 添加列
  alter  table  zong.firsttable  add  (kk  number ( 10), birthday date)
  — 更新列類型
  alter  table  zong.firsttable modify (xm  number ( 2), birthday  varchar2 (10))
 
  — 收回權限
  revoke  dba  from  zong
  — 授予管理員角色
  grant  dba  to  zong
 
  — 授予對象權限
  grant  select  , update  on  firsttable  to  system
 
  — 刪除表
  drop  table  zong.ccc
 
 

 — 集合操作
 Create  Table  zong.YYY(xm  Varchar2 ( 10),age  Number (8));
 Insert  Into  zong.yyy  Values (aaa , 10)
 Insert  Into  zong.yyy  Values (bbb , 20)

 Create  Table  zong.xxx(xm  Varchar2 ( 10),age  Number (8));
 Insert  Into  zong.xxx  Values (aaa , 10)
 Insert  Into  zong.xxx  Values (ccc , 30)

 Select  *  From  zong.yyy  Union  Select  *  From  fei.xxx

 Select  *  From  zong.yyy  Union  All  Select  *  From  fei.xxx

 Select  *  From  zong.yyy  Intersect  Select  *  From  fei.xxx

 Select  *  From  zong.yyy Minus  Select  *  From  fei.xxx
 
  *********************************************
 **********************************************
 — 字符串函數
  select  ascii (A) A, ascii (a) a, ascii (0) zero, ascii ( )  space  from  dual
 
  select  chr(54740) zhao,chr(65) chr65  from  dual
 
  select  concat(010- , 88888888) || 連接   實例   from  dual
 
  select  initcap(smith) upp  from  dual;
 
  select  instr(oracle traning , ra , 1 , 2) instring  from  dual
 
  select  lpad(rpad( gao , 10 , *), 17 , * ) from  dual;
 
  select  ltrim (rtrim ( gao qian jing  ,  ),   )  from  dual;
 
  select  substr(13088888888 , 3 , 8)  from  dual;
  select  replace (he love you , he , i)  from  dual;
 
 
  — 數學函數
  select  floor (2345.67)  from  dual;
  select  mod(10 , 3),mod(3 , 3),mod(2 , 3)  from  dual;
  select  round (55.5), round (– 55.4),trunc(55.5),trunc(– 55.5)  from  dual;
  select  sign (123), sign (– 100), sign (0)  from  dual;
 
 
  — 日期函數
  select  to_char(add_months(to_date( 199912 , yyyymm), 2 ), yyyymm )  from  dual;
  select  to_char(sysdate, yyyy.mm.dd),to_char((sysdate) + 1 , yyyy.mm.dd )  from  dual;
  select  last_day(sysdate)  from  dual;
 
  select  months_between(19-12 月 -1999 , 19- 3 月 -1999) mon_between  from  dual;
  select  months_between(to_date( 2000.05.20 , yyyy.mm.dd),to_date(2005.05.20 , yyyy.mm.dd)) mon_betw  from  dual;
 
  select  to_char(sysdate, yyyy.mm.dd hh34:mi:ss) 北京時間,to_char(new_time
  (sysdate, PDT , GMT), yyyy.mm.dd hh34:mi:ss ) 埃及時間   from  dual;
 
  select  next_day(18- 5 月 -2001 , 星期五) next_day  from  dual;
  //
  select  round (sysdate, year)  from  ccc;
 
  select  to_char(sysdate, dd-mm-yyyy day)  from  dual;
  select  *  from  ccc  where  birthday – to_date(1977-11-11 , yyyy-mm-dd) 120 ;
  select  *  from  ccc  where  birthday – to_date(1977-11-11 , yyyy-mm-dd) 30 ;
  select  *  from  ccc  where  birthday to_date(1977-11-11 , yyyy-mm-dd
 
 
  select  to_char(t.d, YY-MM-DD)  from  (
 select  trunc(sysdate,  MM) + rownum – 1  as  d
 from  dba_objects
 where  rownum    32 ) t
 where  to_char(t.d,  MM)  =  to_char(sysdate,  MM)  — 找出當前月份的周五的日期
 and  trim(to_char(t.d,  Day))  =  星期五  

 — 類型轉換函數
 select  to_char(sysdate, yyyy/mm/dd hh34:mi:ss)  from  dual;

 select  to_number(1999)  year  from  dual;

 — 系統函數
 select  username, user_id  from  dba_users  where  user_id = uid;
 select  user  from  dual;

 — 集合函數
  create  table  table3(xm  varchar ( 8),sal  number (7 , 2));
  insert  into  table3  values (gao , 1111.11);
  insert  into  table3  values (gao , 1111.11);
  insert  into  table3  values (zhu , 5555.55);
 
  — select avg(distinct sal) from gao.table3;
  — select max(distinct sal) from scott.emp;
 
 
 — 分組函數和統計函數  
  select  deptno, count (*), sum (sal)  from  scott.emp  group  by  deptno;
  select  deptno, count (*), sum (sal)  from  scott.emp  group  by  deptno  having  count (*) = 5 ;
  select  deptno, count (*), sum (sal)  from  scott.emp  having  count (*) = 5  group  by  deptno ;
  select  deptno,ename,sal  from  scott.emp  order  by  deptno,sal  desc ;

 **********************************************************************************************
  CREATE  TABLE  ZONG . CCC (BH   VARCHAR2 ( 10), XM   VARCHAR2 (10), AGE   NUMBER , SALARY   NUMBER , BIRTHDAY DATE)

  insert  into  zong.ccc(bh,xm,age,salary,birthday)  values  (000 , aaa , 56 , 12345 ,to_date( 1978-1-1 , yyyy-mm-dd));
 
  insert  into  zong.ccc(bh,xm,age,salary,birthday)  values  (001 , null , 33 , 4444 ,to_date( 1979-1-1 , yyyy-mm-dd));
 
  insert  into  zong.ccc(bh,xm,age,salary,birthday)  values (004 , peng , 24 , 3456.3 ,to_date( 1976-1-1 , yyyy-mm-dd));
 
  insert  into  zong.ccc(bh,xm,age,salary,birthday)  values (005 , cao , 21 , 345.3 ,to_date( 1996-1-1 , yyyy-mm-dd));
 
  insert  into  zong.ccc(bh,xm,age,salary,birthday)  values (006 , li , 28 , 31456.3 ,to_date( 1966-1-1 , yyyy-mm-dd));
 
  select  bh 編號, nvl(xm, ggg)  as  姓名   from  ccc  where  bh = 001
 
  select  bh 編號,  nvl2(xm, yes , no)  as  姓名   from  ccc
 
  — select bh 編號,NULLIF(bbb , aaa) from ccc
 
  — is null 的用法
 
  select  *  from  ccc  where  xm  is  null
  select  *  from  ccc  where  xm  is  NOT  null
 
  — not in 的用法
 
  select  *  from  ccc  where  birthday  between  to_date(1978-1-1 , yyyy-mm-dd)  and  to_date(1996-1-1 , yyyy-mm-dd)
  select  *  from  ccc  where  birthday  not  between  to_date(1978-1-1 , yyyy-mm-dd)  and  to_date(1996-1-1 , yyyy-mm-dd)
 
  —  in 的用法
  select  *  from  ccc  where  xm  in (aaa , peng , cao)
  select  *  from  ccc  where  xm  not  in (aaa , peng , cao)
 
  — like 的用法和 =、!=、、、=、= 的用法
 
  select  *  from  ccc  where  age 24  and  age  = 56  and  xm  like  %a%
 
 
 
 
 
  —
  create  table  sales (xm  varchar2 ( 10), dTime date,  count  number , totalmoney  number ,city  varchar2 (10))
 
  insert  into  sales  values (張三 ,to_date( 2003-01-01 , yyyy-mm-dd), 1200 , 30000 , 南昌
  insert  into  sales  values (張三 ,to_date( 2004-01-01 , yyyy-mm-dd), 1200 , 30000 , 南昌
  insert  into  sales  values (張三 ,to_date( 2003-01-01 , yyyy-mm-dd), 1000 , 30000 , 北京
  insert  into  sales  values (張三 ,to_date( 2004-01-01 , yyyy-mm-dd), 2333 , 40000 , 北京
 
  insert  into  sales  values (李四 ,to_date( 2003-01-01 , yyyy-mm-dd), 800 , 24567 , 南昌
  insert  into  sales  values (李四 ,to_date( 2004-01-01 , yyyy-mm-dd), 600 , 15000 , 南昌
  insert  into  sales  values (李四 ,to_date( 2003-01-01 , yyyy-mm-dd), 400 , 20000 , 北京
  insert  into  sales  values (李四 ,to_date( 2004-01-01 , yyyy-mm-dd), 1000 , 18000 , 北京
 
  select  xm, sum (count) 數量, sum (totalmoney) 金額 ,city  from  sales  group  by  xm , count  ,totalmoney,rollup(city)  order  by  xm , count  ,totalmoney,city
 
  — group 分組語句
  select  xm, sum (count) 數量, sum (totalmoney) 金額 ,city  from  sales  group  by  xm , count  ,totalmoney,rollup(city)  having  count 2000  order  by  xm , count  ,totalmoney,city
 
  — rollup 函數
  select  xm,  sum (count) 數量,city  from  sales  group  by  xm , count  ,rollup(city)  order  by  xm , count  ,city
 
 
 
  — 事務級臨時表是指臨時表中的數據只在事務生命周期中存在。當一個事務結束(commit or rollback),Oracle 自動清除臨時表中數據
  CREATE  GLOBAL  TEMPORARY  TABLE  admin_work_area
  (startdate DATE,
  enddate DATE,
  class  CHAR (20))
  ON  COMMIT  DELETE  ROWS;
  create  table  permernate(a  number);
  insert  into  admin_work_area  values (sysdate,sysdate, temperary table
 
  insert  into  permernate  values (1);
  commit ;
  select  *  from  admin_work_area;
  select  *  from  permernate;

 — 會話級臨時表是指臨時表中的數據只在會話生命周期之中存在,當用戶退出會話結束的時候,Oracle 自動清除臨時表中數據
 
  drop  table  admin_work_area;
  CREATE  GLOBAL  TEMPORARY  TABLE  admin_work_area
  (startdate DATE,
  enddate DATE,
  class  CHAR (20))
  ON  COMMIT  PRESERVE  ROWS;
  create  table  permernate(a  number);
  insert  into  admin_work_area  values (sysdate,sysdate, temperary table
 
  insert  into  permernate  values (2);
  commit ;
  select  *  from  admin_work_area;
  select  *  from  permernate;

 **********************************************************************************************
 // 鎖

  create  table  sales (xm  varchar2 ( 10), dTime date,  count  number , totalmoney  number ,city  varchar2 (10))
 
  insert  into  sales  values (張三 ,to_date( 2003-01-01 , yyyy-mm-dd), 1200 , 30000 , 南昌
  insert  into  sales  values (張三 ,to_date( 2004-01-01 , yyyy-mm-dd), 1200 , 30000 , 南昌
  insert  into  sales  values (張三 ,to_date( 2003-01-01 , yyyy-mm-dd), 1000 , 30000 , 北京
  insert  into  sales  values (張三 ,to_date( 2004-01-01 , yyyy-mm-dd), 2333 , 40000 , 北京
 
  insert  into  sales  values (李四 ,to_date( 2003-01-01 , yyyy-mm-dd), 800 , 24567 , 南昌
  insert  into  sales  values (李四 ,to_date( 2004-01-01 , yyyy-mm-dd), 600 , 15000 , 南昌
  insert  into  sales  values (李四 ,to_date( 2003-01-01 , yyyy-mm-dd), 400 , 20000 , 北京
  insert  into  sales  values (李四 ,to_date( 2004-01-01 , yyyy-mm-dd), 1000 , 18000 , 北京
 
 
 
 
  select  *  from  sales  where  xm = 張三   for  update  of  count
 
  update  sales  set  count = 30000  where  xm = 張三
 
 
  — 另一用戶登錄
  update  ydgl.sales  set  count = 30000  where  xm = 張三
 
 
  — 在多個用戶在同一張表中放置鎖時, 其他用戶等待上一用戶的時間.
  select  *  from  sales  where  xm = 張三   for  update  of  count  wait  10 
 
 
 
 
  — 只作查詢
  lock  table  sales  in  share  mode
 
 
  — 能刪除, 更新, 插入除鎖定外的其他行
 
  lock  table  sales  in  share  update  mode
 
 
  — 排他鎖 , 在同一時間點上, 只有一個用戶在表中放置排他鎖.
  lock  table  sales  in  exclusive  mode
 
  — 避免延遲時間, 鎖在用戶之間的傳遞時間, 不等待, 立即提示錯誤信息
  lock  table  sales  in  exclusive  mode nowait
  **********************************************************************************************
 — – 創建臨時表  
  /**/ /* create temporary tablespace mydb
tempfile f:/mydb.ora
size 10m; */
 
 — – 創建抽象數據類型
 create  or  replace  type address_ty  as  object
(street_no  number ( 3),
street_name  varchar2 (20),
city  varchar2 (20),
state  varchar2 (20));

 — – 查看抽象數據類型實際值
 select  attr_name,length,attr_type_name
 from  user_type_attrs
 where  type_name = ADDRESS_TY

 — – 創建應用了抽象數據類型的表
 create  table  vend_mast
(vencode  varchar2 ( 5),
venname  varchar2 (15),
venadd address_ty,
tel_no  number (10));

 — – 查看表結構
 desc  vend_mast;

 select  column_name,data_type  from  user_tab_columns  where
  table_name = VEND_MAST
 
 — – 插入記錄
 insert  into  vend_mast  values
(v100 , john ,address_ty( 110 , Clinton Rd ,
  Rosewood , Columbia , 234465987 );

 — – 查看記錄
 select  a.venadd.city  from  vend mast a;

 — - 修改記錄, 一定要用別名
 update  vend_mast a
  set  a.venadd.street_no = 10
  where  venname = john
 
 — – 刪除記錄  
 delete  from  vend_mast a
 where  a.venadd.city = Rosewood

 — – 強行刪除抽象數據類型
 drop  type address_ty force;

 — – 創建應用了抽象數據類型的表的索引
 create  index  streetnum  on  vend_mast(venadd.street_no);

 — – 查看索引
 select  owner,index_name,index_type,table_owner,table_name,table_type
 from  all_indexes
 where  owner = SCOTT

 — – 創建不能繼承的對象
 create  or  replace  type Student_typ  as  object
(Ssn  number ,
Name  varchar2 (30),
Address  varchar2 (100)) not  final;

 — – 修改是否能繼承
 alter  type Student_typ  not  final;

 create  type t  as  object
(x  number ,)
 not  instantiable member  function  func1  return  number )
 not  instantiable  not  final;

 — – 創建可變數組
 create  type itemcode  as  varray(5)  of  varchar2 (5);

 create  type qty_ord  as  varray(5)  of  number (5);

 create  type qty_deld  as  varray(5)  of  number (5);

 — – 基于可變數組創建表
 create  table  order_detail(
  orderno  varchar2 (5),
  item_va itemcode,
  qty_va qty_ord,
  qtyd_va qty_deld);

 — – 插入記錄
 insert  into  order_detail
  values (o100 ,itemcode( i100 , i101 , i102 , i103 , i104),
  qty_ord(100 , 98 , 47 , 29 , 20),
  qty_deld(100 , 900 , 800 , 700 , 600));

 — – 查看整體
 select  *  from  order_detail
 — – 單個
 select  item_va  from  order_detail
 — – 查看可變數組內容
 select  *  from  table (
 — –select * from order_detail a where a.orderno= o100 )
 select  a.item_va  from  order_detail a  where  a.orderno = o100 )

 — – 嵌套表
— – 創建抽象數據類型即對象
 create  or  replace  type ord_ty  as  object (
  itemcode  varchar2 (5),
  qty_ord  number (5),
  qty_deld  number (5));

 — – 表中包含嵌套表一定要基于一個對象創建一個新的對象作為嵌套表
 create  or  replace  type ord_nt  as  table  of  ord_ty;

 — – 創建包含嵌套表的表
 create  table  order_master(
  orderno  varchar2 (5),
  odate date,
  vencode  varchar2 (5),
  dets ord_nt)
  nested  table  dets store  as  ord_nt_tab;
 — 嵌套表放入某個任意任名的存儲空間, 嵌套表的存儲空間與普通表不同, 分別存儲在不同的空間
 
 insert  into  order_master  values (
  o100 ,to_date(18-07-99 , DD-MM-YY), v001 ,
ord_nt(ord_ty( i100 , 10 , 5),
ord_ty(i101 , 50 , 25),
ord_ty(i102 , 5 , 5)));

 — – 把記錄插入到嵌套表中
 insert  into  table (select  p.dets  from  order_master p
 where  p.orderno = o100 )
 values (i103 , 30 , 25);

 select  t.dets  from  order_master t  where  t.orderno = o100

 — – 查看嵌套表中的信息  
 select  *  from  table (select  t.dets  from  order_master t
 where  t.orderno = o100

 — – 修改
 update  table (select  t.dets  from  order_master t
  where  t.orderno = o100 ) t
  set  value(t) = ord_ty(i103 , 50 , 45)
  where  t.itemcode = i103

 — – 刪除嵌套表的值
 delete  from  table (select  t.dets  from  order_master t
  where  t.orderno = o100 ) t
  where  t.itemcode = i102
 
 — – 把嵌套表中已存在的記錄添加到創建的表中
 insert  into  order_master  values (o202 ,to_date( 2003-3-5 , YY-MM-DD),
  v101 , cast (multiset( select  *  from  table ( select  dets  from  order_master
 where  orderno = o201 ))  as  ord_nt));
 
 — – 創建對象
 create  type vend_ty  as  object(
vencode  varchar2 (5),
venname  varchar2 (20),
venadd1  varchar2 (20),
venadd2  varchar2 (20),
venadd3  varchar2 (20),
tel_no  number (6));

 drop  table  vend_master;

 — – 創建對象表, 對象中不能定義約束,在對象表中可通過關鍵字 constraint 定義
 create  table  vend_master  of  vend_ty(vencode  constraint  vc_pk  primary  key);

 insert  into  vend_master  values (
vend_ty(v201 , John , 10 , Fezinnith , Mexico , 948456));

 — – 查看地址(表中所分配的 OID)
 select  ref(a)  from  vend_master a;

 — – 創建一個指向抽象數據類型的表
 create  table  ord_master(
orderno  varchar2 (5),
vendet ref vend_ty); — – 數據類型為指向抽象數據類型的類型
 
 — – 類似將查詢記錄插入一個表的語法插入記錄
 insert  into  ord_master(select o301 ,ref(a) from  vend_master a
 where  vencode = v201

 — – 查看所有記錄
 select  *  from  ord_master;

 select  deref(a.vendet)  from  ord_master a;

 delete  from  vend_master  where  vencode = v201

 — – 對象視圖
 create  table  item(
  itemcode  varchar2 (10),
  item_on_hand  number (10),
  item_sold  number (10));

 create  or  replace  type item_type  as  object
  (itemcode  varchar2 ( 10),
  item_on_hand  number (10),
  item_sold  number (10));

 create  view  item_view  of  item_type  with  object oid — – 表名 of 類型名 with object oid
 (itemcode)  as
 select  *  from  item  where  item_on_hand 20 ;

 insert  into  item  values (i201 , 10 , 5);
 — – 插入值調用函數
 insert  into  item_view  values (item_type( i102 , 15 , 50));

 create  view  nt_view  of  ord_ty  with  object oid(itemcode)
 as  select  *  from  table (select  d.dets
 from  order_master d  where  d.orderno = o201

 create  table  itemfile(
  itemcode  varchar2 (5)  primary  key ,
  itemdesc  varchar2 (20),
  p_category  varchar2 (20),
  qty_hand  number (5),
  re_level  number (5),
  max_level  number (5),
  itemrate  number (9 , 2));

 create  table  order_detail (
  orderno  varchar2 (5),
  itemcode  varchar2 (5),
  qty_ord  number (5),
  qty_deld  number (5), primary  key (orderno,qty_ord,qty_deld),
  foreign  key (itemcode)  references  itemfile(itemcode));

 create  or  replace  type itemfile_ty  as  object
  (itemcode  varchar2 ( 5),
  itemdesc  varchar2 (20),
  p_category  varchar2 (20),
  qty_hand  number (5),
  re_level  number (5),max_level  number (5),
  itemrate  number (9 , 12));

 create  view  itemfile_ov  of  itemfile_ty
  with  object oid(itemcode)
  as  select  *  from  itemfile;

 select  make_ref(itemfile_ov,itemcode)  from  itemfile;

 create  view  order_detail_ov
 as 
  select  make_ref(itemfile_ov,itemcode) items,orderno,qty_ord,qty_deld
  from  order_detail;

 — – 不能正確運行
 select  deref(a.items)  from  order_detail_ov a;

 **********************************************************************************************
 
 
 
 — – 創建抽象數據類型
 create  or  replace  type add_ty  as  object(
Street  varchar2 (25),
City  varchar2 (15),
State  varchar2 (10),
Zip  number );

 — – 基于抽象數據類型創建表
 create  table  customer(
Customer_id  number (4),
person add_ty);

 — – 插入記錄
 insert  into  customer  values (
 1001 ,add_ty(No.2 downhill st. , Los Angles , California , 700023));

 insert  into  customer  values (
 1002 ,add_ty(No.120 stepahead rd. , houston , texas , 701024));

 — – 查詢記錄
 select  customer_id,c.person.city  from  customer c
 where  c.person.state = texas

 — – 刪除記錄
 delete  from  customer a
 where  a.person.zip = 701024 ;

 — – 創建可變數組
 create  type Phone  as  varray(2)  of  Number (8);

 — – 使用可變數組創建表
 create  table  Employee(
Eno  number (4),
name  varchar2 (15),
phone phone);

 — – 插入數據
 insert  into  Employee  values (
 1000 , George ,Phone(67343344 , 3432342));

 delete  from  Employee  where  name = gxj

 select  *  from  employee;

 select  phone  from  employee;

 — – 創建對象
 create  type person_details  as  object(
name  varchar2 (15),
age  number (2),
desg  varchar2 (15));

 create  type person_detail_table_ty  as  table  of  person_details;

 create  table  other_info_person(
dept_name  varchar2 (10),
dept_no  number (3),
person_info person_detail_table_ty)
nested  table  person_info store  as  person_store_table;

 — – 創建抽象數據類型
 create  or  replace  type Dept_type  as  object(
Deptno  number (2),
Dname  varchar2 (14),
Loc  varchar2 (13));

 — – 創建表
 create  table  Student(
Name  varchar2 (15),
Dept_detail Dept_type);

 — – 插入數據
 insert  into  Student  values (
  Jessica ,Dept_type(20 , Computer , Chicago));

 insert  into  Student  values (
  Peter ,Dept_type(40 , Electronics , California));

 — – 查詢數據
 select  *  from  Student;

 select  name, a.dept_detail.Deptno  from  Student a
 where  a.Dept_detail.Loc = Chicago

 insert  into  Employee  values (
 1002 , Dick ,Phone(33444876 , 87876565));
 insert  into  Employee  values (
 1003 , Jones ,Phone(54576545 , 52457779));
  plsql
– 例二:創建具有 LOB 數據類型的表
CREATE TABLE vendor_master
 (vencode  varchar2(5),
  venname  varchar2(15),
  venadd1  varchar2(20),
  venadd2  varchar2(20),
  venadd3  varchar2(20),
  tel_no  number(6),
  msg  CLOB);
 
– 例三:初始化 LOB 值
INSERT INTO vendor_master VALUES
 (v201 , aryay , 10 , first st , mds ,475859,
  這是我們的初始化 LOB 值
 
select * from vendor_master;

– 例 9:條件控制
select * from rs_employees
  where hetongid= WL-090001

DECLARE
  v_department  rs_employees.department%type;
BEGIN
  SELECT department INTO v_department
  FROM rs_employees
  WHERE HeTongId= WL-090001
 
  IF v_department = 車間工人 THEN
  UPDATE rs_employees
  SET department= 不是工人
  WHERE HeTongId= WL-090001
  ELSE
  UPDATE rs_employees
  SET department= 車間工人
  WHERE HeTongId= WL-090001
  END IF;
END;
/

–CASE 語句示例(下面的寫法有錯)
SET SERVEROUT ON;
DECLARE
  I number:=2;
BEGIN
  CASE
  WHEN (I=1) THEN dbms_output.put_line(Result is 1
  WHEN (I=2) THEN dbms_output.put_line(Result is 2
  END CASE;
END;

– 和上面的區別是什么
SET SERVEROUT ON;
DECLARE
  I number:=2;
BEGIN
  CASE I(用于選擇器)
  WHEN 1 THEN dbms_output.put_line(Result is 1
  WHEN 2 THEN dbms_output.put_line(Result is 2
  END CASE;
END;
/

– 例 11:簡單循環:在 Test Window 中執行
–SET SERVEROUT ON;
DECLARE
  a  NUMBER := 100;
BEGIN
  LOOP
  a := a+25;
  EXIT WHEN A=250;
  END LOOP;
  dbms_output.put_line(TO_CHAR(a));
END;

– 例 12:While 循環,此值書上有錯
DECLARE
  i  NUMBER :=0;
  J  NUMBER :=0;
BEGIN
 while i =100 Loop
  J := J+1;
  i := i+2;
 end loop;
 dbms_output.put_line(j 的值是 ||j);
END;
 
– 例 13:FOR 循環,結果是 5050
DECLARE
  i  number :=0;
  j  number :=0;
BEGIN
  for i in 1..100
  loop
  j := j + 1;
  end loop;
  dbms_output.put_line(j 的值是 ||j);
END;

PLSQL 表

CREATE OR REPLACE PROCEDURE MY_PLSQL_TABLE AS
  – 定義一個 PL/SQL 表
  TYPE MyType IS Table OF Rs_Employees.Name%Type
  Index By Binary_Integer;
  – 定義二個變量
  MyTable MyType;
  i  binary_integer:=0;
 
  – 通過循環取出 PL/SQL 表中的第一條記錄的序號及內容
  Procedure MyOutPut Is
  Begin
  I := MyTable.First;
  Dbms_Output.put_line(第 ||To_char(I)|| 行為:||MyTable(I));
  Loop
  I := MyTable.Next(I);
  Dbms_Output.put_line(第 ||To_char(I)|| 行為:||MyTable(I));
  Exit When I = MyTable.Last;
  End Loop;
  End;
 
BEGIN
  – 通過游標往 PL/SQL 表中寫入數據
  FOR tmp_cur in (SELECT HeTongId,Name
  From Rs_Employees
  Where HeTongId = WL-090010 )
  LOOP
  i  := i + 1;
  MyTable(i) := tmp_cur.Name;
  Dbms_Output.put_line(原表中合同號為:||tmp_cur.hetongid||   姓名為:||tmp_cur.Name);
  Dbms_Output.put_line(PL/SQL 表中姓名為:||Mytable(i));
  END LOOP;

  – 跳過前面的順序,有意增加一條記錄
  MyTable(80) := XW
 
  — 顯示 PL/SQL 表相關信息
  Dbms_Output.put_line(
  Dbms_Output.put_line(PL/SQL 表的總行數為:  ||MyTable.count|| 行
  Dbms_Output.put_line(PL/SQL 表的第一行為:  ||MyTable.First|| ||MyTable(MyTable.First));
  Dbms_Output.put_line(PL/SQL 表的最后一行為:||MyTable.Last|| ||MyTable(MyTable.Last));
 
  – 顯示最后一條相關信息
  Dbms_Output.put_line(
  Dbms_Output.put_line(PL/SQL 表的第 80 行為:  ||MyTable(80));
  Dbms_Output.put_line(PL/SQL 表的第 80 行之后為:||MyTable.Next(80));
 
  – 示范通過循環取出 PL/SQL 表中的每一條記錄的序號及內容
  Dbms_Output.put_line(
  MyOutPut;

  – 示范從 PL/SQL 表中刪除行
  Dbms_Output.put_line(
  MyTable.Delete(3);
  Dbms_Output.put_line(已從 PL/SQL 表刪除第 3 行
  Dbms_Output.put_line(現在 PL/SQL 表的總行數為:  ||MyTable.count|| 行
  – 通過循環取出 PL/SQL 表中的每一條記錄的序號及內容
  MyOutPut;
 
  – 示范從 PL/SQL 表中刪除行
  Dbms_Output.put_line(
  MyTable.Delete;
  Dbms_Output.put_line(已從 PL/SQL 表刪除全部行
  Dbms_Output.put_line(現在 PL/SQL 表的總行數為:  ||MyTable.count|| 行

  – 取消以下注釋將會引發異常
  Dbms_Output.put_line(
  –MyOutPut;

 Exception
  – 修改上面的代碼,有意觸發此異常
  – 此示例說明了,只有對 PL/SQL 表中進行了賦值的記錄才可以引用;但不需要按順序對每條
  – 記錄進行賦值;如果試圖訪問沒有賦值的記錄,將會引發錯誤;通過集合函數對 PL/SQL 表
  – 進行操作時,如果超出了記錄范圍,則返回空值  
  When Others then
  Dbms_Output.put_line(發生了錯誤!||I);
END;
記錄
DECLARE
  – 聲明一個記錄類型
  TYPE TYPE_RSRECORD IS RECORD
  (HETONGID  RS_EMPLOYEES.HeTongId%Type,
  NAME  RS_EMPLOYEES.Name%type,
  SEX  RS_EMPLOYEES.Sex%type,
  DEPARTMENT RS_EMPLOYEES.Department%type,
  HIREDATE  RS_EMPLOYEES.Hiredate%type);
  – 定義一個記錄變量
  Rs_REcord  TYPE_RSRECORD;
 
  – 定義一個游標
  Cursor MyCursor Is
  SELECT * From Rs_Employees
  Where HeTongId = WL-090010
BEGIN
  – 通過游標往記錄中寫入數據
  Open MyCursor;
  Loop
  Fetch MyCursor Into Rs_Record;
  Exit When MyCursor%Notfound;
  Dbms_Output.put_line(合同號為:||Rs_Record.hetongid||   姓名為:||Rs_Record.Name);
  End Loop;

  Close MyCursor;
END;
/

可變數組

DECLARE
  TYPE itemcode1  IS varray(5) of varchar2(5);
  TYPE qty_ord1  IS varray(5) of Number(5);
  TYPE qty_deld1  IS varray(5) of Number(5);
 
  v_itemcode  itemcode1;
  v_qty_ord  qty_ord1 := qty_ord1(1,2);
 
BEGIN
  IF v_itemcode is NULL Then
  DBMS_OUTPUT.put_line(v_itemcode 包含空值
  END IF;
 
  IF v_qty_ord is NULL Then
  DBMS_OUTPUT.put_line(v_qty_ord 包含空值
  ELSE
  DBMS_OUTPUT.put_line(v_qty_ord 非空
  END IF;
END;
/

 
  批量綁定
– 先建立一張表,用于測試
CREATE TABLE VENDOR
 (VENCODE VARCHAR2(5),
  VENNAME VARCHAR2(15));

– 測試批量綁定  
DECLARE
  – 定義二張 PL/SQL 表
  TYPE NumTab  Is Table Of VarCHAR2(5)  INDEX BY BINARY_INTEGER;
  TYPE NameTab Is Table Of VarCHAR2(15) INDEX BY BINARY_INTEGER;
  vnums  NumTab;
  vNames NameTab;
  – 三個時間變量
  t1 varchar2(5);
  t2 varchar2(5);
  t3 varchar2(5);
 
  – 捕獲當前時間的過程
  Procedure get_time(t Out Number) Is
  BEGIN
  SELECT TO_CHAR(SYSDATE, SSSSS) INTO t FROM DUAL;
  END;

BEGIN
  FOR j IN 1..20000
  LOOP
  vnums(j)  :=j;
  vNames(j) := vendor || To_char(j);
  End loop;
 
  get_time(t1);

  – 用 FOR 循環插入
  For i In 1..20000
  LOOP
  Insert Into vendor (vencode,venname)
  Values(vnums(i),vnames(i));
  END LOOP;
  get_time(t2);
 
  – 用 FORALL 插入
  FORALL i In 1..20000
  Insert Into vendor (vencode,venname)
  Values(vnums(i),vnames(i));
  get_time(t3);
 
  DBMS_OUTPUT.put_line(執行時間(秒)
  DBMS_OUTPUT.put_line(————————–
  DBMS_OUTPUT.put_line(For 循環:||To_char(t2-t1));
  DBMS_OUTPUT.put_line(ForAll:||To_char(t3-t2));
End;
/
– 抽象數據類型

CREATE OR REPLACE TYPE address_ty AS OBJECT
  (street_no  number(3),
  street_name  varchar2(20),
  city  varchar2(20),
  state  varchar2(20));

CREATE TABLE vend_mast
 (vencode  varchar2(5),
  venname  varchar2(15),
  venadd  address_ty,
  tel_no  number(10));
 
INSERT INTO vend_mast VALUES
 (v100 , john ,address_ty(110, Clinton Rd  , Rosewood , Columbia),
  234465987);

SELECT * FROM vend_mast;

select a.venadd.city from vend_mast a;

UPDATE vend_mast a
  set a.venadd.street_no = 10
  WHERE venname= john

DELETE FROM vend_mast a
  WHERE a.venadd.city= Rosewood

DROP TYPE address_ty;

CREATE INDEX streetnum ON vend_mast (venadd.street_no);

CREATE OR REPLACE TYPE Student_typ AS OBJECT
  (ssn  number,
  Name  varchar2(30),
  Address varchar2(100)) NOT FINAL

– 對象表.
CREATE TYPE vend_ty AS Object
 (vencode varchar2(5),
  venname varchar2(20),
  venadd1 varchar2(20),
  venadd2 varchar2(20),
  venadd3 varchar2(20),
  tel_no number(6));
 
CREATE TABLE vend_master OF vend_ty
 (vencode CONSTRAINT VC_PK PRIMARY KEY);
 
 
INSERT INTO vend_master values
  (vend_ty( v201 , John , 10 , Fezinnith , Mexico ,948456));
 
SELECT vencode FROM vend_master;

– 對象視圖
CREATE TABLE item
 (itemcode varchar2(10),
  item_on_hand number(10),
  item_sold number(10));

CREATE OR REPLACE TYPE ITEM_TYPE AS OBJECT
 (itemcode varchar2(10),
  item_on_hand number(10),
  item_sold number(10));
 
CREATE VIEW ITEM_VIEW OF ITEM_TYPE
 with object oid(itemcode) As
 SELECT * FROM ITEM WHERE ITEM_ON_HAND

INSERT INTO ITEM VALUES (i201 ,10,5);
INSERT INTO item_view Values (item_type( i102 ,15,50));
 
select * from item_view;

DELETE FROM ITEM_VIEW WHERE ItEMCODE= i102

– 可變數組

CREATE TYPE itemcode  AS varray(5) of varchar2(5);
CREATE TYPE qty_ord  AS varray(5) of number(5);
CREATE TYPE qty_deld  AS varray(5) of number(5);

CREATE TABLE ORDER_DETAIL
 (ORDERNO  VARCHAR2(5),
  ITEM_VA  ITEMCODE,
  QTY_VA  QTY_ORD,
  QTYD_VA  QTY_DELD);
 
INSERT INTO order_detail VALUES
 (o100 ,itemcode( i100 , i101 , i102 , i103 , i104),
  qty_ord(100,98,49,39,20),
  qty_deld(100,900,800,700,600));
 
INSERT INTO order_detail VALUES
 (o101 ,itemcode( i102 , i103 , i104),
  qty_ord(100,98,20),
  qty_deld(100,900));
 
 
SELECT * FROM ORDER_DETAIL;

– 嵌套表

CREATE TYPE ord_ty As Object
 (itemcode  varchar2(5),
  qty_ord  number(5),
  qty_deld  number(5));
 
CREATE TYPE ord_nt AS Table OF ord_ty;

CREATE TABLE order_master
 (orderno  varchar2(5),
  odate  date,
  vencode  varchar2(5),
  dets  ord_nt) 
  NESTED TABLE dets STORE AS ord_nt_tab;

INSERT INTO order_master VALUES
  (o100 ,To_date( 18-07-99 , dd-mm-yy), v001 ,
  ord_nt(
  ord_ty(i100 ,10,5),
  ord_ty(i101 ,50,25),
  ord_ty(i102 ,5,5)
  )
  );
 
INSERT INTO TABLE (SELECT p.dets
  FROM order_master p
  WHERE p.orderno= o100 )
  Values (i103 ,30,25);
 

SELECT * FROM TABLE (SELECT t.dets FROM order_master t
  Where t.orderno = o100
 
UPDATE TABLE (SELECT e.dets from order_master e
  WHERE e.orderno = o100 ) p
  SET VALUE(p) = ord_ty(i103 ,50,45)
  Where p.itemcode = i103
 
DELETE FROM TABLE (SELECT e.dets from order_master e
  WHERE e.orderno = o100 ) p
  Where p.itemcode = i103

看完上述內容是否對您有幫助呢?如果還想對相關知識有進一步的了解或閱讀更多相關文章,請關注丸趣 TV 行業資訊頻道,感謝您對丸趣 TV 的支持。

正文完
 
丸趣
版權聲明:本站原創文章,由 丸趣 2023-07-28發表,共計33959字。
轉載說明:除特殊說明外本站除技術相關以外文章皆由網絡搜集發布,轉載請注明出處。
評論(沒有評論)
主站蜘蛛池模板: 额敏县| 宝山区| 南木林县| 金溪县| 枣阳市| 塔城市| 古浪县| 吴忠市| 乐亭县| 漾濞| 会宁县| 司法| 玉溪市| 三穗县| 兴国县| 阳高县| 加查县| 新乡市| 印江| 大埔县| 霸州市| 仙桃市| 隆德县| 拜城县| 茌平县| 始兴县| 皮山县| 固镇县| 孝感市| 桂阳县| 大足县| 宁明县| 亚东县| 老河口市| 河南省| 海兴县| 鄯善县| 莱芜市| 含山县| 怀柔区| 蓬安县|