【精编推荐】Oracle存储过程开发规范与技巧

【精编推荐】Oracle存储过程开发规范与技巧
【精编推荐】Oracle存储过程开发规范与技巧

【精编推荐】Oracle存储过程开发规范与技巧

存储过程开发规范与技巧

开发规范

1.书写规范

1):程序头书写规范

程序头开始部分应说明程序整体的功能,存储过程名称,编写人,编写日期,修改人,修改日期,版本号以及过程涉及的表和视图。示例如下:

-----------------------------------------------------------------------------

/*

名称及实现功能:

版本: ( 版本号标示:新建 V1.0.0 小的修改变为V1.0.1 大的修改V1.1.0 重构V2.0.0)

Create by***Create Date2006-06-29

Update by*** update Date2006-06-30

修改原因:

Update by*** update Date2006-06-31

修改原因:

涉及的表或视图:

dump_init 辅助表(DM):记录存储过程中使用的物化视图日志序号

mlog$_acrcusmrsecindex 源表(ODS):客户第一索引物化视图日志,使用同义词

ft_gld_customerdata 目标表(DM):客户事实表

*/

CREATE OR REPLACE PROCEDURE *******

------------------------------------------------------------------------------ 2):代码书写规范

1.语句中出现的所有表名、字段名全部小写,系统保留字、内置函数名、Sql保留

字大写。

2.连接符or、in、and、以及=、<=、>=等前后加上一个空格。

3.where子句书写时,每个条件占一行,语句令起一行时,以保留字或者连接符开

始,连接符右对齐。

4.查询的WHERE过滤,原则应使过滤记录数最多的条件放在最前面。

5.多表连接时,使用表的别名来引用列。

6.查找数据库表或视图时,只能取出确实需要的那些字段,不要使用*来代替所有

列名。

7.功能相似的过程和函数,尽量写到同一个包中,加强管理。

示例如下:

BEGIN

--查询员工及对应的部门名称

SELECT https://www.360docs.net/doc/9913543124.html,, https://www.360docs.net/doc/9913543124.html,

FROM l_dept dept,l_employee emp

WHERE emp.dept_id = dept.dept_id;

END;

3)注释书写规范

为了提高可读性,应该使用一定数量的注释。注释大约占总行数的1/5。

1:注释风格:注释单独成行、放在语句前面。

2:应对不易理解的分支条件表达式加注释;

3:对重要的计算应说明其功能;

4:过长的函数实现,应将其语句按实现的功能分段加以概括性说明;

5:每条SQL语句均应有注释说明

6:对于程序的整体功能,应在程序开始部分说明,可采用单行/多行注释。(-- 或/* */ 方式)

2.命名规范

存储过程技术

1.存储过程样例

CREATE OR REPLACE PROCEDURE example(

v_input IN NUMBER, --输入参数

v_output OUT NUMBER --输出参数

)

IS

PRAGMA AUTONOMOUS_TRANSACTION;

CURSOR c1 --定义一个游标,在begin之前

IS

SELECT b.tablename mlogtable,

MAX (remarks)KEEP(DENSE_RANK LAST ORDER BY starttime)

remarks FROM proc_log a,table_proc b

WHERE TO_CHAR (starttime,'yyyy-mm-dd')<= --转换时间并做比较

TO_CHAR ( SYSDATE - TO_DSINTERVAL (

TO_CHAR (intervaldays) || ' 00:00:00'),'yyyy-mm-dd') AND a.remarks LIKE'SUCCEEDED:%'

AND a.procedurename = b.procedurename

GROUP BY b.tablename); --定义结束

c1_rec c1%ROWTYPE; --定义接受游标数据行的ROWTYPE

v_mlogtable VARCHAR(30);

v_postperiod CHAR(2);

v_acctbalbeginseq NUMBER;

v_systime DATE;

BEGIN

v_input :=0; --变量赋值

v_systime := SYSDATE;

OPEN c1;--打开游标

LOOP --循环

FETCH c1 INTO c1_rec; --从当前游标行赋值c1_rec

EXIT WHEN c1%NOTFOUND; --游标没有数据退出

v_mlogtable := c1_rec.mlogtable; --从行取出具体数据赋给变量

CASE TRIM (LOWER (v_mlogtable)) --CASE起始

WHEN'String1' --当条件一

THEN --做条件一工作

BEGIN

v_remarks :=REPLACE(v_remarks,'AA');

END;

WHEN'String2' --当条件二

THEN

BEGIN

END;

ELSE --其他条件

NULL;

END CASE; --CASE结束

IF(LOWER (SUBSTR (v_mlogtable,1,5))<>'mlog$')

THEN

SELECT log_table

INTO v_mlogtable

FROM user_snapshot_logs

WHERE LOWER (MASTER)= LOWER (v_mlogtable);

END IF;

EXECUTE IMMEDIATE'delete from '

|| v_mlogtable

|| ' where sequence$$ <= '

|| TO_CHAR (v_lognum);

EXIT WHEN 1>2; --循环跳出条件

END LOOP; --循环结束

CLOSE c1; --关闭游标

EXCEPTION

WHEN OTHERS

THEN

ROLLBACK;

global_procedure_check.check_end('checkdataerror01',

v_systime,

1,

SQLCODE || ' ' || SQLERRM

);

