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
- Oracle PLSQL 学习笔记摘要
- Oracle plsql学习笔记
- 学习Oracle的PLSQL笔记
- oracle PLSQL学习笔记--类型
- Oracle PLSQL 学习笔记一
- Oracle PLSQL 学习笔记二
- Oracle PLSQL 学习笔记三
- Oracle PLSQL 学习笔记四
- Oracle SQL&PLSQL学习笔记
- PLSQL学习摘要及范例
- Oracle学习笔记(2) PLSQL编程基础
- Oracle学习笔记(3) PLSQL程序控制结构
- Oracle数据库学习笔记之PLSQL
- oracle plsql学习一
- oracle PLSQL 学习二
- oracle plsql 学习三
- oracle plsql 学习四
- oracle之plSql学习
- 题目1368:二叉树中和为某一值的路径
- 微信公众平台开发入门教程
- hdu1829 A Bug's Life
- 不要在init和dealloc函数中使用accessor(访问器)
- linux fping命令使用
- Oracle PLSQL 学习笔记摘要
- HDU 2050 折线分割平面
- uva 129
- SQL Inner Join
- palindrome partition II
- [LeetCode] Reorder List
- 浅析C++中的this指针
- 用选择法对10个整数从小到大排序。
- 终于大致tableview知道如何刷新了