文档库 最新最全的文档下载
当前位置:文档库 › ORACLE_PLSQL过程与函数

ORACLE_PLSQL过程与函数

ORACLE_PLSQL过程与函数
ORACLE_PLSQL过程与函数

本篇主要内容如下:

6.1 引言

6.2 创建函数

6.3 存储过程

6.3.1 创建过程

6.3.2 调用存储过程

6.3.3 AUTHID

6.3.4 PRAGMA AUTONOMOUS_TRANSACTION

6.3.5 开发存储过程步骤

6.3.6 删除过程和函数

6.3.7 过程与函数的比较

6.1 引言

过程与函数(另外还有包与触发器)是命名的PL/SQL块(也是用户的方案对象),被编译后存储在数据库中,以备执行。因此,其它PL/SQL块可以按名称来使用他们。所以,可以将商业逻辑、企业规则写成函数或过程保存到数据库中,以便共享。

过程和函数统称为PL/SQL子程序,他们是被命名的PL/SQL块,均存储在数据库中,并通过输入、输出参数或输入/输出参数与其调用者交换信息。过程和函数的唯一区别是函数总向调用者返回数据,而过程则不返回数据。在本节中,主要介绍:

1.创建存储过程和函数。

2.正确使用系统级的异常处理和用户定义的异常处理。

3.建立和管理存储过程和函数。

6.2 创建函数

1. 创建函数

语法如下:

CREATE[OR REPLACE]FUNCTION function_name

(arg1 [ { IN | OUT | IN OUT }] type1 [DEFAULT value1],

[arg2 [ { IN | OUT | IN OUT }] type2 [DEFAULT value1]],

......

[argn [ { IN | OUT | IN OUT }] typen [DEFAULT valuen]])

[ AUTHID DEFINER | CURRENT_USER ]

RETURN return_type

IS|AS

<类型.变量的声明部分>

BEGIN

执行部分

RETURN expression

EXCEPTION

异常处理部分

END function_name;

●IN,OUT,IN OUT是形参的模式。若省略,则为IN模式。IN模式的形参只能将实参传递给形参,进入函数内部,但只能读不能写,函数返回时实参的值不变。OUT 模式的形参会忽略调用时的实参值(或说该形参的初始值总是NULL),但在函数内部可以被读或写,函数返回时形参的值会赋予给实参。IN OUT具有前两种模式的特性,即调用时,实参的值总是传递给形参,结束时,形参的值传递给实参。调用时,对于IN 模式的实参可以是常量或变量,但对于OUT和IN OUT模式的实参必须是变量。

●一般,只有在确认function_name函数是新函数或是要更新的函数时,才使

用OR REPALCE关键字,否则容易删除有用的函数。

例1.获取某部门的工资总和:

--获取某部门的工资总和

CREATE OR REPLACE

FUNCTION get_salary(

Dept_no NUMBER,

Emp_count OUT NUMBER)

RETURN NUMBER

IS

V_sum NUMBER;

BEGIN

SELECT SUM(SALARY), count(*) INTO V_sum, emp_count

FROM EMPLOYEES WHERE DEPARTMENT_ID=dept_no;

RETURN v_sum;

EXCEPTION

WHEN NO_DATA_FOUND THEN

DBMS_OUTPUT.PUT_LINE('你需要的数据不存在!');

WHEN OTHERS THEN

DBMS_OUTPUT.PUT_LINE(SQLCODE||'---'||SQLERRM);

END get_salary;

2. 函数的调用

函数声明时所定义的参数称为形式参数,应用程序调用时为函数传递的参数称为实际参数。应用程序在调用函数时,可以使用以下三种方法向函数传递参数:

第一种参数传递格式:位置表示法。

即在调用时按形参的排列顺序,依次写出实参的名称,而将形参与实参关联起来进行传递。用这种方法进行调用,形参与实参的名称是相互独立,没有关系,强调次序才是重要的。

格式为:

argument_value1[,argument_value2 …]

例2:计算某部门的工资总和:

DECLARE

V_num NUMBER;

V_sum NUMBER;

BEGIN

V_sum :=get_salary(10, v_num);

DBMS_OUTPUT.PUT_LINE('部门号为:10的工资总和:'||v_sum||',人数为:'||v_num); END;

第二种参数传递格式:名称表示法。

即在调用时按形参的名称与实参的名称,写出实参对应的形参,而将形参与实参关联起来进行传递。这种方法,形参与实参的名称是相互独立的,没有关系,名称的对应关系才是最重要的,次序并不重要。

格式为:

argument => parameter [,…]

其中:argument 为形式参数,它必须与函数定义时所声明的形式参数名称相同parameter 为实际参数。

在这种格式中,形势参数与实际参数成对出现,相互间关系唯一确定,所以参数的顺序可以任意排列。

例3:计算某部门的工资总和:

DECLARE

V_num NUMBER;

V_sum NUMBER;

BEGIN

V_sum :=get_salary(emp_count => v_num, dept_no =>10);

DBMS_OUTPUT.PUT_LINE('部门号为:10的工资总和:'||v_sum||',人数为:'||v_num); END;

第三种参数传递格式:组合传递。

即在调用一个函数时,同时使用位置表示法和名称表示法为函数传递参数。采用这种参数传递方法时,使用位置表示法所传递的参数必须放在名称表示法所传递的参数前面。也就是说,无论函数具有多少个参数,只要其中有一个参数使用名称表示法,其后所有的参数都必须使用名称表示法。

例4:

CREATE OR REPLACE FUNCTION demo_fun(

Name VARCHAR2,--注意VARCHAR2不能给精度,如:VARCHAR2(10),其它类似

Age INTEGER,

Sex VARCHAR2)

RETURN VARCHAR2

AS

V_var VARCHAR2(32);

BEGIN

V_var := name||':'||TO_CHAR(age)||'岁.'||sex;

RETURN v_var;

END;

DECLARE

Var VARCHAR(32);

BEGIN

Var := demo_fun('user1', 30, sex =>'男');

DBMS_OUTPUT.PUT_LINE(var);

Var := demo_fun('user2', age =>40, sex =>'男');

DBMS_OUTPUT.PUT_LINE(var);

Var := demo_fun('user3', sex =>'女', age =>20);

DBMS_OUTPUT.PUT_LINE(var);

END;

无论采用哪一种参数传递方法,实际参数和形式参数之间的数据传递只有两种方法:传址法和传值法。所谓传址法是指在调用函数时,将实际参数的地址指针传递给形式参数,使形式参数和实际参数指向内存中的同一区域,从而实现参数数据的传递。这种方法又称作参照法,即形式参数参照实际参数数据。输入参数均采用传址法传递数据。

传值法是指将实际参数的数据拷贝到形式参数,而不是传递实际参数的地址。默认时,输出参数和输入/输出参数均采用传值法。在函数调用时,ORACLE将实际参数数据拷贝到输入/输出参数,而当函数正常运行退出时,又将输出形式参数和输入/输出形式参数数据拷贝到实际参数变量中。

3. 参数默认值

在CREATE OR REPLACE FUNCTION语句中声明函数参数时可以使用DEFAULT关键字为输入参数指定默认值。

例5:

CREATE OR REPLACE FUNCTION demo_fun(

Name VARCHAR2,

Age INTEGER,

Sex VARCHAR2DEFAULT'男')

RETURN VARCHAR2

AS

V_var VARCHAR2(32);

BEGIN