RAISE;

RETURN;

END;

END example;

2.基本知识

1) 基本结构

-------------------------------------------------------- CREATE OR REPLACE PROCEDURE example(parameters)--过程声明区IS

--------------------------------------------------------

v_1 NUMBER; --过程中变量声明区

-------------------------------------------------------- BEGIN

v_1 :=0; --过程内容区

END example;

--------------------------------------------------------

2) 基本类型

CHAR 固定长度字符类型

VARCHAR2 可变长字符类型

VARCHAR 可变长字符类型(不建议使用)

NUMBER 一切数值类型

DATE 一切日期类型

3) 参数

三种:IN 输入参数,OUT输出参数,IN OUT 输入输出参数。

4) 变量的声明

在变量声明区声明变量的名称和类型

例:v_postperiod CHAR(2);

可赋初值

v_postperiod CHAR(2):=’01’;

(这里叫变量声明区可能并不恰当,因为游标、自定义类型等,一切需要事先声明的都应在这里声明。)5) 变量的赋值

使用‘:=’为变量赋值

1.直接使用基本类型赋值

例:v_number := 1;

2.使用函数赋值

例:v_date := sysdate;

3.使用SQL语句为变量赋值

1〉通过sql直接赋值

SELECT COUNT (*)

INTO v_tmpnumber

FROM etl_ods_masterdata_tablist;

2〉通过构造SQL赋值:

v_tmpsql :=

'SELECT log_table FROM user_snapshot_logs'

|| v_dblink

|| ' WHERE UPPER (MASTER) = UPPER ('''

|| v_singletab

