匿名PLSQL程序:
1.用文本编辑器书写代码,在SQL*Plus中运行。
2.代码可以存储在文件系统中。
3.不能被其他程序调用,也不能被其他用户执行。
4.不能接受参数,也不能传递参数。
命名PL/SQL程序:
创建:1.使用文本编辑器书写并在SQL*Plus中执行。2.使用过程创建工具(Procedure Builder)
存储:1.以编译对象的方式存储在数据库中。2.以库文件的方式存储在文件系统中。
能被其它程序调用。
能被其他用户执行。
服务器端:1.以数据库对象的方式存储在数据库中。2.在服务器上运行。
客户端:1.存储在客户端的文件系统中。2.在客户端运行。
命名PL/SQL程序类型:
程序单元(存储在客户端或服务器段)1.过程(Procedures),2.函数(Functions)
库文件(Libraries存储在客户端)
包(Packages存储在客户端或服务器端)
触发器(Triggers存储在服务器端)
程序单元:
过程(Procedures):1.可以接受和传递多个参数。2.可以调用其它程序单元。
函数(Functions):与过程类似,但必须有一个返回值。
参数:
1.用于向程序单元传入或程序单元用于传出数据的变量。
2.在过程的头部进行声明。
3.调用过程时,调用者要向被调用的过程传递参数值。
参数的模式:
1.传入参数(IN):用于向过程传入数据,只读型。
2.传出参数(OUT):用于接收过程输出数据,只写型。
3.传入传出参数(IN OUT):既可以I向过程传入数据,也可以接受过程传出数据,可读可写型。
创建过程:
CREATE OR REPLACE PROCEDURE procedure_name
(parameter1 mode datatype,
parameter2 mode datatype,...
)IS | AS
local variable declarations
BEGIN
program statements
EXCEPTION
exception handlers
END;
参数的类型:
形式参数:在过程头部声明。
实际参数:由过程调用者在施用时提供。
两者要匹配类型、数量和顺序
在SQL/Plus中调试程序:
1.定位出错的程序行并纠正错误。
2.用SHOW ERRORS命令查看出错的详细信息。
3.DBMS_OUTPUT.PUT_LINE命令输出中间结果,以此来跟踪程序的流程。
创建函数:
CREATE OR REPLACE FUNCTION function_name
(parameter1 mode datatype,
parameter2 mode datatype,...)
RETURN function_return_data_type
IS local variable declarations
BEGIN
program statements
RETURN return_value;
EXCEPTION
exception handlers
RETURN EXCEPTION_NOTICE;
END;
RETURN 命令:
1.在函数头部的RETURN命令用于定于函数返回值得类型。
2.在函数体的RETURN命令用于传递函数的实际返回值。
3.RETUEN EXCEPTION_NOTICE返回函数调用过程中的出错信息。
函数调用:
1.可以被其它过程和函数或匿名PL/SQL块调用。
2.也可以再SQL语句中进行调用
return_value := function(parameter1_value,....);
存储单元的对象权限:
1.存储程序单元可以看做是一个数据库对象。
2.要允许其它用户使用你的程序单元,必须给该用户授予EXCUTE权限。
使用其他用户下的存储单元:
1.你必须被授予相应的执行权限。
2.调用时在对象名前加上该对象所有者的用户名
return_value:=LHOWARD.my_function TO_DATE('01/02/1112','MM/DD/YYYY');
调用其他用户的过程:
使用过程名称,并为之提供相应的参数值的列表:procedure_name(parameter1_value, parameter2_value...);
程序单元的依赖性:
对象依赖:程序单元依赖于它所引用的数据库对象(表,视图,序列等。。。)
程序依赖:程序单元依赖于它所调用的其它程序单元。
直接依赖和间接依赖:
直接依赖:直接调用的程序或引用的数据库对象。
间接依赖:通过子程序调用的程序或引用的数据库对象。
有效性验证:如果一个数据库对象或程序单元发生了改变,则引用该对象或者调用该程序单元的程序
必须要重新进行编译。
包:1.存储在服务器端的程序库,2.包含,全局变量的声明,游标的定义,过程,函数。
包和库的区别:1.库必须要显式的链接到应用程序中去,而包是随时都是可以被调用的。
2.库总是运行在客户端。3.包总是运行在服务器端。
包的组成:
定义部分:用于声明所有的公共变量,游标,过程和函数。
包体部分:过程和函数的代码。
基本原理:1.定义部分对用户是可见的,说明如何使用包。2.包体部分是不可见的,用户不会关心具体的代码
在PL/Plus中创建包
CREATE OR REPLACE PACKAGE package_name IS
variable_name datatype;
PRODEDURE procedure_name(parameter_list)
FUNCTION function_name(parameter_list);
END;
调用包中的程序单元:
在过程名前加上其所在的包和名称:PACKAGE_NAME.program_unit_name(parameter_list);
例如:DBMS_OUTPUT.PUT_LINE('Hello World');
程序的重载:
重载:1.多个程序单元具有相同的名称,但接受不同的数据和类型的参数。
2.允许用户使用相同的命令,通过提供不同的参数,完成不同的调用请求。