oracle pl/sql模板代码怎么写

80次阅读
没有评论

共计 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字。
转载说明:除特殊说明外本站除技术相关以外文章皆由网络搜集发布,转载请注明出处。
评论(没有评论)