V_var := name||':'||TO_CHAR(age)||'岁.'||sex;

RETURN v_var;

END;

具有默认值的函数创建后,在函数调用时,如果没有为具有默认值的参数提供实际参数值,函数将使用该参数的默认值。但当调用者为默认参数提供实际参数时,函数将使用实际参数值。在创建函数时,只能为输入参数设置默认值,而不能为输入/输出参数设置默认值。

DECLARE

var VARCHAR(32);

BEGIN

Var := demo_fun('user1', 30);

DBMS_OUTPUT.PUT_LINE(var);

Var := demo_fun('user2', age => 40);

DBMS_OUTPUT.PUT_LINE(var);

Var := demo_fun('user3', sex => '女', age => 20);

DBMS_OUTPUT.PUT_LINE(var);

END;

6.3 存储过程

6.3.1 创建过程

建立存储过程

在ORACLE SERVER上建立存储过程,可以被多个应用程序调用,可以向存储过程传递参数,也可以向存储过程传回参数.

创建过程语法:

CREATE[OR REPLACE]PROCEDURE procedure_name

([arg1 [ IN | OUT | IN OUT ]] type1 [DEFAULT value1],

[arg2 [ IN | OUT | IN OUT ]] type2 [DEFAULT value1]], ......

[argn [ IN | OUT | IN OUT ]] typen [DEFAULT valuen]) [ AUTHID DEFINER | CURRENT_USER ]

{ IS|AS }

<声明部分>

BEGIN

<执行部分>

EXCEPTION

<可选的异常错误处理程序>

END procedure_name;

说明:相关参数说明参见函数的语法说明。

例6.用户连接登记记录;

CREATE TABLE logtable (userid VARCHAR2(10), logdate date);

CREATE OR REPLACE PROCEDURE logexecution

IS

BEGIN

INSERT INTO logtable (userid, logdate) VALUES (USER, SYSDATE); END;

例7.删除指定员工记录;

CREATE OR REPLACE

PROCEDURE DelEmp

(v_empno IN employees.employee_id%TYPE)

AS

No_result EXCEPTION;

BEGIN

DELETE FROM employees WHERE employee_id = v_empno;

IF SQL%NOTFOUND THEN

RAISE no_result;

END IF;

DBMS_OUTPUT.PUT_LINE('编码为'||v_empno||'的员工已被删除!');

EXCEPTION

WHEN no_result THEN

DBMS_OUTPUT.PUT_LINE('温馨提示:你需要的数据不存在!');

WHEN OTHERS THEN

DBMS_OUTPUT.PUT_LINE(SQLCODE||'---'||SQLERRM);

END DelEmp;

例8.插入员工记录:

CREATE OR REPLACE

PROCEDURE InsertEmp(

v_empno in employees.employee_id%TYPE,

v_firstname in employees.first_name%TYPE,

v_lastname in https://www.wendangku.net/doc/c818710372.html,st_name%TYPE,

v_deptno in employees.department_id%TYPE

)

AS

empno_remaining EXCEPTION;

PRAGMA EXCEPTION_INIT(empno_remaining, -1);

/* -1 是违反唯一约束条件的错误代码 */

BEGIN

INSERT INTO EMPLOYEES(EMPLOYEE_ID, FIRST_NAME, LAST_NAME, HIRE_DATE,DEPARTMENT_ID)

VALUES(v_empno, v_firstname,v_lastname, sysdate, v_deptno);

DBMS_OUTPUT.PUT_LINE('温馨提示:插入数据记录成功!');

EXCEPTION

WHEN empno_remaining THEN

DBMS_OUTPUT.PUT_LINE('温馨提示:违反数据完整性约束!');

WHEN OTHERS THEN

DBMS_OUTPUT.PUT_LINE(SQLCODE||'---'||SQLERRM);

END InsertEmp;

例9.使用存储过程向departments表中插入数据。

CREATE OR REPLACE

PROCEDURE insert_dept

(v_dept_id IN departments.department_id%TYPE,

v_dept_name IN departments.department_name%TYPE,

v_mgr_id IN departments.manager_id%TYPE,

v_loc_id IN departments.location_id%TYPE)

IS

ept_null_error EXCEPTION;

PRAGMA EXCEPTION_INIT(ept_null_error, -1400);

ept_no_loc_id EXCEPTION;

PRAGMA EXCEPTION_INIT(ept_no_loc_id, -2291);

BEGIN

INSERT INTO departments

(department_id, department_name, manager_id, location_id) VALUES

(v_dept_id, v_dept_name, v_mgr_id, v_loc_id);

DBMS_OUTPUT.PUT_LINE('插入部门'||v_dept_id||'成功'); EXCEPTION

WHEN DUP_VAL_ON_INDEX THEN

RAISE_APPLICATION_ERROR(-20000, '部门编码不能重复');

WHEN ept_null_error THEN

RAISE_APPLICATION_ERROR(-20001, '部门编码、部门名称不能为空');

WHEN ept_no_loc_id THEN

RAISE_APPLICATION_ERROR(-20002, '没有该地点');

END insert_dept;

/*调用实例一:

DECLARE

ept_20000 EXCEPTION;

PRAGMA EXCEPTION_INIT(ept_20000, -20000);

ept_20001 EXCEPTION;

PRAGMA EXCEPTION_INIT(ept_20001, -20001);

ept_20002 EXCEPTION;

PRAGMA EXCEPTION_INIT(ept_20002, -20002);

BEGIN

insert_dept(300, '部门300', 100, 2400);

insert_dept(310, NULL, 100, 2400);

insert_dept(310, '部门310', 100, 900);

EXCEPTION

WHEN ept_20000 THEN

DBMS_OUTPUT.PUT_LINE('ept_20000部门编码不能重复');

WHEN ept_20001 THEN

DBMS_OUTPUT.PUT_LINE('ept_20001部门编码、部门名称不能为空');

WHEN ept_20002 THEN

DBMS_OUTPUT.PUT_LINE('ept_20002没有该地点');

WHEN OTHERS THEN

DBMS_OUTPUT.PUT_LINE('others出现了其他异常错误');

END;

调用实例二:

DECLARE

ept_20000 EXCEPTION;

PRAGMA EXCEPTION_INIT(ept_20000, -20000);

ept_20001 EXCEPTION;

PRAGMA EXCEPTION_INIT(ept_20001, -20001);

ept_20002 EXCEPTION;

PRAGMA EXCEPTION_INIT(ept_20002, -20002);

BEGIN

insert_dept(v_dept_name => '部门310', v_dept_id => 310,

v_mgr_id => 100, v_loc_id => 2400);

insert_dept(320, '部门320', v_mgr_id => 100, v_loc_id => 900);

EXCEPTION

WHEN ept_20000 THEN

DBMS_OUTPUT.PUT_LINE('ept_20000部门编码不能重复');

WHEN ept_20001 THEN

DBMS_OUTPUT.PUT_LINE('ept_20001部门编码、部门名称不能为空');

WHEN ept_20002 THEN

DBMS_OUTPUT.PUT_LINE('ept_20002没有该地点');

WHEN OTHERS THEN

DBMS_OUTPUT.PUT_LINE('others出现了其他异常错误');

END;

*/

6.3.2 调用存储过程

存储过程建立完成后,只要通过授权,用户就可以在SQLPLUS 、ORACLE开发工具或第三方开发工具中来调用运行。对于参数的传递也有三种:按位置传递、按名称传递和组合传递,传递方法与函数的一样。ORACLE 使用EXECUTE 语句来实现对存储过程的调用:

