Oracle PLSQL 学习笔记摘要

来源:互联网 发布:手机怎么进去淘宝秒杀 编辑:程序博客网 时间:2024/05/17 02:38

 --------关注的重点内容:1、PL/SQL 2、PL/SQL程序结构3、变量与数据类型4、PL/SQL控制语句5、PL/SQL游标6、HANDLE EXCEPTION 7、SUB PROGRAM8、PACKAGE9、TRIGGER2,3,4,5,7重点内容一、常见的访问oracle的技术 1.1 PL/SQL   过程化SQL(存储过程) 1.2 PRO*C/C++  使用c或者c++语言访问oracle数据库 1.3 ODBC/ADO    VC中访问数据库的技术 1.4 OCI   ORACLE底层的连接接口 1.5 JDBC/SQLJ   JAVA访问数据库的技术PL/SQL 实在标准SQL基础上增加了过程花处理的语言ORACLE客户端工具访问oracle服务器的操作语言oracle对SQL的补充BEGIN IF TO_CHAR(SYSDATE,'DAY') ='Monday' THEN  pay_for_hamburgers; ELSE  borrow_hamburger_money; END IF;END;PL/SQL 结构化模块化编程 良好的可移植性 良好的可维护性 提升系统性能----批量处理  不便于向异构数据库移植应用程序  第四代语言 只管做什么,不管怎么做 缺少过程与控制语句 无算法描述能力 二、PLSQL对SQL进行了扩展 2.1 变量和类型 2.2、控制结构 2.3、过程与函数 2.4、对象类型与方法 三、PLSQL的程序结构 declare /*声明区  申明区   定义变量 定义类型 */ --这是单行注释  begin /*执行区    执行SQL语句或者PLSQL语句的*/    exception --例外 /*异常处理区   处理正常流程之外的一些代码 */ end;四、第一个PL/SQL程序 set serverouput on   begin   update ....;  commit;  dbms_output.put_line('hello plsql'); end; /  --执行  select count(*) from s_emp;  ---sql语句直接从客户端发送到sql执行器   PLSQL语句块  整个被发到给服务器上的过程性语句执行器。 过程性语句由PL/SQL引擎处理 PL/SQL语句块中的SQL语句由PLSQL引擎发给SQL执行器。 五、开发环境 sqlplus  命令行下的开发工具 sqldeveloper 图形化的开发工具 六、变量  6.1 如何定义变量   在声明区定义变量  变量名  类型;  6.2 sql中的数据类型      number   varchar2(n)  date   declare var_id  number; var_name varchar2(30);begin /*给变量赋值*/ var_id:=100; var_name:='test'; --:=代表赋值 dbms_output.put_line(var_id||':'||var_name);end;   6.3 变量的修饰     constant   类型      not null  constant类型---必须初始化,不能修改 not null 非空必须初始化一个值  declare  var_id   constant number:=1;  var_name varchar2(30) not null:='a';--值可改 begin  --var_id:=100;  var_name:='test';  dbms_output.put_line(var_id||'--'||var_name); end;  constant和not null修饰的变量必须赋初值 也就意味着一个变量定义之后不赋值默认值为NULL。  6.4 使用sql语句对变量进行赋值(相当于把硬盘上的数据倒腾到PLSQL所操作的内存中了)declare var_name    varchar2(30); var_salary  number; var_id      number:=1;begin select first_name,salary into var_name,var_salary  from s_emp where id=var_id; dbms_output.put_line(var_name||':'||var_salary);end; 七、PLSQL中可以使用的数据类型  7.1 标量类型  number  varchar2(n) char(n) date binary_integer boolean7.2 复合类型     record 记录类型 table 表类型 cursor  游标类型 7.3 参考类型 ref 类型 7.4 大类型(存储数据路径) BLOB 大二进制 0-4g CLOB 大字符类型 0-4g BFILE 文件类型八、plsql中的类型的使用 8.1 boolean 和 binary_integer的使用 declare  var_f boolean;  var_count binary_integer; begin  var_f:=true;  --var_f:=false;  var_count:=1000;  if  var_f  then   dbms_output.put_line(var_count);  end if; end; 8.2 获得字段对应类型 8.2.1 定义两个变量  分别和s_emp表中的id 和 first_name 字段的类型相同。 并且使用sql语句把id=1的值赋值给这两个变量 declare  var_id    number(7):=1;  var_name  varchar2(25); begin   select id,first_name into var_id,var_name from s_emp where id = var_id;  dbms_output.put_line(var_id||':'||var_name); end;  8.2.2 使用  表名.字段名%type    可以获得字段对应的类型 declare  var_id    s_emp.id%type:=1;  var_name  varchar2(25); begin   select id,first_name into var_id,var_name from s_emp where id = var_id;  dbms_output.put_line(var_id||':'||var_name); end;    8.2.3 使用record类型     8.2.3.1 语法:  record类型 相当于 struct 类型   type record 类型名  is record(   字段名  类型,   字段名  类型,   字段名  类型   );  8.2.3.2 举例   把id  first_name salary包装成一个类型    declare   /*首先定义一个record类型*/   type emptype is record(    id    s_emp.id%type,    first_name      s_emp.first_name%type,    salary    s_emp.salary%type   );   /*使用类型定义变量*/   var_emp  emptype;  begin   select id,first_name,salary into var_emp from s_emp where id = 1;   dbms_output.put_line(var_emp.id||':'||var_emp.first_name||':'||var_emp.salary);  end;   8.2.3.3 如果查询的字段数少于记录类型字段数  declare   type emptype is record(    id     s_emp.id%type,    first_name      s_emp.first_name%type,    salary    s_emp.salary%type   );   var_emp  emptype;  begin   select id,salary into var_emp.id,var_emp.salary from s_emp where id = 2;   dbms_output.put_line(var_emp.id||':'||var_emp.salary);   end;    8.2.3.4 记录类型的变量赋值  能不能把一个结构体  declare   type emptype is record(    id     s_emp.id%type,    first_name      s_emp.first_name%type,    salary    s_emp.salary%type   );   var_emp  emptype;   var_emp2  emptype;  begin   select id,first_name,salary into var_emp2 from s_emp where id = 2;   --var_emp:=var_emp2;---整体复制赋值   /*选择某些字段赋值   这样只要名字*/   var_emp.first_name:=var_emp2.first_name;   var_emp.id:=var_emp2.id;   var_emp.salary:=var_emp2.salary;      dbms_output.put_line(var_emp.id||':'||var_emp.first_name||':'||var_emp.salary);    dbms_output.put_line(var_emp2.id||':'||var_emp2.first_name||':'||var_emp2.salary);   end;   8.2.4 思考如何把一个表的所有字段包装成一个记录类型呢?  表名%rowtype  获得表的一行对应的类型  字段名和表头的顺序一模一样  不用担心弄混。    这个类型实际上就是字段名和字段顺序完全和表头相同的记录类型。      s_dept%rowtype 意味着取的部门表的一行  s_emp%rowtype 意味着获取员工标的一行     把s_emp表中 id=1所有数据放入一个记录类型的变量中  输出id  first_name salary     declare   var_emp  s_emp%rowtype;     begin   select id,first_name,salary into var_emp.id,var_emp.first_name,var_emp.salary from s_emp where id=1;   dbms_output.put_line(var_emp.id||':'||var_emp.first_name||':'||var_emp.salary);  end;   ------    declare   var_emp  s_emp%rowtype;     begin   select * into var_emp from s_emp where id=1;   dbms_output.put_line(var_emp.id||':'||var_emp.first_name||':'||var_emp.salary);  end;  8.2.5 table类型 相当于C的数组类型   8.2.5.1  table类型的语法  type 表类型名  is table of 元素类型 index by binary_integer;    8.2.5.2 使用table类型的变量  把id = 1 或者id = 3 或者id=7 的工资放入一个table类型的变量中    declare    /*定义table类型*/   type numstype is table of s_emp.id%type index by binary_integer;   /*使用类型定义变量*/   var_nums  numstype;   /*存储下标的变量*/--二进制整数   var_ind  binary_integer;    begin   var_nums(11):=300;   select salary into var_nums(1) from s_emp where id=1;   select salary into var_nums(2) from s_emp where id=3;   select salary into var_nums(3) from s_emp where id=7;   var_ind:=1;   dbms_output.put_line(var_nums(var_ind));   var_ind:=var_ind+1;   dbms_output.put_line(var_nums(var_ind));   var_ind:=var_ind+1;   dbms_output.put_line(var_nums(var_ind));    end;    8.2.5.3 下标不连续时,如何遍历table中的数据  非常高级的思想     迭代器思想   first() 得到第一个元素对应的下标   next(n) 根据一个元素的下标n得到下一个元素的下标   last()  得到最后一个元素的下标     declare    /*定义table类型*/   type numstype is table of s_emp.id%type index by binary_integer;   /*使用类型定义变量*/   var_nums  numstype;   /*存储下标的变量*/--二进制整数   var_ind  binary_integer;    begin   var_nums(11):=300;   select salary into var_nums(1) from s_emp where id=1;   select salary into var_nums(2) from s_emp where id=3;   select salary into var_nums(3) from s_emp where id=7;   var_ind:=var_nums.first();   dbms_output.put_line(var_nums(var_ind));   var_ind:=var_nums.next(var_ind);      dbms_output.put_line(var_nums(var_ind));   var_ind:=var_ind+1;   dbms_output.put_line(var_nums(var_ind));    end;   九、变量的作用域和可见性  declare   var_m  number:=10000;  begin   declare    var_m  number:=100;   begin    /*局部区可以访问全局的数据*/    dbms_output.put_line(var_m);---100,但是想访问全局的,怎么办呢?   end;   /*全局区不能访问局部区*/  end;    <<outerblock>>    declare   var_m  number:=10000;  begin   declare    var_m  number:=100;   begin    /*局部区可以访问全局的数据*/    dbms_output.put_line(var_m);---100,但是想访问全局的,怎么办呢?    dbms_output.put_line(outerblock.var_m);   end;   /*全局区不能访问局部区*/  end;十、PLSQL中的控制语句  10.1 分支语句 if a>b then  end if;  ------ if a>b then   else   end if; --- if a>b then  elsif a>c then   elsif a>d then   else   end if; ----   ---  10.1.2 举例   10.1.2.1 定义3个整数变量 给这3个变量赋值  输出这3个变量的最大值   declare  a number;  b number;  c number;   begin  if a>b then    if b>c then    a    elsif a>c then    a    elseif a<c then    c    end if;  else--a<b   if b>c then     b     else     c   end if;  end if;   end;         ------   declare  var_a number;  var_b number;  var_c number;  var_max number;   begin  var_a:=&var_a;  var_b:=&var_b;  var_c:=&var_c;  var_max:=var_c;  if var_max < var_a then    var_max:=var_a;  end if;  if var_max < var_b then    var_max:=var_b;  end if;  dbms_output.put_line(var_max);     end;      10.1.2.2  NULL值的判断    declare  var_a number;  var_b  number;     begin  if var_a<var_b then    dbms_output.put_line('var_a<var_b');  elsif var_a >var_b then    dbms_output.put_line('var_a>var_b');  elsif var_a=var_b then    dbms_output.put_line('var_a=var_b');  elsif var_a is null and var_b is null then     dbms_output.put_line('var_a is null and var_b is null');  else   NULL;--这是PLSQL中的NULL空语句  end if;   end;  10.2 循环语句 10.2.1 简单循环  loop   /*循环执行的代码或者语句*/  end loop; 10.2.2 如何退出当前循环?   exit when 循环的结束条件;---死于非命    /*可以带有遗言的消亡*/  if 退出条件 then    exit;  end if; 10.2.3 使用简单循环从1输出到10  declare   var_num number:=1;  begin   loop     dbms_output.put_line(var_num);    var_num:=var_num+1;    exit when var_num=11;   end loop;  end;    ----    declare   var_num number:=1;  begin   loop     dbms_output.put_line(var_num);    var_num:=var_num+1;    if  var_num >10 then      dbms_output.put_line('loop over');     exit;    end if;   end loop;  end;   10.2.4 while循环   10.2.4.1 语法   while (满足条件进入)循环条件  loop    /*循环代码*/     end loop; 10.2.5 使用while循环输出1到10   declare   var_i  number:=1;  begin    while var_i<11 loop    dbms_output.put_line(var_i);    var_i:=var_i+1;   end loop;  end;    10.2.6 for循环(智能循环)  for 变量名 in a..b   /*循环代码   变量在循环中不允许修改 */  end loop; 10.2.7 使用for循环输出1到10  declare  var_i number:=1; begin   for var_i in 1..10 loop    dbms_output.put_line(var_i);  end loop; end;    备注:var_i中的值不能更改。   10.2.8 使用for循环输出10到1(reverse 翻转   关键字)   begin  for var_i in reverse 1..10 loop   dbms_output.put_line(var_i); end loop;   end;    10.3 goto语句 10.3.1 语法  goto  标签名;  <<标签名>> 10.3.2 使用goto语句 输出1到10达到一个循环的效果。 declare  var_i  number:=1; begin  <<myloop>>  if var_i < 11 then    dbms_output.put_line(var_i);   var_i:=var_i+1;   goto myloop;   end if; end; 10.3.3. 退出多重循环 begin   <<myloop>>    for a in 1..4 loop   for b in 1..4 loop     dbms_output.put_line(b);    if b=2 then      exit myloop;    end if;   end loop;  end loop; end;   ---注意两段的区别,  begin   for a in 1..4 loop   for b in 1..4 loop     dbms_output.put_line(b);    if b=2 then      goto myloop;    end if;   end loop;  end loop;  <<myloop>>  NULL;--空语句 end; ----一、sql在PLSQL中的使用1.1 select语句 要和into结合使用,不允许在PLSQL中使用。 select first_name,salary into var_name,var_sal from s_emp where id=1;1.2 dml(insert,update ,delete) tcl(commit,rollback,savepoint) 这些语句可以直接在plsql中使用1.3 ddl(create,drop,alter)不能直接在plsql中使用,需要使用动态sql。二、动态sql2.1 动态sql的概念   --- SQL 语句在程序执行的过程中可以发生改变。 静态sql,sql语句在程序执行的过程中不能改变。下例就是静态sql但是不能执行提示2.2 DDL的动态SQL   declare  sqlstr  varchar2(100); begin  sqlstr:='create table testdsql(id number primary key)';  sqlstr:=substr(sqlstr,1,length(sqlstr)-1);   sqlstr:=sqlstr||','||'name varchar2(30))';  dbms_output.put_line(sqlstr);  execute immediate sqlstr; end;  2.3  DML的动态sql 'insert into testdsql values(1,''test'')'  declare  sqlstr  varchar2(100); begin  sqlstr:='insert into testdsql values(1,''test'')';  dbms_output.put_line(sqlstr);  execute immediate sqlstr;  commit; end;-----------上面的sqlstr信息也写死了。    declare  sqlstr  varchar2(100);  var_id  number:=2;  var_name varchar2(30):='test2'; begin  sqlstr:='insert into testdsql values(:b0,:b1)';--/*:b0,:b1 占位符*/  dbms_output.put_line(sqlstr);    execute immediate sqlstr using var_id,var_name;  commit; end;  2.4 select语句的动态sql 在参考游标中完成 三、游标 3.1 概念  用来处理多行数据的一个数据结构   3.2 使用游标的步骤:   1 声明游标 declare   cursor 游标名 is select 语句;    游标本质对应一个select语句,select语句的返回内容都装到游标中。   2 打开游标     open  游标名;    3 提取数据 fetch 游标名 into 变量;    4 关闭游标     close 游标名   3.3 把s_emp表中所有的数据放入一个游标中  declare cursor cs is select * from s_emp; var_a cs%rowtype;  begin open cs; fetch cs into var_a; dbms_output.put_line(var_a.id||':'||var_a.first_name); fetch cs into var_a; dbms_output.put_line(var_a.id||':'||var_a.first_name); fetch cs into var_a; dbms_output.put_line(var_a.id||':'||var_a.first_name); close cs;  end; ------ 3.4 通过循环  思考  如何提取游标中的所有的数据。  游标的属性 ---%NOTFOUND 游标名%found  在提取数据时提取到新数据就返回真,提取不到新数据就返回假     游标没有打开时,使用found属性就返回非法游标,打开但是没有fetch     则返回NULL. 游标名%notfound 在提取数据时,提取到新数据就返回假,提取不到新数据就返回真。     游标没有打开时,使用notfound属性就返回非法游标,打开但是没有fetch     则返回NULL.   ORA-1001 非法游标 游标名%isopen  游标是否处于打开状态     打开就返回真关闭返回假     打开的游标再打开     关闭的游标不能再关闭 游标名%rowcount 游标指针偏移量         3.5 使用简单循环  结合notfound属性遍历游标    declare cursor cs is select * from s_emp; var_a cs%rowtype;  begin open cs; loop  fetch cs into var_a;  exit when cs%NOTFOUND;  dbms_output.put_line(var_a.id||':'||var_a.first_name);   end loop; close cs;  end;    3.6 使用while循环结合found属性遍历游标  declare   cursor  cs is select * from s_emp;  var_a cs%rowtype;  begin  open cs; fetch cs into var_a;---一定要深刻理解为啥要加此行。理解%found while cs%found loop  fetch cs into var_a;  dbms_output.put_line(var_a.id||':'||var_a.first_name); end loop; close cs;  end;    3.7 for循环遍历游标   declare   cursor  cs is select * from s_emp;  begin  for var_a in cs loop  ----直接把游标看成一个区间  dbms_output.put_line(var_a.id||':'||var_a.first_name); end loop;  end;    3.8 带参游标    plsql中的参数 不能加任何长度修饰  但可以使用%type   参数名不要和字段名重名      显示id>10的记录。    declare   cursor  cs(var_id s_emp.id%type) is select * from s_emp where id > var_id;    begin  for var_a in cs(10) loop  ----直接把游标看成一个区间  dbms_output.put_line(var_a.id||':'||var_a.first_name); end loop;  end;     declare   cursor  cs(var_id s_emp.id%type) is select * from s_emp where id > var_id;  var_a s_emp%rowtype;  begin  open cs(10); loop   fetch cs into var_a;  exit when cs%NOTFOUND;  dbms_output.put_line(var_a.id||':'||var_a.first_name); end loop; close cs;  end;    3.9 参考游标(引用游标)    游标对应的SQL语句是一条字符串  3.9.1 定义参考游标类型: type  myrefcursor is ref cursor; 3.9.2 使用参考游标类型定义游标变量 empcursor myrefcursor; 3.9.3 打开游标时 关联到字符串 open empcursor for sqlstr;  declare  sqlstr  varchar2(100):='select * from s_emp';  type myrefcursor is ref cursor;  empcursor myrefcursor;  var_emp  s_emp%rowtype; begin  /*关联游标 到 字符串*/  open empcursor for sqlstr;  loop    fetch empcursor into var_emp;   exit when empcursor%notfound;   dbms_output.put_line(var_emp.id||':'||var_emp.first_name);  end loop;  close empcursor; end;    ---------类似带参游标   declare  sqlstr  varchar2(100):='select * from s_emp where id > :b0';  type myrefcursor is ref cursor;  empcursor myrefcursor;  var_emp  s_emp%rowtype;  var_id  s_emp.id%type:=15;---新增  begin  /*关联游标 到 字符串*/  open empcursor for sqlstr using var_id;  loop    fetch empcursor into var_emp;   exit when empcursor%notfound;   dbms_output.put_line(var_emp.id||':'||var_emp.first_name);  end loop;  close empcursor; end;  四、PLSQL中的异常  4.1 系统提供的异常以及处理 declare  var_name s_emp.first_name%type;  var_id   s_emp.id%type:=-1; begin  select first_name into var_name from s_emp where id = var_id;  dbms_output.put_line(var_name); exception  when no_data_found then  dbms_output.put_line('MYPROCESS'||SQLCODE||':'||SQLERRM);  insert into logtable values(sqlcode,sysdate);  when too_many_rows then  dbms_output.put_line('too many emps');  when others then   dbms_output.put_line('other exception'); end;  4.2 用户自定义异常 4.2.1 根据实际情况定义异常 4.2.2 根据条件抛出异常 4.2.3 异常捕获 4.2.4 处理异常  declare  too_many_emp exception; begin   if 1=1 then   raise too_many_emp;  end if;  dbms_output.put_line('app continue!'); exception  when too_many_emp then    dbms_output.put_line('catch emp exceptiono'); end;五、存储过程  5.1 对一组sql语句起的一个逻辑名 5.2 如何建立存储过程  create or replace procedure 存储过程名(参数列表) is  /*不允许出现declare,is充当了declare*/  begin  end;  5.3 设计一个存储过程 传入两个整数参数 输出两个参数的最大值 create or replace procedure maxvar(var_a number,var_b number) is  begin   if var_a > var_b then    dbms_output.put_line(var_a);  else   dbms_output.put_line(var_b);  end if; end;  5.4 查看并调用存储过程  SQL> desc maxvar   PROCEDURE maxvar Argument Name   Type   In/Out Default? ------------------------------ ----------------------- ------ -------- VAR_A    NUMBER   IN VAR_B    NUMBER   IN参数模式: in 负责给存储过程传入值  out 负责给存储过程传出值 in out 既负责传入又负责传出值参数的默认值 create or replace procedure maxvar(var_a number,var_b number:=100) is  begin   if var_a > var_b then    dbms_output.put_line(var_a);  else   dbms_output.put_line(var_b);  end if; end;  5.5 调用存储过程 begin  maxvar(100,200); end; 如何查看存储过程的内容?? desc user_source select text from user_source where name = 'MAXVAR';  5.6 写一个存储过程 传入三个整数参数 输出前两个参数的最大值 并把两个参数的和放入第三个参数中  create or replace procedure getmaxandsum(var_x in number,var_y in number,var_z out number) is  begin  if var_x < var_y then    dbms_output.put_line(var_y);  else   dbms_output.put_line(var_x);  end if;    var_z:=var_x+var_y; end; declare  var_z number:=0; begin  getmaxandsum(100,200,var_z);  dbms_output.put_line(var_z); end;     5.7 设计一个存储过程 有两个整数参数 输出这两个参数的最大值 然后把两个参数的和存入第二个参数中  create or replace procedure getmaxsum(var_x in number,var_y in  out number) is   begin  if var_x<var_y then    dbms_output.put_line(var_y);  else   dbms_output.put_line(var_x);  end if;  var_y:=var_x+var_y;  dbms_output.put_line(var_y); end;   declare  var_y number:=200; begin  getmaxsum(100,var_y); end;    5.8 设计一个存储过程 有两个整数参数 第一个参数是一个传入的整数,   第二个参数负责返回1 加到第一个参数的和      create or replace procedure getnum(x in number,y in out number)   is   begin  for i in 1..x loop   y:=i+y;  end loop;   end;   /   declare  var_y   number:=0;   begin  getnum(10,var_y);  dbms_output.put_line(var_y);   end;   六、函数 函数和存储过程的不同: 6.1 关键字不同 procedure  function 6.2 函数有返回值和返回值类型  存储过程没有 6.3 调用方式不同 存储过程可以直接在PLSQL中调用      函数必须组成表达式    写一个函数 传入两个整数参数 返回两个整数参数的最大值。 create or replace function fungetmax(x in number,y in number) return number  is  begin  if x<y then    return y;  end if;   return x; end;  declare  var_res number; begin   var_res:=fungetmax(100,200);  dbms_output.put_line(var_res); end; ---plsql中显示错误   show errors;      设计一个函数 传入两个整数参数  返回这两个整数参数的最大值,还要把两个参数的和放入第二个参数中      create or replace function fungetmaxandsum(x in number,y in out number) return number   is   temp number;   begin  temp:=x+y;  dbms_output.put_line(temp);  if x < y then    return y;  else    return x;  end if;   end;      declare  var_z number:=200;   begin   var_z:=fungetmaxandsum(100,var_z);  dbms_output.put_line('return number:'||var_z);   end;   七、包package  7.1 概念 组织相关数据的一种逻辑结构名  7.2 系统提供的包desc dbms_output dbms_output.put_line('hello world');  使用包中的数据需要在数据前加包名。 desc dbms_random;  select dbms_random.value(1,100) from dual; select trunc(dbms_random.value(1,100)) from dual; /*定时调用存储过程*/ desc dbms_job;  dbms_job.submit(job out binary_integer  what in varchar2,  next_date date,  interval varchar2  ); submit的含义是把定时任务提交给系统,系统会分配一个任务编号放入第一个参数, what要定时调用的存储过程 写到第二个参数中 next_date 第一次调用的时间  interval 第二次调用的时间  dbms_job.run(job in binary_integer); 让任务编号为job的定时任务执行起来。  dbms_job.remove(job in binary_integer); 删除编号为job的定时任务 7.3 定时调用一个存储过程  7.3.1 建立一张表  create table testjob(id number primary key,name varchar2(30));    7.3.2 为这张表建立一个索引序列  create sequence testjob_id;    7.3.3 建立一个存储过程向表中插入一条数据    create or replace procedure insert_job  is   begin   insert into testjob values(testjob_id.nextval,'testjob'||testjob_id.currval);   commit;  end;    7.3.4 使用dbms_job包定时调用存储过程    declare   jobno binary_integer;  begin   dbms_job.submit(jobno,'insert_job();',sysdate,'sysdate+1/1440');---注意这里的分号是重点要不不执行。   dbms_output.put_line('jobno='||jobno);   dbms_job.run(jobno);  end;  7.3.5 select job from user_jobs;  begin   dbms_job.remove(1181);  end;  --------------------------------------------   unix,linux--->crontab的使用  -------------------------------------------- 7.4 自定义包  7.4.1 定义一个包的头文件  C语言中声明函数,声明变量    PLSQL:/*注意有is,end,没有begin*/---相当于C的头文件  create or replace package mypack is    procedure getmax(x in number,y in number);   function getmin(x number,y number)return number;  end;  7.4.2 写一个包的实现  相当于C的实现文件  create or replace package body mypack is    procedure getmax(x in number,y in number)   is   begin    if x<y then      dbms_output.put_line(y);    else      dbms_output.put_line(x);    end if;   end;   function getmin(x number,y number)return number   is    begin    if x<y then      return x;    else         return y;    end if;   end;   end;      访问包中的数据 需要在数据前加包名。  declare   var_x number:=1;   var_y number:=2;   var_res  number:=0;  begin   mypack.getmax(var_x,var_y);   var_res:=mypack.getmin(var_x,var_y);   dbms_output.put_line(var_res);  end;      --------------------------------------------------------------- 

0 0