开源中文网

您的位置: 首页 > Oracle > 正文

包和动态SQL 联合 游标变量的使用

来源:  作者:

下面有三个文件:

文件一:包声明
 

create or replace package S_C
is
 
-- 定义学生属性 记录

  TYPE STU IS RECORD(
    SNO CHAR(10), 
    SNAME VARCHAR2(20), 
    SAGE INTEGER, 
    SSEX CHAR(2), 
    SDEPT VARCHAR2(20)
  );
  
--定义一个学生选课信息记录

  TYPE ELEC IS RECORD (
   SNAME VARCHAR2(20),
   CNAME VARCHAR2(20), 
   GRADE INTEGER
  );
  
-- 定义一个 强 游标 变量 类型

  TYPE ELECCOLL IS REF CURSOR RETURN ELEC; 
  
-- 定义一个获取学生总数的函数

  FUNCTION GETCOUNTOFSTUDENTS RETURN INTEGER; 
--如果没有参数 不要加()

  
-- 定义一个查询学生选课信息的过程

  PROCEDURE GETINFO(IN OUT STU,SN VARCHAR); 
  
-- 定义一个过程来返回 学生的选课信息

  PROCEDURE GETELEC(IN OUT INTEGER,SN VARCHAR);
end S_C;

 

文件二: 包的定义

 

CREATE OR REPLACE PACKAGE BODY S_C
is 
  FUNCTION GETCOUNTOFSTUDENTS 
  RETURN INTEGER 
--注意这里 没有分号

  IS 
    total INTEGER;
  BEGIN
     SELECT COUNT(*) INTO total FROM STUDENT;
     RETURN total;
  END GETCOUNTOFSTUDENTS; 
  
--------------------------------------

  PROCEDURE GETINFO(IN OUT STU,SN VARCHAR)
  IS
  str varchar(100);
  BEGIN
   
--/* 

     str:='SELECT * FROM student WHERE student.sno='||''''||SN||'''';
    Execute immediate str into S ; 
    
--*/

    Exception when no_data_found then
    DBMS_OUTPUT.put_line('没有数据发现');
    when too_many_rows then
    DBMS_OUTPUT.put_line('太多的数据');
  END GETINFO; 
  
-------------------------------

   PROCEDURE GETELEC(IN OUT INTEGER,SN VARCHAR)
   IS 
   str varchar(200);
   i integer;
   el ELEC;
   BEGIN
   str:=
' select sname,cname,NVL(GRADE,0) from student ,sc, course 
                      where student.sno=sc.sno and course.cno=sc.cno
                           and student.sno='
||''''||SN||'''';
   C:=DBMS_SQL.open_cursor;
   DBMS_SQL.parse(C,str,dbms_sql.v7);
   DBMS_SQL.define_column(C,1,el.SNAME,20);
   DBMS_SQL.define_column(C,2,el.CNAME,20);
   DBMS_SQL.define_column(C,3,el.GRADE);
   i:=DBMS_SQL.execute(C); 
   END GETELEC;

end S_C;

 

文件三:测试文件

 

declare 
  f S_C.STU;
  total integer;
  Cour S_C.ELECCOLL;
  el S_C.ELEC;
BEGIN
  total:=S_C.GETCOUNTOFSTUDENTS;
  DBMS_OUTPUT.PUT_LINE('学生总数是:'||total);
  S_C.GETINFO(f,'005'); 
  DBMS_OUTPUT.put_line(F.SNAME); 
  S_C.GETELEC(total,'004');
  DBMS_OUTPUT.PUT_LINE(rpad('学生姓名',10,' ')||
                       rpad('课程名字',10,' ')||
                       rpad('成绩',6,' '));
  LOOP
   IF DBMS_SQL.fetch_rows(TOTAL)=THEN
    EXIT;
   ELSE
     DBMS_SQL.column_value(TOTAL,1,el.SNAME);
     DBMS_SQL.column_value(TOTAL,2,el.CNAME);
     DBMS_SQL.column_value(TOTAL,3,el.GRADE);
     DBMS_OUTPUT.PUT_LINE(rpad(el.SNAME,10,' ')||
                          rpad(el.CNAME,10,' ')||
                          rpad(el.grade||'分',6,' '));
             
   END IF;
  END LOOP;
  DBMS_SQL.close_cursor(TOTAL);
END;

运行结果:

 

学生总数是:11
李四
学生姓名 课程名字    成绩 
刘佳    C语言       96分 
刘佳    数据结构     0分 
刘佳    操作系统     0分 
刘佳    英语        90分


Tags:动态 联合 游标
关于开源中文网 - 联系我们 - 广告服务 - 网站地图 - 版权声明