EXEC[UTE] procedure_name( parameter1, parameter2…);

例10:

EXECUTE logexecution;

例11:查询指定员工记录;

CREATE OR REPLACE

PROCEDURE QueryEmp

(v_empno IN employees.employee_id%TYPE,

v_ename OUT employees.first_name%TYPE,

v_sal OUT employees.salary%TYPE)

AS

BEGIN

SELECT last_name || last_name, salary INTO v_ename, v_sal

FROM employees

WHERE employee_id = v_empno;

DBMS_OUTPUT.PUT_LINE('温馨提示:编码为'||v_empno||'的员工已经查到!'); EXCEPTION

WHEN NO_DATA_FOUND THEN

DBMS_OUTPUT.PUT_LINE('温馨提示:你需要的数据不存在!');

WHEN OTHERS THEN

DBMS_OUTPUT.PUT_LINE(SQLCODE||'---'||SQLERRM);

END QueryEmp;

--调用

DECLARE

v1 employees.first_name%TYPE;

v2 employees.salary%TYPE;

BEGIN

QueryEmp(100, v1, v2);

DBMS_OUTPUT.PUT_LINE('姓名:'||v1);

DBMS_OUTPUT.PUT_LINE('工资:'||v2);

QueryEmp(103, v1, v2);

DBMS_OUTPUT.PUT_LINE('姓名:'||v1);

DBMS_OUTPUT.PUT_LINE('工资:'||v2);

QueryEmp(104, v1, v2);

DBMS_OUTPUT.PUT_LINE('姓名:'||v1);

DBMS_OUTPUT.PUT_LINE('工资:'||v2);

END;

例12.计算指定部门的工资总和,并统计其中的职工数量。

CREATE OR REPLACE

PROCEDURE proc_demo

(

dept_no NUMBER DEFAULT10,

sal_sum OUT NUMBER,

emp_count OUT NUMBER

)

IS

BEGIN

SELECT SUM(salary), COUNT(*) INTO sal_sum, emp_count

FROM employees WHERE department_id = dept_no;

EXCEPTION

WHEN NO_DATA_FOUND THEN

DBMS_OUTPUT.PUT_LINE('温馨提示:你需要的数据不存在!');

WHEN OTHERS THEN

DBMS_OUTPUT.PUT_LINE(SQLCODE||'---'||SQLERRM);

END proc_demo;

DECLARE

V_num NUMBER;

V_sum NUMBER(8, 2);

BEGIN

Proc_demo(30, v_sum, v_num);

DBMS_OUTPUT.PUT_LINE('温馨提示:30号部门工资总和:'||v_sum||',人数:'||v_num);

Proc_demo(sal_sum => v_sum, emp_count => v_num);

DBMS_OUTPUT.PUT_LINE('温馨提示:10号部门工资总和:'||v_sum||',人数:'||v_num); END;

在PL/SQL 程序中还可以在块内建立本地函数和过程,这些函数和过程不存储在数据库中,但可以在创建它们的PL/SQL 程序中被重复调用。本地函数和过程在PL/SQL 块的声明部分定义,它们的语法格式与存储函数和过程相同,但不能使用CREATE OR REPLACE 关键字。

例13:建立本地过程,用于计算指定部门的工资总和,并统计其中的职工数量;

DECLARE

V_num NUMBER;

V_sum NUMBER(8, 2);

PROCEDURE proc_demo

(

Dept_no NUMBER DEFAULT10,

Sal_sum OUT NUMBER,

Emp_count OUT NUMBER

)

IS

BEGIN

SELECT SUM(salary), COUNT(*) INTO sal_sum, emp_count

FROM employees WHERE department_id=dept_no;

EXCEPTION

WHEN NO_DATA_FOUND THEN

DBMS_OUTPUT.PUT_LINE('你需要的数据不存在!');

WHEN OTHERS THEN

DBMS_OUTPUT.PUT_LINE(SQLCODE||'---'||SQLERRM);

END proc_demo;

--调用方法:

BEGIN

Proc_demo(30, v_sum, v_num);

DBMS_OUTPUT.PUT_LINE('30号部门工资总和:'||v_sum||',人数:'||v_num);

Proc_demo(sal_sum => v_sum, emp_count => v_num);

DBMS_OUTPUT.PUT_LINE('10号部门工资总和:'||v_sum||',人数:'||v_num);

END;

6.3.3 AUTHID

过程中的AUTHID 指令可以告诉ORACLE ,这个过程使用谁的权限运行.默任情况下,存储过程会作为调用者的过程运行,但是具有设计者的特权.这称为设计者权利运行.

例14:建立过程,使用AUTOID DEFINER;

Connect HR/qaz

DROP TABLE logtable;

CREATE table logtable (userid VARCHAR2(10), logdate date);

CREATE OR REPLACE PROCEDURE logexecution

AUTHID DEFINER

IS

BEGIN

INSERT INTO logtable (userid, logdate) VALUES (USER, SYSDATE);

END;

GRANT EXECUTE ON logexecution TO PUBLIC;

CONNECT /AS SYSDBA

GRANT CONNECT TO testuser1 IDENTIFIED BY userpwd1;

CONNECT testuser1/userpwd1

INSERT INTO HR.LOGTABLE VALUES (USER, SYSDATE);

EXECUTE HR.logexecution

CONNECT HR/qaz

SELECT*FROM HR.logtable;

例15:建立过程,使用AUTOID CURRENT_USER;

CONNECT HR/qaz

CREATE OR REPLACE PROCEDURE logexecution

AUTHID CURRENT_USER

IS

BEGIN

INSERT INTO logtable (userid, logdate) VALUES (USER, SYSDATE);

END;

GRANT EXECUTE ON logexecution TO PUBLIC;

CONNECT testuser1/userpwd1

INSERT INTO HR.LOGTABLE VALUES (USER, SYSDATE);

EXECUTE HR.logexecution

6.3.4 PRAGMA AUTONOMOUS_TRANSACTION

ORACLE8i 可以支持事务处理中的事务处理的概念.这种子事务处理可以完成它自己的工作,独立于父事务处理进行提交或者回滚.通过使用这种方法,开发者就能够这样的过程,无论父事务处理是提交还是回滚,它都可以成功执行.

例16:建立过程,使用自动事务处理进行日志记录;

DROP TABLE logtable;

CREATE TABLE logtable(

Username varchar2(20),

Dassate_time date,

Mege varchar2(60)

);

CREATE TABLE temp_table( N number );

CREATE OR REPLACE PROCEDURE log_message(p_message varchar2) AS

PRAGMA AUTONOMOUS_TRANSACTION;

BEGIN

INSERT INTO logtable VALUES ( user, sysdate, p_message ); COMMIT;

END log_message;

BEGIN

Log_message (‘About to insert into temp_table‘);

INSERT INTO temp_table VALUES (1);

Log_message (‘Rollback to insert into temp_table‘); ROLLBACK;

END;

SELECT*FROM logtable;

SELECT*FROM temp_table;

例17:建立过程,没有使用自动事务处理进行日志记录;

CREATE OR REPLACE PROCEDURE log_message(p_message varchar2) AS

BEGIN

INSERT INTO logtable VALUES ( user, sysdate, p_message ); COMMIT;

END log_message;

BEGIN

Log_message ('About to insert into temp_table');