|| ''')';

EXECUTE IMMEDIATE v_tmpsql

INTO v_tmpvarchar;

6) 循环

1.无限或简单循环

LOOP

EXIT WHEN(退出循环条件);

END LOOP;

2.while循环

WHILE condition

LOOP

executable_statements;

END LOOP;

3.for循环

基于数字的for循环:

FOR for_index IN low_value .. high_value

LOOP

executable_statements;

END LOOP;

基于游标的for循环:

FOR record_index IN my_cursor

LOOP

executable_statements;

END LOOP;

7) 调用其他过程或方法

1.如果单独定义,直接使用

例:v_retval0 :=

f_dump_init(v_updatemode,

v_systime,

'mlog$_glddocheader',

v_procname,

v_docheaderbeginseq,

v_docheaderendseq

);

2.如果定义在包下,使用包名+过程名

例:global_procedure_check.check_run(v_procname);3.固定用法和函数

4.ROWTYPE的使用

可以使用%type 和% rowtype属性实现使用其他变量、数据库列或表的数据类型的引用。%type属性提供了所需要的变量的类型及长度。% rowtype属性允许人们定义一个记录变量,它的成员变量拥有表中每一列正确的类型及长度,使用点符号引用记录中的每个成员变

量。这种动态赋值方法是非常有用的,比如变量引用的列的数据类型和大小改变了,如果使用了%TYPE,那么用户就不必修改代码,否则就必须修改代码。

CREATE TABLE EMPLOYEE(

EMP_ID NUMBER NOT NULL,

EMP_NAME CHAR(20),

CREATE_DATE DATE)

DECLARE

v_studentrecord employee%ROWTYPE;

n employee.create_date%TYPE;

BEGIN

SELECT*

INTO v_studentrecord

FROM employee

WHERE emp_id =1;

n := v_studentrecord.create_date;

DBMS_OUTPUT.put_line (n);

END;

5.内存表的使用

内存表主要作为数组用。

1):一个字段:

PROCEDURE t1

IS

TYPE t_c IS TABLE OF testa.a1%TYPE

INDEX BY BINARY_INTEGER;

aa t_c;

BEGIN

aa (0):='aaa';

DBMS_OUTPUT.put_line (aa (0));

END;

2):定义多个字段:

PROCEDURE t1

IS

TYPE t_r IS RECORD(

t1 VARCHAR(10),

t2 VARCHAR(10)

);

TYPE t_t IS TABLE OF t_r

INDEX BY BINARY_INTEGER;

aa t_t;

BEGIN

aa (0).t1 :='aaa';

aa (0).t2 :='bbb';

DBMS_OUTPUT.put_line (aa (0).t1);

DBMS_OUTPUT.put_line (aa (0).t2);

END;

6.游标的使用

游标是用来处理使用SELECT语句从数据库中检索到的多行记录的工具。借助于游标的功能,数据库应用程序可以对一组记录逐个进行处理,每次处理一行。

DECLARE

n NUMBER;

CURSOR c

IS

SELECT*

FROM employee;

BEGIN

FOR v_c IN c

LOOP

n := v_c.emp_id;

DBMS_OUTPUT.put_line (n);

END LOOP;

EXCEPTION

WHEN OTHERS

THEN

DBMS_OUTPUT.put_line ('error');

END;

7.跟踪调试

根踪调试主要是检查程序运行的情况,可以在需要检查程序是否执行正确作为输出的依据:DBMS_OUTPUT.PUT_LINE(G_USERID(-2));

执行时设置:set serveroutput on

8.临时表

临时表用于保存事务或者会话的中间结果,临时表中保存的数据只有对当时的会话是可见的,任何会话都不能看见其他会话的数据。即使COMMIT之后也是不可见的。对于临时表并行不是问题,即使锁定也不能阻止其他程序的访问。每个数据库创建临时表一次,(ORACLE 的DDL语句是一种消耗较大的动作)并不用每个程序创建一次,并且临时表总保持为空。

下面这个例子可以说明临时表的运行过程:

CREATE GLOBAL TEMPORARY TABLE REPDB.L_EMP_DEPT_TEMP

(

EMP_ID VARCHAR(5),

EMP_NAME VARCHAR(20),

DEPT_ID VARCHAR(5),

DEPT_NAME VARCHAR(20)

)

1 DECLARE

2 D L_EMP_DEPT_TEMP%ROWTYPE;

3 CURSOR C IS

4 SELECT E.EMP_ID AA ,E.EMP_NAME BB ,D.DEPT_ID CC ,https://www.360docs.net/doc/9913543124.html, DD

5 FROM L_EMPLOYEE E,L_DEPT D

6 WHERE E.DEP_ID=D.DEPT_ID;

7 BEGIN

8 FOR V_C IN C LOOP

9 INSERT INTO L_EMP_DEPT_TEMP

10 V ALUES (V_C.AA,V_C.BB,V_https://www.360docs.net/doc/9913543124.html,,V_C.DD);

11 END LOOP;

12* END ;

SQL> /

PL/SQL 过程已成功完成。

SQL> SELECT COUNT(*)

2 FROM L_EMP_DEPT_TEMP

3 /

COUNT(*)

----------

3

SQL> COMMIT

2 /

提交完成。

SQL> SELECT COUNT(*)

2 FROM L_EMP_DEPT_TEMP

3 /

COUNT(*)

----------

9.异常处理

例外是一个非致命事件,它立即中断程序的正常执行并引起一个非条件转移,跳转到当前程序块的例外处理部分。一些例外,像NO_DATE_FOUND或TO_MANY_ROWS,属于预定义例外用于处理常见的oracle错误,可以被认为是正常的处理部分。部分ERROR这样的例外表明一个程序错误或一些意料之外的事件。如下所示:

1):正常处理的部分

1 DECLARE

2 N CHAR;

3 BEGIN

4 SELECT EMP_NAME

5 INTO N

6 FROM EMPLOYEE;

7 DBMS_OUTPUT.PUT_LINE('N');

8* END;

SQL> /

DECLARE

*

第 1 行出现错误:

ORA-01422: 实际返回的行数超出请求的行数

ORA-06512: 在line 4

1 DECLARE

2 N CHAR;

3 BEGIN

4 SELECT EMP_NAME

5 INTO N

6 FROM EMPLOYEE;

7 DBMS_OUTPUT.PUT_LINE(N);

8 EXCEPTION WHEN TOO_MANY_ROWS THEN

9 DBMS_OUTPUT.PUT_LINE('TOO MANY ROWS RETURN');

10* END;

PL/SQL 过程已成功完成。输出结果为:TOO MANY ROWS RETURN

2):非正常处理的部分,自定义异常

SQL> insert into l_employee

2 values ('4','dd','3',sysdate,'2000')

3 /

insert into l_employee

*

第 1 行出现错误:

ORA-02291: 违反完整约束条件(REPDB.FK_EMP_DEPT) - 未找到父项关键字

处理方法:自定义异常

1 declare

2 e exception ;

3 pragma exception_init(e,-2291);

4 begin

5 insert into l_employee

6 values ('6','dd','3',sysdate,'2000') ;

7 exception when e then

8 DBMS_OUTPUT.PUT_LINE('违反完整约束条件(REPDB.FK_EMP_DEPT)');

9* end ;

SQL> /

PL/SQL 过程已成功完成。输出结果为:违反完整约束条件(REPDB.FK_EMP_DEPT)

10.嵌套

程序块的内部可以有另一个程序块这种情况称为嵌套。嵌套要注意的是变量,定义在最外部程序块中的变量可以在所有子块中使用,如果在子块中定义了与外部程序块变量相同的变量名,在执行子块时将使用子块中定义的变量。子块中定义的变量不能被父块引用。

如果字块需要单独提交,应使用自治事务。

11.标签

用户可以使用标签使程序获得更好的可读性。程序块或循环都可以被标记。标签的形式是<>。

要求使用标签。

12.记录转储开始时间和结束时间

1)在建立中间表后,用脚本或手工在数据表中建立一条记录,以后每次都更新。

对每个转储只记录一条记录,不保存历史记录。

2)在开始转储时,读取上次转储结束时间,只转储从上次转储以来的新增或修改的记录。

3)在转储的存储过程中记录开始时间和结束时间,是否成功。如果失败,记录失败原因。

4)可以用SQL语句查找失败的转储,可以查找转储时间过长的转储。

表名:转储记录(TRANSLOG)

字段:

程序包名

存储过程名

中间表名

开始时间

结束时间

成功标识

失败原因

13.授权

grant select on cs_new.ACPStorkFlAssAnaTab to repdbnew

revoke select on cs_new.BILInvoiceUseEntityData from repdbnew

注意:不能为当前用户授权

14.建立同义词

CREATE SYNONYM ACPStorkFlAssAnaTab FOR jcerp.ACPStorkFlAssAnaTab

drop SYNONYM BILInvoiceUseEntityData

注:建立同义词后用户可以用select访问,但不能建立视图。

15.为表字段加注释

COMMENT ON COLUMN HAN_2.BBBB IS'B字段';

16.触发器

create or replace trigger qytest1_trigger3 BEFORE INSERT ON mlog$_qytest1 FOR EACH ROW

begin

:new.snaptime$$ := SYSDATE;

end;

17.自定义类型的赋值

自定义类型:

CREATE OR REPLACE TYPE repdbnew.INPARAM AS VARRAY(50)OF

VARCHAR2(25);

自定义类型的赋值:

declare

indataname inparam;

begin

indataname := inparam(2);

indataname:= inparam('isCalCount','NO_TX');

end;

18.OBJECT TYPES

簡單來說,Oracle Object Types就是 Oracle 以TYPE的方式來實現物件(Objects)的方法,宣告/定義的方法,類似於Package。Object Type的宣告/定義中包含了它的Attributes/Properties 與Methods,也就是Member Functions/Procedures。

本篇來介紹利用 Oracle Object Types來做中介暫存的實作。

建立 Oracle Object:

定義這個Object的內容,可以把它想像為所希望的Row Columns的定義。

view plaincopy to clipboardprint?

CREATE TYPE type_obj AS OBJECT(

col1 INTEGER,

col2 VARCHAR2(60)

);

/

CREATE TYPE type_obj AS OBJECT( col1 INTEGER, col2 VARCHAR2(60));/

建立Object Collection:

建立一個Table Type,這個Table裝的資料列內容(欄位)就是之前所建立的Object。

view plaincopy to clipboardprint?

CREATE OR REPLACE

TYPE type_tab IS TABLE OF type_obj;

/

CREATE OR REPLACE TYPE type_tab IS TABLE OF type_obj;/

ORACLE存储过程编码规范

ORACLE存储过程编码规范 1.1变量规范 变量名、常量名、参数名、函数名、存储过程名、包名等所有对象全部用英文拼写,不允许用汉语拼音,多个单词间用下划线分割。 全局常量全部用大写,全局变量全部用小写,且全局变量尽量避免使用。 局部变量全部小写,使用“v_”开头,输入参数以“i_”开头,输出参数以“o_” 开头,输入输出参数用io_开头。 游标的定义:游标统一用前缀“cur_”命名 当变量代表列时,使用%TYPE属性,当变量实际上表示数据库表的某列数据时,为避免数据库结构修改对变量的影响,应统一使用%TYPE属性对变量命名 1.2显示游标规范 外部查询的多行数据返回使用游标进行处理,通过传递游标变量的形式返回数据到外部接口,由外部程序自行FETCH数据。 打开游标前,必须显式检查游标的%ISOPEN属性。 使用FETCH语句后,要立即检查%NOTFOUND属性,以便正常终止游标FETCH 循环。 无论PL/SQL程序是正常终止还是出错退出,都要关闭所有已打开的游标。在出错退出时,应该在其异常处理部分管理所有游标,这可以释放一部分的系统资源 1.3事务处理规范 在需要分割事务以使主事务的提交或者回滚独立于子事务的提交及回滚时,应使用自动提交事务。 所有的存储过程均统一在结束处统一COMMIT或者ROLLBACK。 1.4错误处理规范 凡是涉及到表操作(insert,update,select,delete)的sql语句,都必须进行错误捕捉,不能将错误带到后面的语句 从表中SELECT数据INTO到指定变量中的SQL语句,应严格区分NO_DATA_FOUND 和TOO_MANY_ROWS的错误,并将相应错误信息填入错误信息 ?NO_DA TA_FOUND 多数为查询条件问题导致无数据返回(用户级错误)

2020年(Oracle管理)华为oracle培训教材

(Oracle管理)华为oracle培训教材

SQL语言简介 1、SQL概述 SQL是一种面向数据库的通用数据处理语言规范,能完成以下几类功能:提取查询数据,插入修改删除数据,生成修改和删除数据库对象,数据库安全控制,数据库完整性及数据保护控制。 数据库对象包括表、视图、索引、同义词、簇、触发器、函数、过程、包、数据库链、快照等(表空间、回滚段、角色、用户)。数据库通过对表的操作来管理存储在其中的数据。 1)SQL*PLUS界面: 登录:输入SQLPLUS回车;输入正确的ORACLE用户名并回车;输入用户口令并回车,显示提示符:SQL> 退出:输入EXIT即可。 2)命令的编辑与运行: ●在命令提示符后输入SQL命令并运行,以分号结束输入;以斜杠结束输入;以空行结束输入; ●利用SQL缓冲区进行PL/SQL块的编辑和运行; ●利用命令文件进行PL/SQL块的编辑和运行。 2、数据库查询 1)用SELECT语句从表中提取查询数据。语法为 SELECT[DISTINCT]{column1,column2,…}FROMtablenameWHERE{conditi ons}GROUPBY{conditions}ORDERBY{expressions}[ASC/DESC]; 说明:SELECT子句用于指定检索数据库的中哪些列,FROM子句用于指定从哪一个表或视图中检索数据。

2)SELECT中的操作符及多表查询WHERE子句。(LIKE,IS,…) WHERE子句中的条件可以是一个包含等号或不等号的条件表达式,也可以是一个含有IN、NOTIN、BETWEEN、LIKE、ISNOTNULL等比较运算符的条件式,还可以是由单一的条件表达通过逻辑运算符组合成复合条件。 3)ORDERBY子句 ORDERBY子句使得SQL在显示查询结果时将各返回行按顺序排列,返回行的排列顺序由ORDERBY子句指定的表达式的值确定。 4)连接查询 利用SELECT语句进行数据库查询时,可以把多个表、视图的数据结合起来,使得查询结果的每一行中包含来自多个表达式或视图的数据,这种操作被称为连接查询。 连接查询的方法是在SELECT命令的FROM子句中指定两个或多个将被连接查询的表或视图,并且在WHERE子句告诉ORACLE如何把多个表的数据进行合并。根据WHERE子句中的条件表达式是等还是不等式,可以把连接查询分为等式连接和不等式连接。 5)子查询 如果某一个SELECT命令(查询1)出现在另一个SQL命令(查询2)的一个子句中,则称查询1是查询2的子查询。 3、基本数据类型(NUMBER,VARCHAR2,DATE)O RACEL支持下列内部数据类型: ●VARCHAR2变长字符串,最长为2000字符。 ●NUMBER数值型。

ORACLE存储过程

ORACLE提供了四种类型的可存储的程序: 函数, 过程. 包,触发器 一.声明部分(Declarationsection) (1)声明部分包含了变量和常量的数据类型和初始值 (2)这个部分是由关键字DECLARE开始 (3)如果不需要声明变量或常量,那么可以忽略这一部分; 二.执行部分(Executablesection) (1)执行部分是PL/SQL块中的指令部分, (2)由关键字BEGIN开始,所有的可执行语句都放在这一部分,其他的PL/SQL块也可以放在这一部分。 三.异常处理部分(Exceptionsection) 这一部分是可选的,在这一部分中处理异常或错误。 过程存储过程是一个PL/SQL程序块,接受零个或多个参数作为输入(INPUT)或输出(OUTPUT)、或既作输入又作输出(INOUT),与函数不同,存储过程没有返回值,存储过程不能由SQL语句直接使用,只能通过EXECUT命令或PL/SQL程序块内部调用。 1.创建存储过程 CREATE[ORREPLACE]PROCEDURE过程名 (参数1{IN/OUT/INOUT}类型, 参数2{IN/OUT/INOUT}类型, …….

参数N{IN/OUT/INOUT}类型, )IS/AS 过程体 BEGIN END存储过程名字 说明: (1)ORREPLACE关键字可选,但一般会使用,功能为如果同名的过程已存在,则删除同名过程,然后重建,以此来实现修改过程的目的。 (2)过程可以包括多个参数,参数模式有IN/OUT/INOUT三种,默认为IN,也可以没参数。 (3)IS/AS键字也等价 (4)过程体为该过程的代码部分,是一个含有声明部分,执行部分和异常处理部分的PL/SQL块。但需要注意的是,在过程的声明体中不能使用DECLARE关键字,由IS或AS来代替。 注意事项: 1,存储过程参数不带取值范围,in表示传入,out表示输出 类型可以使用任意Oracle中的合法类型。 2,变量带取值范围,后面接分号 3,在判断语句前最好先用count(*)函数判断是否存在该条操作记录 4,用select。。。into。。。给变量赋值 5,在代码中抛异常用raise+异常名 2.查看过程

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.360docs.net/doc/9913543124.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.360docs.net/doc/9913543124.html,%TYPE := 'wish'; v_pwd user_info.pwd%TYPE := 'history'; v_add user_info.address%TYPE := 'shanghai'; BEGIN --调用过程,添加wish用户到数据库

ORACLE存储过程开发基础语法

ORACLE存储过程开发基础语法 create or replace procedure test(var_name_1 in type,var_name_2 out type) as --声明变量(变量名变量类型) begin --储备过程的执行体 end test; 打印出输入的时刻信息 E.g: create or replace procedure test(workDate in Date) is begin dbms_output.putline('The input date is:'||to_date(workDate,'yyyy-mm-dd')); end test; 2、变量赋值 变量名:= 值; E.g: create or replace procedure test(workDate in Date) is x number(4,2); begin x := 1; end test; 3、判定语句:

if 比较式then begin end; end if; E.g create or replace procedure test(x in number) is begin if x >0 then begin x := 0 - x; end; end if; if x = 0 then begin x: = 1; end; end if; end test; 4、For 循环 For ... in ... LOOP --执行语句 end LOOP; (1)循环遍历游标 create or replace procedure test() as Cursor cursor is select name from student; name varchar(20);

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) ,

oracle存储过程学习经典[语法实例调用]

Oracl e 存储过程学习 目录 Oracle 存储过程1 Oracle存储过程基础知识1 Oracle存储过程的基本语法2 关于Oracle存储过程的若干问题备忘4 1.在Oracle中,数据表别名不能加as。5 2.在存储过程中,select某一字段时,后面必须紧跟into,如果select整个记录,利用 游标的话就另当别论了。5 3.在利用select...into...语法时,必须先确保数据库中有该条记录,否则会报出"no data found"异常。5 4.在存储过程中,别名不能和字段名称相同,否则虽然编译可以通过,但在运行阶段 会报错5 5.在存储过程中,关于出现null的问题5 6.Hibernate调用Oracle存储过程6 用Java调用Oracle存储过程总结6 一、无返回值的存储过程6 二、有返回值的存储过程(非列表)8 三、返回列表10 在存储过程中做简单动态查询11 一、本地动态SQL12 二、使用DBMS_SQL包14 Oracle存储过程调用Java方法16 Oracle高效分页存储过程实例17 Oracle存储过程基础知识 商业规则和业务逻辑可以通过程序存储在Oracle中,这个程序就是存储过程。 存储过程是SQL, PL/SQL, Java 语句的组合,它使你能将执行商业规则的代码从你的应用程序中移动到数据库。这样的结果就是,代码存储一次但是能够被多个程序使用。 要创建一个过程对象(procedural object),必须有CREATE PROCEDURE 系统权限。如果这个过程对象需要被其他的用户schema 使用,那么你必须有CREATE ANY PROCEDURE 权限。执行procedure 的时候,可能需要excute权限。或者EXCUTE ANY PROCEDURE 权限。如果单独赋予权限,如下例所示: grant execute on MY_PROCEDURE to Jelly 调用一个存储过程的例子: execute MY_PROCEDURE( 'ONE PARAMETER'); 存储过程(PROCEDURE)和函数(FUNCTION)的区别。

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实验--存储过程

实验八存储过程的使用 一、实验目的 1、熟练掌握存储过程的定义及使用 二、实验要求 1、实验前做好上机实验的准备,针对实验内容,认真复习与本次实验有关的知识,完成 实验内容的预习准备工作; 2、能认真独立完成实验内容; 3、实验后做好实验总结,根据实验情况完成实验报告。 三、实验内容 创建图书管理库的图书、读者和借阅三个基本表的表结构: 图书表: BOOK ( BOOK_ID NUMBER(10), SORT V ARCHAR2(10), BOOK_NAME V ARCHAR2(50), WRITER V ARCHAR2(10), OUTPUT V ARCHAR2(50), PRICE NUMBER(3)); 读者表 READER ( READER_ID NUMBER(3), COMPANY V ARCHAR2(10), NAME V ARCHAR2(10), SEX V ARCHAR2(2), GRADE V ARCHAR2(10), ADDR V ARCHAR2(50)); 借阅表 BORROW ( READER_ID NUMBER(3),

BOOK_ID NUMBER(10), BORROW_DA TE DA TE); 插入数据: BOOK表: insert into book values(445501,'TP3/12','数据库导论','王强','科学出版社',17.90); insert into book values(445502,'TP3/12','数据库导论','王强','科学出版社',17.90); insert into book values(445503,'TP3/12','数据库导论','王强','科学出版社',17.90); insert into book values(332211,'TP5/10','计算机基础','李伟','高等教育出版社',18.00); insert into book values(112266,'TP3/12','FoxBASE','张三','电子工业出版社',23.60); insert into book values(665544,'TS7/21','高等数学','刘明','高等教育出版社',20.00); insert into book values(114455,'TR9/12','线性代数','孙业','北京大学出版社',20.80); insert into book values(113388,'TR7/90','大学英语','胡玲','清华大学出版社',12.50); insert into book values(446601,'TP4/13','数据库基础','马凌云','人民邮电出版社',22.50); insert into book values(446602,'TP4/13','数据库基础','马凌云','人民邮电出版社',22.50); insert into book values(446603,'TP4/13','数据库基础','马凌云','人民邮电出版社',22.50); insert into book values(449901,'TP4/14','FoxPro大全','周虹','科学出版社',32.70); insert into book values(449902,'TP4/14','FoxPro大全','周虹','科学出版社',32.70); insert into book values(118801,'TP4/15','计算机网络','黄力钧','高等教育出版社',21.80); insert into book values(118802,'TP4/15','计算机网络','黄力钧','高等教育出版社',21.80); READER表: insert into reader values(111,'信息系','王维利','女','教授','1号楼424'); insert into reader values(112,'财会系','李立','男','副教授','2号楼316'); insert into reader values(113,'经济系','张三','男','讲师','3号楼105'); insert into reader values(114,'信息系','周华发','男','讲师','1号楼316'); insert into reader values(115,'信息系','赵正义','男','工程师','1号楼224'); insert into reader values(116,'信息系','李明','男','副教授','1号楼318'); insert into reader values(117,'计算机系','李小峰','男','助教','1号楼214'); insert into reader values(118,'计算机系','许鹏飞','男','助工','1号楼216'); insert into reader values(119,'计算机系','刘大龙','男','教授','1号楼318'); insert into reader values(120,'国际贸易','李雪','男','副教授','4号楼506'); insert into reader values(121,'国际贸易','李爽','女','讲师','4号楼510'); insert into reader values(122,'国际贸易','王纯','女','讲师','4号楼512'); insert into reader values(123,'财会系','沈小霞','女','助教','2号楼202'); insert into reader values(124,'财会系','朱海','男','讲师','2号楼210'); insert into reader values(125,'财会系','马英明','男','副教授','2号楼212'); BORROW表:

用ORACLE存储过程创建成简单的报表

用ORACLE存储过程创建成简单的报表 第一步:CREATE OR REPLACE PROCEDURE xxxxxxxxxxx(errormsg OUT VARCHAR2, errorcode OUT VARCHAR2, p_to_class_input IN VARCHAR2, p_segment1_input IN VARCHAR2 ) IS BEGIN /*dbms_output.put_line(*/ fnd_file.put_line(fnd_file.output, '物料' || CHR(9) || '物料说明' || CHR(9) || '目标基本单位' || CHR(9) || '目标分类' || CHR(9) || ); FOR cur1 IN (SELECT DISTINCT msi.SEGMENT1 物料, msi.DESCRIPTION 物料说明, mucc.TO_UNIT_OF_MEASURE 目标基本单位, mucc.TO_UOM_CLASS 目标分类, FROM a mucc, b msi, c fu, FND_USER fu1, mtl_categories mtl, mtl_item_categories mic WHERE1 = 1 AND mucc.INVENTORY_ITEM_ID = msi.INVENTORY_ITEM_ID AND msi.INVENTORY_ITEM_ID = mic.INVENTORY_ITEM_ID AND mucc.INVENTORY_ITEM_ID = mic.INVENTORY_ITEM_ID AND mucc.CREATED_BY = https://www.360docs.net/doc/9913543124.html,ER_ID AND https://www.360docs.net/doc/9913543124.html,ST_UPDATED_BY = https://www.360docs.net/doc/9913543124.html,ER_ID AND https://www.360docs.net/doc/9913543124.html,ANIZATION_ID = https://www.360docs.net/doc/9913543124.html,ANIZATION_ID AND mtl.CATEGORY_ID = mic.CATEGORY_ID AND mtl.SEGMENT1 = 'RA' AND mtl.SEGMENT2 = nvl(P_TO_CLASS_INPUT, mtl.SEGMENT2) AND msi.SEGMENT1 = NVL(P_SEGMENT1_INPUT, msi.SEGMENT1) ) LOOP

Oracle存储过程语法与注意事项

oracle 存储过程的基本语法 1.基本结构 CREATE OR REPLACE PROCEDURE 存储过程名字 ( 参数1 IN NUMBER, 参数2 IN NUMBER ) IS 变量1 INTEGER :=0; 变量2 DATE; BEGIN END 存储过程名字 2.SELECT INTO STA TEMENT 将select查询的结果存入到变量中,可以同时将多个列存储多个变量中,必须有一条 记录,否则抛出异常(如果没有记录抛出NO_DA TA_FOUND) 例子: BEGIN SELECT col1,col2 into 变量1,变量2 FROM typestruct where 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 WHERE 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,如: select a.appname from appinfo a;-- 正确 select a.appname from appinfo as a;-- 错误 也许,是怕和oracle中的存储过程中的关键字as冲突的问题吧 2.在存储过程中,select某一字段时,后面必须紧跟into,如果select整个记录,利用游标的话就另当别论了。 select af.keynode into kn from APPFOUNDATION af where af.appid=aid and af.foundationid=fid;-- 有into,正确编译 select af.keynode from APPFOUNDA TION af where af.appid=aid and af.foundationid=fid;-- 没有into,编译报错,提示:Compilation Error: PLS-00428: an INTO clause is expected in this SELECT statement

Oracle+PlSql存储过程 学习文档

Oracl e 存储过程 目录 Oracle 存储过程 (1) Oracle存储过程基础知识 (1) Oracle存储过程的基本语法 (2) 关于Oracle存储过程的若干问题备忘 (4) 1. 在Oracle中,数据表别名不能加as。 (4) 2. 在存储过程中,select某一字段时,后面必须紧跟into,如果select整个记录,利 用游标的话就另当别论了。 (5) 3. 在利用select...into...语法时,必须先确保数据库中有该条记录,否则会报出"no data found"异常。 (5) 4. 在存储过程中,别名不能和字段名称相同,否则虽然编译可以通过,但在运行阶段 会报错 (5) 5. 在存储过程中,关于出现null的问题 (5) 6. Hibernate调用Oracle存储过程 (6) 用Java调用Oracle存储过程总结 (6) 一、无返回值的存储过程 (6) 二、有返回值的存储过程(非列表) (8) 三、返回列表 (9) 在存储过程中做简单动态查询 (11) 一、本地动态SQL (12) 二、使用DBMS_SQL包 (13) Oracle存储过程调用Java方法 (16) Oracle高效分页存储过程实例 (17) Oracle存储过程基础知识 商业规则和业务逻辑可以通过程序存储在Oracle中,这个程序就是存储过程。 存储过程是SQL, PL/SQL, Java 语句的组合,它使你能将执行商业规则的代码从你的应用程序中移动到数据库。这样的结果就是,代码存储一次但是能够被多个程序使用。 要创建一个过程对象(procedural object),必须有CREATE PROCEDURE 系统权限。如果这个过程对象需要被其他的用户schema 使用,那么你必须有CREATE ANY PROCEDURE 权限。执行procedure 的时候,可能需要excute权限。或者EXCUTE ANY PROCEDURE 权限。如果单独赋予权限,如下例所示: grant execute on MY_PROCEDURE to Jelly 调用一个存储过程的例子: execute MY_PROCEDURE( 'ONE PARAMETER'); 存储过程(PROCEDURE)和函数(FUNCTION)的区别。

如何在Oracle中使用Java存储过程(详解)

如何在Oracle中使用Java存储过程 (详解) 一、如何缔造java存储过程? 通常有三种步骤来缔造java存储过程。 1. 使用oracle的sql语句来缔造: e.g. 使用create or replace and compile java source named "" as 后边跟上java源程序。要求类的步骤必须是public static的,威力用于存储过程。 1.SQL> create or replace and compile java source named "javademo1 " 2. as 3. import java.sql.*; 4. public class JavaDemo1 5. { 6. public static void main(String[] argv) 7. { 8. System.out.println("hello, java demo1"); 9. } 10. } 11. / 12. 13.Java 已 14. 15.缔造。 16. 17.SQL> show errors java source "javademo1" 18.没有 19. 20.舛误。 21. 22.SQL> create or replace procedure javademo1 23. 2 as 24.3 language java name JavaDemo1.main(https://www.360docs.net/doc/9913543124.html,ng.String[]); 25. 4 / 26. 27.过程已 28.

30. 31.SQL> set serveroutput on 32.SQL> call javademo1(); 33. 34.调用 35.实现。 36. 37.SQL> call dbms_java.set_output(5000); 38. 39.调用 40.实现。 41. 42.SQL> call javademo1(); 43.hello, java demo1 44. 45.调用 46.实现。 47. 48.SQL> call javademo1(); 49.hello, java demo1 50.调用 51.实现。 2. 使用外部class文件来装载缔造 e.g. 这里既然用到了外部文件,必定要将class文件放到oracle Server 的某一目录下边。 1.public class OracleJavaProc 2.{ 3. public static void main(String[] argv) 4. { 5. System.out.println("Its a Java Oracle procedure."); 6. } 7.} 8. 9. 10.SQL> grant create any directory to scott; 11. 12.授权 13.顺利。 14. 15.SQL> conn scott/tiger@iihero.oracledb

oracle存储过程例子

oracle存储过程学习过程 一直没有使用过存储过程 今天特意学习一下oracle的存储过程 一步一步学习,今天学习如下: 建立一个最简单的存储过程 create or replace procedure test_xg_p1 is begin dbms_output.put_line('hello world! this is the first procedure'); end; 建立一个带输入输出参数的存储过程:把输入的数据传给输出参数 create or replace procedure test_xg_p2(a in number,x out number) is begin x:=a; end test_xg_p2; 建立一个逻辑判断的存储过程,并包含输入输出参数:近似分数的登记判断create or replace procedure test_xg_p3(a in number,x out varchar2) is begin if a>=90 then begin x := 'A'; end; end if; if a<90 then begin x:='B'; end; end if; if a<80 then begin x:='C'; end; end if; if a<70 then begin x:='D'; end; end if; if a<60 then begin x:='E'; end; end if; end test_xg_p3; 建立一个带循环逻辑的存储过程:近似累加函数

create or replace procedure test_xg_p4(a in number,x out varchar2) is tempresult number(16); begin tempresult :=0; for tempa in 0..a loop begin tempresult := tempresult + tempa; end; end loop; x:=tempresult; end test_xg_p4; 建立一个能从数据库中特定表中返回数据的存储过程: create or replace procedure test_xg_p5(x out varchar2) is tempresult varchar2(1024); begin tempresult := 'start->'; select hotelid||hotelname into tempresult from hotel where hotelid =10041764; x:=tempresult; end test_xg_p5; 建立一个能使用游标的带循环的存储过程: create or replace procedure test_xg_p6(x out varchar2) is tempresult varchar2(10240); cursor cursor1 is select * from hotel where hotelname like '浙江%'; begin tempresult := 'start->'; for cursor_result in cursor1 loop begin tempresult :=tempresult||cursor_result.hotelid||cursor_result.hotelname; end; end loop; x:=tempresult; end test_xg_p6;

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

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

一: CREATE OR REPLACE PROCEDURE proc_batch IS interactionhour varchar(100); upcdrname varchar(100); part_hour varchar(100); calendar date; interactionday1 varchar(100); interactionday varchar(100); part_day varchar(100); errmsg varchar(300); BEGIN calendar := sysdate-1/24; part_hour :=to_char(sysdate-1/24,'hh24'); part_day :=to_char(sysdate-1,'dd'); interactionhour := 'interactionhour'||to_char(calendar,'yyyymm'); interactionday := 'interactionday'||to_char(calendar,'yyyymm'); interactionday1 := 'interactionday1'||to_char(calendar,'yyyymm'); upcdrname := 'upcdr'||to_char(calendar,'yymmdd'); proc_interactionhour (interactionhour,upcdrname ,part_hour ,calendar); if to_char(sysdate,'hh24')='03' then proc_interactionday (interactionhour ,interactionday ,interactionday1 ,part_day ); end if; if to_char(sysdate,'hh24')='04' then proc_interactiondayshow (interactionday1 ,interactionday ); end if; insert into appmsg values('成功执行proc_batch','proc_batch',sysdate); commit; EXCEPTION WHEN OTHERS THEN rollback; errmsg:= substr(sqlerrm,1,300); insert into appmsg values ('没有成功执行proc_batch','proc_batch',sysdate); commit;

相关文档
最新文档