INSERT INTO temp_table VALUES (1);

Log_message ('Rollback to insert into temp_table'); ROLLBACK;

END;

SELECT*FROM logtable;

SELECT*FROM temp_table;

6.3.5 开发存储过程步骤

开发存储过程、函数、包及触发器的步骤如下:

6.3.5.1 使用文字编辑处理软件编辑存储过程源码

使用文字编辑处理软件编辑存储过程源码,要用类似WORD 文字处理软件进行编辑时,要将源码存为文本格式。

6.3.5.2 在SQLPLUS或用调试工具将存储过程程序进行解释

在SQLPLUS或用调试工具将存储过程程序进行解释;

在SQL>下调试,可用START 或GET 等ORACLE命令来启动解释。如:SQL>START c:\stat1.sql

如果使用调式工具,可直接编辑和点击相应的按钮即可生成存储过程。

6.3.5.3 调试源码直到正确

我们不能保证所写的存储过程达到一次就正确。所以这里的调式是每个程序员必须进行的工作之一。在SQLPLUS下来调式主要用的方法是:

●使用SHOW ERROR命令来提示源码的错误位置;

●使用user_errors 数据字典来查看各存储过程的错误位置。

6.3.5.4 授权执行权给相关的用户或角色

如果调式正确的存储过程没有进行授权,那就只有建立者本人才可以运行。所以作为应用系统的一部分的存储过程也必须进行授权才能达到要求。在SQL*PLUS下可以用GRANT命令来进行存储过程的运行授权。

GRANT语法:

GRANT system_privilege | role

TO user| role |PUBLIC[WITH ADMIN OPTION]

GRANT object_privilege |ALL ON schema.object

TO user| role |PUBLIC[WITH GRANT OPTION]

--例子:

CREATE OR REPLACE PUBLIC SYNONYM dbms_job FOR dbms_job

GRANT EXECUTE ON dbms_job TO PUBLIC WITH GRANT OPTION

6.3.5.5 与过程相关数据字典

USER_SOURCE, ALL_SOURCE, DBA_SOURCE, USER_ERRORS,

ALL_PROCEDURES,USER_OBJECTS,ALL_OBJECTS,DBA_OBJECTS

相关的权限:

CREATE ANY PROCEDURE

DROP ANY PROCEDURE

在SQL*PLUS 中,可以用DESCRIBE 命令查看过程的名字及其参数表。

DESC[RIBE] Procedure_name;

6.3.6 删除过程和函数

1.删除过程

可以使用DROP PROCEDURE命令对不需要的过程进行删除,语法如下:

DROP PROCEDURE [user.]Procudure_name;

2.删除函数

可以使用DROP FUNCTION 命令对不需要的函数进行删除,语法如下:

DROP FUNCTION[user.]Function_name;

--删除上面实例创建的存储过程与函数

DROP PROCEDURE logexecution;

DROP PROCEDURE delemp;

DROP PROCEDURE insertemp;

DROP PROCEDURE fireemp;

DROP PROCEDURE queryemp;

DROP PROCEDURE proc_demo;

DROP PROCEDURE log_message;

DROP FUNCTION demo_fun;

DROP FUNCTION get_salary;

6.3.7 过程与函数的比较

使用过程与函数具有如下优点:

1、共同使用的代码可以只需要被编写和测试一次,而被需要该代码的任何应用程序(如:.NET、C++、JAVA、VB程序,也可以是DLL库)调用。

2、这种集中编写、集中维护更新、大家共享(或重用)的方法,简化了应用程序的开发和维护,提高了效率与性能。

3、这种模块化的方法,使得可以将一个复杂的问题、大的程序逐步简化成几个简单的、小的程序部

分,进行分别编写、调试。因此使程序的结构清晰、简单,也容易实现。

4、可以在各个开发者之间提供处理数据、控制流程、提示信息等方面的一致性。

5、节省内存空间。它们以一种压缩的形式被存储在外存中,当被调用时才被放入内存进行处理。并且,如果多个用户要执行相同的过程或函数时,就只需要在内存中加载一个该过程或函数。

6、提高数据的安全性与完整性。通过把一些对数据的操作放到过程或函数中,就可以通过是否授予用户有执行该过程或的权限,来限制某些用户对数据进行这些操作。

过程与函数的相同功能有:

1、都使用IN模式的参数传入数据、OUT模式的参数返回数据。

2、输入参数都可以接受默认值,都可以传值或传引导。

3、调用时的实际参数都可以使用位置表示法、名称表示法或组合方法。

4、都有声明部分、执行部分和异常处理部分。

5、其管理过程都有创建、编译、授权、删除、显示依赖关系等。

使用过程与函数的原则:

1、如果需要返回多个值和不返回值,就使用过程;如果只需要返回一个值,就使用函数。

2、过程一般用于执行一个指定的动作,函数一般用于计算和返回一个值。

3、可以SQL语句内部(如表达式)调用函数来完成复杂的计算问题,但不能调用过程。所以这是函数的特色。

oracle自定义函数和存储过程

oracle自定义函数和存储过程 oracle自定义函数和存储过程(转)2008-07-23 10:43--过程(PROCEDURE)--------------------------------------------------// --创建表 CREATE TABLE user_info ( id VARCHAR2(4), name VARCHAR2(15), pwd VARCHAR2(15), address VARCHAR2(30) ); --插入数据 INSERT INTO user_info VALUES('u001','zhao','zhao','shanghai'); --如要经常执行插入,Oracle每次都要进行编译,并判断语法正确性,因此执行速度可想而知, --所以我们要创建一个过程来实现 CREATE OR REPLACE PROCEDURE AddNewUser ( n_id user_info.id%TYPE, n_name user_https://www.wendangku.net/doc/c818710372.html,%TYPE, n_pwd user_info.pwd%TYPE, n_address user_info.address%TYPE ) AS BEGIN --向表中插入数据 INSERT INTO user_info(id,name,pwd,address) VALUES(n_id,n_name,n_pwd,n_address); END AddNewUser; / --下面我们利用PL/SQL匿名块调用该过程 DECLARE --描述新用户的变量 v_id user_info.id%TYPE := 'u002'; v_name user_https://www.wendangku.net/doc/c818710372.html,%TYPE := 'wish'; v_pwd user_info.pwd%TYPE := 'history'; v_add user_info.address%TYPE := 'shanghai'; BEGIN --调用过程,添加wish用户到数据库

Oracle 常见函数(一)——数值函数

Oracle常见数值函数 ----***特别说明***: x 可以是纯的数值,也可以是数值型表达式/* ABS(x)返回x绝对值 eg. */ selectabs(100),abs(-100) from dual; /* sign(x)判断x的正负,正数返回1,负数返回-1,0返回0; eg. */ selectsign(100),sign(-100),sign(0) from dual;

/* round(x[,n])对x进行四舍五入,保留n位小数,其中n采用其整数部分; 没有n时默认四舍五入到整数位,n为负数时,四舍五入保留小数点左边n位(补零), eg. */ selectround(5555.6666, 2.1), round(5555.6666, -2.6), round(5555.6666) from dual; /* trunc(x)对x进行直接截取,保留n位小数,其中n采用其整数部分; 没有n时默认截取到整数位,n为负数时,截取保留小数点左边n位(补零), eg. */ selecttrunc(5555.66666,2.1), trunc(5555.66666,-2.6), trunc(5555.033333) from dual; /* ceil(x)对x进行向上取整,返回不小于x的最小整数(可以是整数x本身)。

eg. */ selectceil(3.1), ceil(2.8+1.3), ceil(0) from dual; /* floor(x)对x进行向下取整,返回不大于x的最大整数(可以是整数x本身)。eg. */ selectfloor(3.1), floor(2.8+1.3), floor(0) from dual; /* mod(x,y)求x除以y的余数,x,y为数字型表达式。 eg. */ selectmod(23,8),mod(24,8) from dual;

oracle存储过程讲解及实例

存储过程 1 CREATE OR REPLACE PROCEDURE 存储过程名 2 IS 3 BEGIN 4 NULL; 5 END; 行1: CREATE OR REPLACE PROCEDURE 是一个SQL语句通知Oracle数据库去创建一个叫做skeleton存储过程, 如果存在就覆盖它; 行2: IS关键词表明后面将跟随一个PL/SQL体。 行3: BEGIN关键词表明PL/SQL体的开始。 行4: NULL PL/SQL语句表明什么事都不做,这句不能删去,因为PL/SQL体中至少需要有一句; 行5: END关键词表明PL/SQL体的结束

存储过程创建语法: create or replace procedure 存储过程名(param1 in type,param2 out type) as 变量1 类型(值范围); --vs_msg VARCHAR2(4000); 变量2 类型(值范围); Begin Select count(*) into 变量1 from 表A where列名 =param1; If (判断条件) then Select 列名into 变量2 from 表A where列名 =param1; Dbms_output。Put_line(‘打印信息’); Elsif (判断条件) then Dbms_output。Put_line(‘打印信息’); Else Raise 异常名(NO_DATA_FOUND); End if; Exception When others then Rollback;

End; 注意事项: 1,存储过程参数不带取值范围,in表示传入,out表示输出 类型可以使用任意Oracle中的合法类型。 2,变量带取值范围,后面接分号 3,在判断语句前最好先用count(*)函数判断是否存在该条操作记录 4,用select 。。。into。。。给变量赋值 5,在代码中抛异常用 raise+异常名 CREATE OR REPLACE PROCEDURE存储过程名 ( --定义参数 is_ym IN CHAR(6) ,

第1章随机信号概论特征函数随机过程统计特性

1.4 随机变量的特征函数 引言:分布函数:反映随机变量的统计规律性。 数字特征:反映、掌握分布函数的某些特征。矩是最主要的特征,但随着矩的阶数的 增高,计算机较麻烦,寻求一种有效的方法来计算。 特征函数:一种计算各阶矩的有效工具。特别是计算、处理多个随机变量,特征函数 显示其优越性一。 1.4.1 特征函数的定义 (1) 设X 是定义在概率空间),,(P F S 上的随机变量,它的分布函数为)(x F ,称juX e 的 数学期望)(juX e E 为X 的特征函数,记为)(u C X 。 当X 为离散型随机变量时,其特征函数为: ∑∞ ====1 )()()(i i jux juX X x X P e e E u C i 当X 为连续型随机变量时,其特征函数为: ?+∞ ∞ -==dx x p e e E u C jux juX X )()()( (2) 利用特征函数求概率密度函数 ? +∞ ∞ --= du u C e x p X jux )(21 )(π 证明:利用傅里叶变换与反变换关系可证明。 举例: 例1:求标准正态分布)1,0(N 的特征函数。 2 2 2221)()(u jux x juX X e dx e e e E u C - ∞ +∞ -- ===? π 1.4.2 特征函数的性质 (1) 1)(≤u C X 1)0(=X C (2) 两两相互独立的随机变量之和的特征函数等于各个随机变量的特征函数之积,即: 若∑== n k k X Y 1 ,式中n X X X Λ,,21为n 个两两相互独立的随机变量,则 ∏==n k X Y u C u C k 1 )()(

oracle-存储过程练习题

1.创建用户kaifa(密码亦为kaifa),并分配connect,create table,resource权限。 CREATE user KAIFA IDENTIFIED BY KAIFA DEFAULT TABLESPACE HOSDATA TEMPOARY TABLESPACE TEMPDATA; GRANT CONNECT , CREATE TABLE , RESOURCE TO KAIFA 2.在做报表统计时,需要根据报表日期和币种从概要表中查询本期余额。 概要表(CCB_GYB)信息如下: --RMB 人民币 --CNY 本位币 --USD 外币折美元 如果币种为RMB,则取出人民币余额作为本期余额;为CNY,则取本位币余额;为USD 则取外币折美元余额。 请编写一个函数GetCurrBal( qrp_rq IN VARCHAR2, --报表日期 qrp_code IN VARCHAR2--币种 ) CREATE OR REPLACE FUNCTION GetCurrBal( Vqrp_rq Date , --报表日期 Vqrp_code VARCHAR2--币种 ) RETURN NUMBER IS VAMOUNT NUMBER ; VDATE Date; BEGIN SELECT ACCOUNTING_DATE INTO VDATE FROM CCB_GYB Where ACCOUNTING_DATE = Vqrp_rq; IF Vqrp_code = 'RMB'THEN SELECT RMB_YTD_BALANCE INTO VAMOUNT FROM CCB_GYB WHERE Vqrp_code= 'RMB' AND ACCOUNTING_DATE= VDATE; ELSE IF Vqrp_code = 'CNY'THEN SELECT CNY_YTD_BALANCE INTO VAMOUNT FROM CCB_GYB WHERE Vqrp_code= 'CNY';

oracle中常用函数大全

oracle中常用函数大全 1、数值型常用函数 函数返回值样例显示 ceil(n) 大于或等于数值n的最小整数select ceil(10.6) from dual; 11 floor(n) 小于等于数值n的最大整数select ceil(10.6) from dual; 10 mod(m,n) m除以n的余数,若n=0,则返回m select mod(7,5) from dual; 2 power(m,n) m的n次方select power(3,2) from dual; 9 round(n,m) 将n四舍五入,保留小数点后m位select round(1234.5678,2) from dual; 1234.57 sign(n) 若n=0,则返回0,否则,n>0,则返回1,n<0,则返回-1 select sign(12) from dual; 1 sqrt(n) n的平方根select sqrt(25) from dual ; 5 2、常用字符函数 initcap(char) 把每个字符串的第一个字符换成大写select initicap('mr.ecop') from dual; Mr.Ecop lower(char) 整个字符串换成小写select lower('MR.ecop') from dual; mr.ecop replace(char,str1,str2) 字符串中所有str1换成str2 select replace('Scott','s','Boy') from dual; Boycott substr(char,m,n) 取出从m字符开始的n个字符的子串select substr('ABCDEF',2,2) from dual; CD length(char) 求字符串的长度select length('ACD') from dual; 3 || 并置运算符select 'ABCD'||'EFGH' from dual; ABCDEFGH 3、日期型函数 sysdate当前日期和时间select sysdate from dual;

随机过程参考题

2014-2015随机过程参考题 一.判断题 1.若随机变量的特征函数存在,则可以用它来刻画随机变量的概率分布. ( ) 2.对于独立的随机变量1,,n X X ,都有[]11 n n k k k k E X E X ==??=????∏∏. ( ) 3.若12(,, )n F x x x 是随机向量1=, ,)n X X X (的联合分布函数,则它对每个变量都是 单调不减的. ( ) 4.一个随机过程的有限维分布具有对称性和相容性. ( ) 5.非齐次泊松过程一定具有独立增量性和平稳增量性. ( ) 6.参数为λ的泊松过程第n 次与第1n -次事件发生的时间间隔n X 服从参数为n 和n λ的Γ分布. ( ) 7.复合P o i s s o n 过 程一定是计数过程. ( ) 8.若随机变量X 服从周期为d 的格点分布,则对自然数n 总有{}0P X nd =>.( ) 9.设,i j 是离散时间马氏链的两个互通的状态,则它们的周期相等. ( ) 10.离散时间马尔科夫链的转移矩阵的行和列的和均为1 . ( ) 11.一个随机变量的分布函数和特征函数相互唯一确定. ( ) 12.对独立的随机变量1, ,n X X ,都有[]1 1n n k k k k Var X Var X ==??=????∑∏. ( ) 13.一个随机过程的有限维分布族一定是具有对称性和相容性的分布族。 ( ) 14.若一个随机过程的协方差函数,s t γ()只与时间差t s -有关,则它一定是宽平稳过 程. ( ) 15.参数为λ的泊松过程中,第n 次事件发生的时刻n T 服从参数为λ的指数分布.( ) 16.非齐次泊松过程不具有独立增量性,但具有平稳增量性. ( ) 17.更新过程在有限时间内最多只能发生有限次更新. ( ) 18.更新过程的更新函数()M t 是t 的单调不增函数. ( ) 19.马尔科夫链具有无后效性. ( ) 20.Poisson 过程是更新过程. ( ) 具有对称性和相容性的分布族一定是某个随机过程的有限维分布族。 ( ) 21.若一个随机过程是宽平稳的,则它一定是严平稳的。 ( )

Oracle常用函数及使用案例(珍藏版)

Oracle常用函数及使用案例(珍藏版) 一:sql函数: lower(char):将字符串转化为小写的格式。 upper(char):将字符串转化为大写的格式。 length(char):返回字符串的长度。 substr(char,m,n):取字符串的字串。 案例1.将所有员工的名字按小写的方式显示 select lower(ename),sal from emp; 案例2.将所有员工的名字按大写的方式显示。 select upper(ename),sal from emp; 案例3.显示正好为五个字符的的员工的姓名。 select * from emp where length(ename)=5; 案例4.显示所有员工姓名的前三个字符。 select substr(ename,1,3) from emp;//从名字的第一个字符开始取,向后取三个字符。 案例5.以首字母为大写的方式显示所有员工的姓名。 (1)首字母大写:select upper(substr(ename,1,1)) from emp; (2)完成后面字母小写。select lower(substr(ename,2,length(ename)-1)) from emp; (3)合并select upper(substr(ename,1,1))||lower(substr(ename,2,length(ename)-1)) from emp; 案例6.以首字母为小写的方式显示所有员工的姓名。(需要有较高的灵活度,细心分析和清晰思路) (1)首字母小写:select upper(substr(ename,1,1)) from emp; (2)完成后面字母大写。select lower(substr(ename,2,length(ename)-1)) from emp; (3)合并select lower(substr(ename,1,1))||upper(substr(ename,2,length(ename)-1)) from emp; 案例7.函数(替换):replace(char1,search_string,replace_string); 显示所有员工的姓名,用“我要替换A”替代所有“A”。 select replace(ename,'A','我是老鼠')from emp; 案例8.以首字母为小写的方式显示所有员工的姓名。 select replace(ename,substr(ename,1,1),lower(substr(ename,1,1)))from emp; 案例9.以首字母为大写的方式显示所有员工的姓名。 Select replace(ename,substr(ename,2,length(ename)-1),lower(substr(ename,2,length(ename) -1)))from emp; 二:数学函数:(在财务中用的比较多) ronud(sal)用于四舍五默认取整; ronud(sal,1)用于四舍五留一位小数。 trunc(sal)取整,忽略小数。截去小数部分。 trunc(sal,1)截取;小数点留一位,之后的右边的省去。 trunc(sal,-1)截取;只留整数,个位数取零。 floor(sal)向下最接近取整;比如1.1值为1.

oracle--存储过程--存储函数--触发器

存储过程和存储函数: 指存储在数据库中供所有用户程序调用的子程序叫存储过程、存储函数。语法: create [or replace] PROCEDURE 过程名(参数列表) AS PLSQL子程序体; 存储过程实例: 存储过程的调用: 方法一: set serveroutput on begin raisesalary(7369); end; / 方法二: set serveroutput on exec raisesalary(7369);

函数(Function)为一命名的存储程序,可带参数,并返回一计算值。函数和过程的结构类似,但必须有一个RETURN子句,用于返回函数值。函数说明要指定函数名、结果值的类型,以及参数类型等。 语法: CREATE [OR REPLACE] FUNCTION 函数名(参数列表) RETURN 函数值类型 AS PLSQL子程序体; 示例: 函数的调用: declare v_sal number; begin v_sal:=queryEmpSalary(7934); dbms_output.put_line('salary is:' || v_sal); end; / 在java语言中调用存储过程: 存储过程:

什么时候使用存储过程/存储函数? 如果只有一个返回值,用存储函数; 否则,就用存储过程。 在out参数中使用游标: 声明包结构: 创建包体:

在Java语言中访问游标类型的out参数: 触发器: 数据库触发器是一个与表相关联的、存储的PL/SQL程序。每当一个特定的数据操作语句(Insert,update,delete)在指定的表上发出时,Oracle自动地执行触发器中定义的语句序列。 触发器的类型 语句级触发器 在指定的操作语句操作之前或之后执行一次,不管这条语句影响了多少行。 行级触发器(FOR EACH ROW) 触发语句作用的每一条记录都被触发。在行级触发器中使用old和new伪记录变量, 识别值的状态。 创建触发器: CREATE [or REPLACE] TRIGGER 触发器名 {BEFORE | AFTER} {DELETE | INSERT | UPDATE [OF 列名]} ON 表名 [FOR EACH ROW [WHEN(条件) ] ] PLSQL 块

随机过程试题及答案

1.设随机变量X 服从参数为λ的泊松分布,则X 的特征函数为 。 2.设随机过程X(t)=Acos( t+),-t t 则 {(5)6|(3)4}______P X X === 9.更新方程()()()()0t K t H t K t s dF s =+-?解的一般形式为 。 10.记()(),0n EX a t M M t μ=≥→∞-→对一切,当时,t +a 。 二、证明题(本大题共4道小题,每题8分,共32分) P(BC A)=P(B A)P(C AB)。 2.设{X (t ),t ≥0}是独立增量过程, 且X (0)=0, 证明{X (t ),t ≥0}是一个马尔科夫过程。 3.设{}n X ,n 0≥为马尔科夫链,状态空间为I ,则对任意整数n 0,1

oracle数据库之常用的函数练习

/*此文章可以作为sql脚本直接运行,某些函数限于oracle数据库!前面建表和数据插入可以不看,直接看后面红色部分的代码,前面的表只是提供一些数据供大家练习,不用自己再去建表了,真正的内容在后面*/ --人员表 create table person( personID number , pname varchar2(20) constraint NN_pname not null, psex char(2) , pbirth date , constraint PK_personID primary key (personID) , constraint CK_psex check (psex='男' or psex='女') ); --增加数据 create sequence seq_personID ; insert into person values (seq_personID.Nextval,'david','男',to_date('1990-09-10','yyyy-mm- dd')); insert into person values (seq_personID.Nextval,'ggyy','男',to_date('1991-10-10','yyyy-mm-dd')); insert into person values (seq_personID.Nextval,'朱 刀','男',to_date('1970-10-10','yy-mm-dd'));

insert into person values (seq_personID.Nextval,'泥 巴','女',to_date('1991-10-10','yy-mm-dd')); insert into person values (seq_personID.Nextval,'憨 坨','女',to_date('1991-10-10','yy-mm-dd')); insert into person values (seq_personID.Nextval,'李静 芳','女',to_date('1990-09-10','yyyy-mm-dd')); insert into person (personID,pname,psex) values (seq_personID.Nextval,'胖子','男'); insert into person (personID,pname,psex) values (seq_personID.Nextval,'小成成','男'); insert into person (personID,pname,psex) values (seq_personID.Nextval,'乐姐','女'); insert into person (personID,pname,psex) values (seq_personID.Nextval,'靓崽波','男'); --登录账号表 create table loginzh( userID number , personID number , zhanghao varchar2(20) , passwd varchar2(20) , logintime date , loginIP varchar2(15) , constraint PK_userID primary key (userID) , constraint FK_personID foreign key (personID) references person (personID) ); --为这个表加点数据 create sequence seq_userID ; insert into loginzh values (seq_userID.Nextval,1,'111111','123456',sysdate,'127.0.0.1'); --sysdate为系统当前时间

随机过程复习提纲

第一章: 1. 填空 若X 1,X 2,…,X n 是相互独立的随机变量,且g i (t)是X i 的特征函数,i=1,2,…,n)则X=X 1+X 2+…X n 的特征函数g(t)= _g 1(t) g 2(t)…g n (t) 2.设P(S)是X 的母函数,试证: (1)若E(X)存在,则EX=P ′(1) (2)若D(X)存在,则 DX = P"(1)+ P ′(1)-[ P ′(1)]2 证明:(1)因为p (s )=s p k k k ∑ ∞ =0,则p ′(s )=s kp k k k 1 1 -∞ =∑,令s ↑1,得EX==∑∞ =1 k k kp p ′(1)。 (2)同理可证DX=p 〞(1)+ p ′(1) —[p ′(1)] 2 3.设X 服从B(n,p),求X 的特征函数g(t)及EX,EX 2,DX. 解:X 的分布列为P(X=k)=1k k n n C p q -,q=1-p ,k=0,1,2,...n, ()00 k n n n itk k k n k k it n k it g t e C p q C pe q pe q n n k k ? ??? ? ? ? ? ? ? --===+∑∑== 由性质得 ()() np it dt d i i EX t n q e p g =-=-==+0 , ()()() p n q e p dt d g i EX npq it i t n 2 2 2 2" 2 2 0+=-===+- ()npq DX EX EX =- = 2 2 4. 设X~N(0,1),求特征函数g(t). 解dx x t g e itx ?∞ +∞ --= 2 2 21)(π 由于e e x x x ix itx 22 2 2 =-,且 ?+∞?∞ +∞ --dx x e itx 2 2 21π ,故由积分号下求导公式有 ??? ?????-= =-∞ +∞-∞ +∞ --??de e ixe g x i dx x t ixt itx 22' 2 2 221)(π π

oracle SQL里常用的时间函数

oracle SQL里常用的时间函数,经典推荐 相信很多人都有过统计某些数据的经历,比如,要统计财务的情况,可能要按每年,每季度,每月,甚至每个星期来分别统计。那在oracle 中应该怎么来写sql语句呢,这个时候Oracle的日期函数会给我们很多帮助。 常用日期型函数 1。Sysdate 当前日期和时间 SQL> Select sysdate from dual; SYSDATE ---------- 21-6月-05 2。Last_day 本月最后一天 SQL> Select last_day(sysdate) from dual; LAST_DAY(S ---------- 30-6月-05 3。Add_months(d,n) 当前日期d后推n个月

用于从一个日期值增加或减少一些月份 date_value:=add_months(date_value,number_of_months) SQL> Select add_months(sysdate,2) from dual; ADD_MONTHS ---------- 21-8月-05 4。Months_between(f,s) 日期f和s间相差月数 SQL> select months_between(sysdate,to_date('2005-11-12','yyyy-mm-dd'))fro m dual; MONTHS_BETWEEN(SYSDATE,TO_DATE('2005-11-12','YYYY-MM-D D')) ---------------------------------------------------------- -4.6966741 5。NEXT_DAY(d, day_of_week) 返回由"day_of_week"命名的,在变量"d"指定的日期之后的第一个工作日的日期。参数"day_of_week"必须为该星期中的某一天。

oracle存储过程函数汇总().docx

oracle存储过程函数汇总() Character function return character value These functions all received is the character parameter type group (except CHR) and returns the character value? In addition to the special instructions, the function returns VARCHAR2 most numerical types? The restrictions on the return type of the character function are the same as those for the basic database type? The maximum value of character variable storage: The VARCHAR2 value is limited to 2000 characters (ORACLE 8 to 4000 characters) The CHAR value is limited to 255 characters (0RACLE8 2000) The long type is 2GB The Clob type is 4GB 1,CHR Syntax: Chr (x) Function: return in the database character set with numerical equivalence with the character of X. CHR and ASCII are a pair of inverse functions? After CHR conversion character after ASCII conversion and obtained the original word

随机过程知识点

第一章:预备知识 §1.1 概率空间 随机试验,样本空间记为Ω。 定义1.1 设Ω是一个集合,F 是Ω的某些子集组成的集合族。如果 (1)∈ΩF ; (2)∈A 若F ,∈Ω=A A \则F ; (3)若∈n A F , ,,21 =n ,则 ∞ =∈1 n n A F ; 则称F 为-σ代数(Borel 域)。(Ω,F )称为可测空间,F 中的元素称为事件。 由定义易知: . 216\,,)5)4(1 1 1 F A A A i F A F B A F B A F i i n i i n i i i ∈=∈∈∈∈?∞ === ,,则,,,)若(; 则若(; 定义1.2 设(Ω,F )是可测空间,P(·)是定义在F 上的实值函数。如果 ()()()()∑∞=∞==???? ???=?≠=Ω≤≤∈1 121,,,31210,)1(i i i i j i A P A P A A j i A A P A P F A 有 时,当)对两两互不相容事件(;)(; 任意 则称P 是()F ,Ω上的概率,(P F ,,Ω)称为概率空间,P(A)为事件A 的概率。 定义1.3 设(P F ,,Ω)是概率空间,F G ?,如果对任意G A A A n ∈,,,21 , ,2,1=n 有: (),1 1 ∏===??? ? ??n i i n i i A P A P 则称G 为独立事件族。 §1.2 随机变量及其分布 随机变量X ,分布函数)(x F ,n 维随机变量或n 维随机向量,联合分布函数, {}T t X t ∈,是独立的。 §1.3随机变量的数字特征 定义1.7 设随机变量X 的分布函数为)(x F ,若 ? ∞ ∞ -∞<)(||x dF x ,则称 )(X E =?∞ ∞ -)(x xdF 为X 的数学期望或均值。上式右边的积分称为Lebesgue-Stieltjes 积分。 方差,()()[]EY Y EX X E B XY --=为X 、Y 的协方差,而 DY DX B XY XY =ρ 为X 、Y 的相关系数。若,0=XY ρ则称X 、Y 不相关。 (Schwarz 不等式)若,,2 2 ∞<∞

oracle常用函数习题及答案

--1、选择部门30中的雇员 select * from emp where deptno=30; --2、列出所有办事员的姓名、编号和部门 select ename,empno,dname from emp e inner join dept d on e.deptno = d.deptno where job=upper('clerk?); --3、找出佣金高于薪金的雇员 select * from emp where comm>sal; --4、找出佣金高于薪金60%的雇员 select * from emp where comm>sal*0.6 --5、找出部门10中所有经理和部门20中的所有办事员的详细资料 select * from emp where (deptno=10 and job=upper('manager')) or (deptno=20 and job=upper('clerk ')); --6、找出部门10中所有经理、部门20中所有办事员,既不是经理又不是办事员但其薪金>=2000的所有雇员的详细资料 select * from emp where (deptno=10 and job=upper('manager')) or (deptno=20 and job=upper('clerk ')) or (job<>upper(…manager?) and job<>upper(…clerk?) and sal>=2000) --7、找出收取佣金的雇员的不同工作 select distinct job from emp where comm>0; --8、找出不收取佣金或收取的佣金低于100的雇员 select * from emp where nvl(comm,0)<100; --9、找出各月最后一天受雇的所有雇员 select * from emp where hiredate= last_day(hiredate); --10、找出早于25年之前受雇的雇员

Oracle存储过程基本结构

1.基本结构 CREATE OR REPLACE PROCEDURE 存储过程名字 ( 参数1 IN NUMBER, 参数2 IN NUMBER ) IS 变量1 INTEGER :=0; 变量2 DATE; BEGIN END 存储过程名字 2.SELECT INTO STATEMENT 将select查询的结果存入到变量中,可以同时将多个列存储多个变量中,必须有一条 记录,否则抛出异常(如果没有记录抛出NO_DATA_FOUND) 例子: BEGIN

SELECT col1,col2 into 变量1,变量2 FROM typestruct wher e xxx; EXCEPTION WHEN NO_DATA_FOUND THEN xxxx; END; ... 3.IF 判断 IF V_TEST=1 THEN BEGIN do something END; END IF; 4.while 循环 WHILE V_TEST=1 LOOP BEGIN

XXXX END; END LOOP; 5.变量赋值 V_TEST := 123; 6.用for in 使用cursor ... IS CURSOR cur IS SELECT * FROM xxx; BEGIN FOR cur_result in cur LOOP BEGIN V_SUM :=cur_result.列名1+cur_result.列名2 END; END LOOP;

END; 7.带参数的cursor CURSOR C_USER(C_ID NUMBER) IS SELECT NAME FROM USER WHE RE TYPEID=C_ID; OPEN C_USER(变量值); LOOP FETCH C_USER INTO V_NAME; EXIT FETCH C_USER%NOTFOUND; do something END LOOP; CLOSE C_USER; 8.用pl/sql developer debug 连接数据库后建立一个Test WINDOW 在窗口输入调用SP的代码,F9开始debug,CTRL+N单步调试 关于oracle存储过程的若干问题备忘 1.在oracle中,数据表别名不能加as,如:

oracle常用函数介绍及其使用

Oracle函数 Oracle SQL提供了用于执行特定操作的专用函数,这些函数大大增强了SQL语言的功能。函数可以接受零个或者多个输入参数,并返回一个输出结果。Oracle数据库中主要使用两种类型的函数: 1.单行函数:对每一个函数应用在表的记录中时,只能输入一行结果,返回一个结 果,比如:MOD(x,y)返回x除以y的余数(x和y可以是两个整数,也可以是表中 的整数列)。常用的单行函数有: 字符函数:对字符串操作。 数字函数:对数字进行计算,返回一个数字。 转换函数:可以将一种数据类型转换为另外一种数据类型。 日期函数:对日期和时间进行处理。 2.聚合函数:聚合函数同时可以对多行数据进行操作,并返回一个结果。比如SUM(x) 返回结果集中x列的总合。 目录大纲 Oracle函数 (1) ?字符函数 (2) ?数字函数 (3) ?日期函数 (4) ?转换函数 (6) ?其他单行函数 (8) ?聚合函数 (9)

字符函数接受字符参数,这些参数可以是表中的列,也可以是一个字符串表达式。下表列出了常用的字符函数。 表1 字符函数 表2 字符函数示例

数字函数接受数字参数,参数可以来自表中的一列,也可以是一个数字表达式。 表3 数字函数 说明: 1.ROUND(X[,Y]),四舍五入。 在缺省y时,默认y=0;比如:ROUND(3.56)=4。 y是正整数,就是四舍五入到小数点后y位。ROUND(5.654,2)=5.65。 y是负整数,四舍五入到小数点左边|y|位。ROUND(351.654,-2)=400。 2.TRUNC(x[,y]),直接截取,不四舍五入。 在缺省y时,默认y=0;比如:TRUNC (3.56)=3。 y是正整数,就是四舍五入到小数点后y位。TRUNC (5.654,2)=5.65。 y是负整数,四舍五入到小数点左边|y|位。TRUNC (351.654,-2)=300。

Oracle函数大全

附录Ⅱ Oracle11g SQL函数 函数名 返回 类型 说明 字符串函数 ASCII(s) 数值 返回s首位字母的ASCII码 CHR(i) 字符 返回数值i的ASCII字符 CONCAT(s1,s2) 字符 将s2连接到字符串s1的后面 INITCAP(s) 字符 将每个单词首位字母大写其它字母小写 INSTR(s1,s2[,i[,j]]) 数值 返回s2在s1中第i位开始第j次出现的位置 INSTRB(s1,s2[,i[,j]]) 数值 与INSTR(s)函数相同,但按字节计算 LENGTH(s) 数值 返回s的长度。 LENGTHb(s) 数值 与LENGTH(s)相同,但按字节计算。 lower(s) 字符 返回s的小写字符 LPAD(s1,i[,s2]) 字符 在s1的左侧用s2字符串补足到总长度i LTRIM(s1,s2) 字符 循环去掉在s2中存在的s1左边字符 RPAD(s1,i[,s2]) 字符 在s1的右侧用s2字符串补足到总长度i RTRIM(s1,s2) 字符 循环去掉在s2中存在的s1右边字符 REPLACE(s1,s2[,s3]) 字符 用s3替换出现在s1中的s2 REVERSE(s) 字符 返回s倒排的字符串 SUBSTR(s,i[,j]) 字符 从s的第i位开始截得长度j的子字符串 SUBSTRB(s,i[,j]) 字符 与SUBSTR相同,但i,j按字节计算。 SOUNDEX(s) 返回与s发音相似的词 TRANSLATE(s1,s2,s3) 字符 将s1中与s2相同的字符以s3代替 TRIM(s) 字符 删除s的首部和尾部空格 UPPER(s) 字符 返回s的大写 正则表达式函数 REGEXP_LIKE() 布尔 功能与LIKE的功能相似 REGEXP_INSTR() 数值 功能与INSTR的功能相似 REGEXP_SUBSTR() 字符 功能与SUBSTR的功能相似 REGEXP_REPLACE() 字符 功能与REPLACE的功能相似 数字函数 ABS(i) 数值 返回i的绝对值 ACOS(i) 数值 反余玄函数,返回-1到1之间的数 ASIN(i) 数值 反正玄函数,返回-1到1之间的数 ATAN(i) 数值 反正切函数,返回i的反正切值

相关文档
相关文档 最新文档