oracle存储过程语法
oracle proc 语法
oracle proc 语法Oracle的存储过程(Procedure)是一种在数据库中创建可执行的程序来完成特定任务的方法。
它可以接收参数并返回结果,可以有控制结构如循环和条件语句,并可以与数据库表进行交互操作。
下面是一些常见的Oracle存储过程的语法和示例。
1. 创建存储过程:使用CREATE PROCEDURE语句可以创建一个新的存储过程。
语法如下:```CREATE PROCEDURE procedure_name(parameter1 datatype, parameter2 datatype, ...)[AUTHID {DEFINER | CURRENT_USER}][IS | AS]BEGIN-- 存储过程体END;```其中,procedure_name是存储过程的名称,parameter1、parameter2等是输入参数的名称和数据类型。
AUTHID定义了存储过程的执行权限,默认是DEFINER(创建者权限)。
存储过程体在BEGIN和END之间进行定义。
2. 存储过程参数:存储过程可以接收输入参数、输出参数和输入输出参数。
使用IN、OUT和IN OUT关键字来定义不同类型的参数。
示例: ```CREATE PROCEDURE my_procedure(input_param IN VARCHAR2, output_param OUT NUMBER, inout_param IN OUT DATE)ISBEGIN-- 存储过程体END;```3. 调用存储过程:在PL/SQL块中使用EXECUTE语句来调用存储过程。
示例: ```DECLAREresult NUMBER;BEGINEXECUTE my_procedure('input_value', result, SYSDATE);-- 处理结果END;```4. 控制结构:存储过程可以使用条件语句和循环结构来控制执行流程。
oracle存储过程的用法
oracle存储过程的用法一、存储过程概述存储过程是在数据库中预先编译好的SQL语句集合,它可以在数据库中作为一个独立的对象存在,并由数据库管理系统执行。
存储过程具有可重复使用、可编译优化、可嵌套调用等优点,是数据库开发中常用的一种技术手段。
二、存储过程的创建要创建存储过程,需要使用Oracle数据库的SQL开发工具(如SQLDeveloper)或命令行工具(如SQL*Plus)。
创建存储过程的语法如下:```sqlCREATEPROCEDUREprocedure_name[parameter_list][IS|AS]block_of_code[LANGUAGE][sql][EXECUTEIMMEDIATE]SQL_CODE```其中,`procedure_name`是存储过程的名称,`parameter_list`是可选的参数列表,`block_of_code`是存储过程的主体代码,`LANGUAGE`指定存储过程的编程语言(如PL/SQL),`EXECUTEIMMEDIATE`用于执行动态SQL代码。
三、存储过程的参数存储过程的参数可以是输入参数、输出参数或输入/输出参数。
输入参数表示从调用方传递给存储过程的值,输出参数表示存储过程的结果值返回给调用方,而输入/输出参数则同时具有输入和输出功能。
在存储过程中,可以使用SQL数据类型(如VARCHAR2、NUMBER、DATE等)或Oracle特有的数据类型(如RAW、BLOB等)来定义参数。
同时,还可以使用PL/SQL的数据类型(如RAW、BLOB、CLOB等)来定义存储过程的局部变量和输出参数。
四、存储过程的调用要调用存储过程,需要使用EXECUTE语句或调用对象的方法。
例如:```sqlEXECUTEprocedure_name(parameter1,parameter2);```或```vbnetprocedure_object.procedure_method();```其中,`procedure_name`是存储过程的名称,`parameter1`和`parameter2`是传递给存储过程的参数值。
ORACLE存储过程详解教程
ORACLE存储过程详解教程Oracle存储过程是一种存储在数据库中的可重用的程序单元,它可以被调用并执行。
存储过程通常用于执行一系列相关的数据库操作,可以提高性能、可维护性和安全性。
1.存储过程的优势:-提高性能:存储过程可以减少网络通信的开销,因为它们在数据库服务器上执行,而不是在客户端上。
-改善可维护性:存储过程可以在数据库中进行维护和修改,而无需重新编译客户端应用程序。
-增强安全性:存储过程可以对敏感数据进行访问控制,并通过参数化查询来防止SQL注入攻击。
2.创建存储过程的语法:```sqlCREATE [OR REPLACE] PROCEDURE procedure_name[(parameter_name [IN , OUT , IN OUT] data_type [:= default_value])]IS--声明变量BEGIN--程序代码END [procedure_name];```-CREATE[ORREPLACE]PROCEDURE语句用于创建一个新的存储过程。
- procedure_name是存储过程的名称。
- parameter_name是参数的名称,可以使用IN、OUT或IN OUT修饰符指定参数的类型。
- data_type是参数的数据类型。
- default_value是参数的默认值。
-IS关键字用于声明存储过程的开头。
-BEGIN和END语句用于包围存储过程的代码。
3.存储过程的示例:下面是一个简单的存储过程示例,它返回指定员工的薪水:```sqlCREATE OR REPLACE PROCEDURE get_employee_salary(employee_id IN employees.employee_id%TYPE,salary OUT employees.salary%TYPE)ISBEGINSELECT salary INTO salaryFROM employeesWHERE employee_id = employee_id;END get_employee_salary;```- get_employee_salary是存储过程的名称。
Oracle存储过程基本语法格式
Oracle存储过程基本语法格式Oracle存储过程是一种数据库对象,可以包含一系列的SQL语句和控制结构,用于封装和组织一组相关的操作。
存储过程可以在数据库中进行定义、编译和执行,提高了数据库的性能和安全性。
下面是Oracle存储过程的基本语法格式。
1.创建存储过程:CREATE [OR REPLACE] PROCEDURE procedure_name[(parameter_name [IN , OUT , IN OUT] type [, ...])]IS[local_variable_declarations]BEGIN-- Procedural statementsEND;-CREATE[ORREPLACE]PROCEDURE:用于创建一个新的存储过程,ORREPLACE关键字可用于更新已存在的存储过程。
- procedure_name:存储过程的名称。
- parameter_name [IN , OUT , IN OUT] type:存储过程的参数,可以包含输入参数(IN)、输出参数(OUT)和输入输出参数(IN OUT)。
-IS:开始存储过程定义的关键字。
- local_variable_declarations:定义存储过程中使用的局部变量。
-BEGIN和END之间是存储过程的主体部分,包含实际的SQL语句和控制结构。
2.存储过程的参数传递:-IN参数:将参数的值传递给存储过程,但不允许在存储过程中修改参数的值。
-OUT参数:存储过程将参数的值输出给调用者,但在存储过程中不能使用该参数的值。
-INOUT参数:允许将参数的值传递给存储过程,并且存储过程还可以修改该参数的值。
3.存储过程的主体部分:存储过程的主体部分由一系列的SQL语句和控制结构组成,用于实现具体的功能。
主体部分可以使用以下类型的语句和结构:-SQL语句:可以使用所有合法的SQL语句,包括SELECT、INSERT、UPDATE和DELETE等。
oracle 存储过程语法
oracle 存储过程语法
Oracle 存储过程是一种由数据库引擎负责运行的预定义的数据库操作,它可以帮助
在 Oracle 数据库中有效地执行重复任务。
例如,可以使用存储过程将数据从单个表中检索,然后插入另一个表。
存储过程专为 Oracle 数据库设计,可以以多种方式编写。
任何使用 SQL、PL/SQL
或 Java(具体取决于使用的版本)编写的程序都可以称为存储过程。
存储过程有助于提高应用程序性能和可移植性,因为不需要对每个客户端实例重新开
发存储过程。
Oracle 存储过程的主要组成部分包括:它是通过将存储过程代码存储在 Oracle 数
据库中来创建的,然后通过引用存储过程的名称来调用;第二,它在一个权限或模式下创建;第三,它可以被其他程序调用;最后,它可以被表触发器或调用的其他存储过程调用。
CREATE OR REPLACE PROCEDURE <procedure_name>(<parameter_list>)
IS
[declaration_section]
BEGIN
END <procedure_name>;
其中,procedure_name 是存储过程的名称,parameter_list 是可提供给存储过程的
参数列表,declaration_section 是可遵循存储过程声明语句的声明部分,
execution_section 是实际执行语句和控制结构的部分。
存储过程的每个部分都充满了可编程性和灵活性,任何功能都可以在其中实现,包括
从多个表中检索数据和执行灵活的逻辑控制。
oracle 存储过程内容
oracle 存储过程内容Oracle存储过程是一种在数据库中存储的一段预编译的PL/SQL代码,可以在需要的时候被调用执行。
它可以完成复杂的数据库操作,提高数据库的性能和可维护性。
本文将介绍Oracle存储过程的基本概念、语法规则和应用场景,以帮助读者深入了解和使用这一功能。
一、Oracle存储过程的基本概念Oracle存储过程是由一系列的SQL语句、控制结构和变量组成的,它可以接受输入参数、返回输出结果,并且可以在数据库中被存储和重复使用。
存储过程可以在应用程序、触发器或其他存储过程中被调用执行,以实现特定的业务逻辑。
二、Oracle存储过程的语法规则Oracle存储过程的语法规则如下:1. 存储过程以CREATE PROCEDURE语句开始,后面跟着存储过程的名称和参数列表。
2. 存储过程的主体部分由BEGIN和END关键字包围,其中包含一系列的SQL语句和控制结构。
3. 存储过程可以定义输入参数、输出参数和局部变量,以及用于返回结果的游标。
4. 存储过程中可以使用IF、CASE、LOOP等控制结构来实现条件判断、循环等逻辑。
5. 存储过程可以使用异常处理模块来处理错误和异常情况。
6. 存储过程可以使用COMMIT和ROLLBACK语句来控制数据库事务。
7. 存储过程可以使用EXECUTE IMMEDIATE语句执行动态SQL语句。
8. 存储过程可以使用DBMS_OUTPUT包来输出调试信息。
三、Oracle存储过程的应用场景1. 数据库管理:可以使用存储过程来创建、修改和删除数据库对象,如表、视图、索引等。
2. 数据导入导出:可以使用存储过程来实现数据的批量导入和导出,提高数据的处理效率。
3. 数据转换和清洗:可以使用存储过程来实现数据的转换、清洗和校验,保证数据的质量和一致性。
4. 业务逻辑处理:可以使用存储过程来实现复杂的业务逻辑,如订单处理、库存管理等。
5. 数据报表生成:可以使用存储过程来生成各种类型的报表,如销售报表、财务报表等。
oracle中存储过程的用法
在Oracle 数据库中,存储过程是一组预定义的SQL 语句,它们被封装在数据库中以便被重复使用。
存储过程通常用于完成一系列数据库操作,可以接受输入参数并返回输出。
以下是Oracle 存储过程的基本用法:创建存储过程:CREATE OR REPLACE PROCEDURE procedure_name (parameter1 IN datatype1, parameter2 OUT datatype2)IS--变量声明variable1 datatype1;BEGIN--存储过程主体,包含SQL 语句和控制流程的逻辑--例如:SELECT column1 INTO variable1 FROM table1 WHERE condition;--对变量进行其他操作--将结果赋给OUT 参数parameter2 := variable1;--可以包含其他逻辑和条件END procedure_name;/- `CREATE OR REPLACE PROCEDURE`: 创建或替换存储过程。
- `procedure_name`: 存储过程的名称。
- `(parameter1 IN datatype1, parameter2 OUT datatype2)`: 输入和输出参数的声明。
- `IS`: 存储过程主体的开始标记。
-存储过程主体包括声明变量、执行SQL 语句、逻辑控制等。
调用存储过程:DECLARE--声明变量variable2 datatype2;BEGIN--调用存储过程procedure_name(value1, variable2);--处理输出参数variable2--可以在这里使用variable2 的值END;/- `DECLARE`: 声明变量和存储过程调用的开始标记。
-变量的声明用于存储存储过程的输出参数值。
示例:假设有一个存储过程计算两个数字的和:CREATE OR REPLACE PROCEDURE AddNumbers (num1 IN NUMBER, num2 IN NUMBER, sum OUT NUMBER)ISBEGINsum := num1 + num2;END AddNumbers;/然后可以调用它:DECLAREresult NUMBER;BEGINAddNumbers(3, 5, result);DBMS_OUTPUT.PUT_LINE('Sum is: ' || result);END;/这是一个简单的示例,实际的存储过程可能包含更复杂的逻辑和多个参数。
oracle存储过程的写法
在Oracle 数据库中,存储过程是一组被命名的PL/SQL 语句,可以在数据库中进行复杂的业务逻辑处理。
以下是Oracle 存储过程的基本写法:CREATE OR REPLACE PROCEDURE your_procedure_nameIS--声明变量variable1 datatype1;variable2 datatype2;--更多变量声明...BEGIN--存储过程体--执行逻辑和SQL 语句--示例:输出信息到控制台DBMS_OUTPUT.PUT_LINE('Hello, this is your stored procedure.');--示例:执行SQL 语句SELECT column1 INTO variable1 FROM your_table WHERE condition;--更多逻辑...EXCEPTION--异常处理WHEN NO_DATA_FOUND THENDBMS_OUTPUT.PUT_LINE('No data found.');WHEN OTHERS THENDBMS_OUTPUT.PUT_LINE('An error occurred.');END your_procedure_name;/在这个例子中:your_procedure_name 是你的存储过程的名称。
datatype1, datatype2 是存储过程中使用的变量的数据类型。
BEGIN 和END 之间是存储过程体,包含了实际的业务逻辑和SQL 语句。
EXCEPTION 部分是异常处理,当存储过程中发生异常时,可以在这里定义处理方法。
DBMS_OUTPUT.PUT_LINE 用于在PL/SQL 程序中输出信息到控制台。
注意:CREATE OR REPLACE 用于创建或替换已存在的存储过程。
存储过程的名字可以根据实际需求进行更改。
存储过程中可以包含输入参数、输出参数和返回值,根据实际需求进行定义。
ORACLE存储过程详解教程
ORACLE存储过程详解教程一、存储过程的优势1.提高性能:存储过程可以预编译并缓存在服务器中,减少了每次执行的解析和编译时间,提高了查询效率;2.保证数据的一致性和完整性:存储过程可以封装复杂的业务逻辑,避免了数据操作的错误和遗漏;3.提高安全性:存储过程可以设定访问权限,限制用户对数据库的操作,提高了数据的安全性;4.重用性:存储过程可以在不同的应用程序中重复使用,减少了开发的时间和成本。
二、创建存储过程的语法创建存储过程的语法如下:```sqlCREATE [OR REPLACE] PROCEDURE procedure_name[(parameter_name [IN , OUT , IN OUT] data_type [, ...])] IS[local_variable_declarations;]BEGINexecutable_statements[EXCEPTIONexception_handler(s)]END [procedure_name];```其中,procedure_name为存储过程的名称;parameter_name为输入参数或输出参数的名称;data_type为参数的数据类型;local_variable_declarations为本地变量的声明;executable_statements为存储过程的执行语句;exception_handler为异常处理程序。
三、存储过程的示例下面是一个简单的存储过程示例,用于在员工表中插入一条新的员工记录:```sqlCREATE OR REPLACE PROCEDURE add_employee(p_emp_id IN NUMBER, p_emp_name IN VARCHAR2)ISBEGININSERT INTO employee (emp_id, emp_name)VALUES (p_emp_id, p_emp_name);COMMIT;DBMS_OUTPUT.PUT_LINE('Employee added successfully.');EXCEPTIONWHENOTHERSTHENROLLBACK;DBMS_OUTPUT.PUT_LINE('Error: ' , SQLERRM);END add_employee;```在上面的例子中,add_employee是存储过程的名称。
ORACLE存储过程开发基础语法
1、创建存储过程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) isbegindbms_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) isx number(4,2);beginx := 1;end test;3、判断语句:if 比较式 then begin end; end if;E.gcreate or replace procedure test(x in number) is beginif x >0 thenbeginx := 0 - x;end;end if;if x = 0 then beginx: = 1;end;end if;end test;4、For 循环For ... in ... LOOP--执行语句end LOOP;(1)循环遍历游标create or replace procedure test() asCursor cursor is select name from student; name varchar(20);beginfor name in cursor LOOPbegindbms_output.putline(name);end;end LOOP;end test;(2)循环遍历数组create or replace procedure test(varArray in myPackage.TestArray) as--(输入参数varArray 是自定义的数组类型,定义方式见标题6)i number;begini := 1; --存储过程数组是起始位置是从1开始的,与java、C、C++等语言不同。
oracle存储过程写法及调用
Oracle存储过程的写法及调用如下:存储过程定义语法:```sqlCREATE [ORREPLACE] PROCEDURE procedure_name(arg1 [mode1] datatype1, arg2 [mode2] datatype2)IS [AS]PL/SQLBlock;```其中,`procedure_name` 是存储过程的名称;`arg1` 和`arg2` 是存储过程的参数,包括参数名、模式(IN、OUT、IN OUT)和数据类型;`PL/SQLBlock` 是存储过程的主体部分,包括一系列的SQL语句。
如果存储过程没有参数,只需要定义存储过程的主体部分即可。
例如:```sqlCREATE PROCEDURE out_time ISBEGINDBMS_OUTPUT.PUT_LINE('procedure_1......');END;```如果存储过程有参数,需要在定义时指定参数名、模式和数据类型。
例如:```sqlCREATE PROCEDURE procedure_2(v_i IN NUMBER, v_j OUT NUMBER) ISBEGINv_j := v_i * 2;DBMS_OUTPUT.PUT_LINE('procedure_2......' || v_i || '......' || v_j);END;```在这个例子中,`procedure_2` 接受两个参数`v_i` 和`v_j`,其中`v_i` 是输入参数,`v_j` 是输出参数。
在存储过程内部,对`v_i` 进行运算,并将结果赋值给`v_j`,然后输出运算结果。
调用存储过程的方法如下:```sqlBEGINprocedure_name(arg1 => value1, arg2 => value2);END;```其中,`procedure_name` 是存储过程的名称;`arg1` 和`arg2` 是存储过程的参数,需要指定相应的值。
oracle存储过程相关整理
oracle存储过程相关整理存储过程:存储过程是 SQL, PL/SQL, 语句的组合,它使你能将执⾏商业规则的代码从你的应⽤程序中移动到。
这样的结果就是,代码存储⼀次但是能够被多个程序使⽤。
是存放在数据库服务器上的SQL语句块,其效率⾼于同等SQL语句6-10倍下⾯通过例⼦让你了解存储过程对数据的增删查改(对中的emp操作)⼀、Oracle存储过程语法:Create [or replace] procedure 存储过程名称 (输⼊参数或输出参数)]as变量Begin执⾏主体End;⼆、IN, OUT , IN OUT ⽤来修饰参数。
IN 表⽰这个变量必须被调⽤者赋值然后传⼊到 PROCEDURE 进⾏处理。
OUT 表⽰ PRCEDURE 通过这个变量将值传回给调⽤者。
IN OUT 则是这两种的组合。
三、执⾏存储过程⽅式:1、Call 存储过程名称(参数);2、Execute 存储过程名称(参数);注意:在oracle 数据库中,call命令任何窗⼝都能使⽤,但是execute只能在命令窗⼝使⽤,否则会报⽆效的SQL语句的异常。
四、在存储过程中需要注意事项:1、在oracle数据库存储过程中,表别名不能⽤as2、在oracle数据库存储过程中,select某⼀字段时,后⾯必须紧跟into,如果select整个记录则必须使⽤游标处理3、在使⽤select....into....时必须保证数据库有该数据,否则报”no data found”异常4、在存储过程中,别名不能和字段名相同,否则虽然编译能通过,但是运⾏结果会报错五、存储过程基本语法--案例⼀:⽆参存储过程--1.创建结构CREATE PROCEDURE procedureName--存储过程名字AS--as可替换成 is--声明变量BEGIN--执⾏主体END;--2.案例create or replace procedure firstPro isbegindbms_output.put_line('Hello World');--打印输出exception --存储过程异常WHEN OTHERS THENROLLBACK;end firstPro;--3.数据库调⽤存储过程:执⾏结果:output: Hello World--(21) begin-endbeginfirstPro();end;--(22)callcall firstPro();--4.删除存储过程drop procedure firstPro;--案例⼆:带参存储过程(in:⼊参)--1.案例create or replace procedure secondPro(num in number) asbegindbms_output.put_line('The input num is :'||num);end;--2.调⽤--(21)call secondPro(4);--(22)beginsecondPro(7);end;--(23)declaren number;beginn :=1;secondPro(num=>n);end;--orBeginsecondPro(num=>1);end;--备注:=> 是 Oracle 中调⽤存储过程的时候, 指定参数名进⾏调⽤--⼀般如果是按顺序填写参数的时候,是不需要⽤=>符号的,--但是Oracle可以让你在调⽤的时候,指定"参数名称=>参数值", 这样就可以不按参数的顺序进⾏调⽤.-- => 前⾯的变量为存储过程的“形参”且必须于存储过程中定义的⼀致,⽽=>后的参数为“实际参数”。
oracle存储过程 语法 函数 总结
oracle存储过程语法函数总结对于oracle 存储过程是很优秀的一种脚本语言。
下面是一些整理:一,Plsql 调试存储过程:1、在oracle的配置和移植工具àNET MANAGER中配置连接2、在plsql中新建SQL窗口,编写存储过程3、在plsql中新建测试窗口,在begin end之间调用4、查看编译错误:在命令窗口中show errors procedure procedure_name 或者编辑的方式打开存储过程,在编译时会有错误提示一,Plsql 调试存储过程:1、在oracle的配置和移植工具àNET MANAGER中配置连接2、在plsql中新建SQL窗口,编写存储过程3、在plsql中新建测试窗口,在begin end之间调用4、查看编译错误:在命令窗口中show errors procedure procedure_name 或者编辑的方式打开存储过程,在编译时会有错误提示二,oracle存储过程基本语法1、 oracle存储过程结构:CREATE OR REPLACE PROCEDURE 存储过程名(输入输出参数)IS变量定义BEGIN代码;END 存储过程名;2、 if语句:If 逻辑表达式thenEnd;End if;If 逻辑表达式then BeginEnd;ElseBeginEnd;End if;If 逻辑表达式then BeginEnd;Elseif 逻辑表达式then BeginElseBeginEnd;End if;3、 For循环For in loop…End loop;E.g:CREATE OR REPLACE PROCEDURE TEST isBEGINfor i in 1..100 LOOPDBMS_OUTPUT.put_line(i);end LOOP;END TEST;注:这里的i可以不用申明,并且在循环体中,i会自增4、 while循环While 条件语句loopBeginEnd;End LOOP;E.g:CREATE OR REPLACE PROCEDURE TESTisi int := 1;BEGINwhile i < 100 LOOPDBMS_OUTPUT.put_line(i);end LOOP;END TEST;注:这里的i需要申明,并且循环体中,要对i进行改变5、游标的使用:定义游标打开游标提取数据关闭游标E.g:CREATE OR REPLACE PROCEDURE TESTisv_fid nvarchar2(80);Cursor cur_test isselect fid from t_pm_user;--定义游标open cur_test;--打开游标if cur_test%notfoundthen --判断游标中数据是否为空rollback;end if;loop--循环游标fetchcur_test into v_fid;--提取游标数据DBMS_OUTPUT.put_line(v_fid);EXITWHEN cur_test%NOTFOUND; --游标数据为空后退出循环end loop;close cur_test;--关闭游标END TEST;三,oracle与sqlserver部分差异1、常用函数差异Ø绝对值S:select abs(-1) valueO:select abs(-1) value from dualØ取整(大)S:select ceiling(-1.001) valueO:select ceil(-1.001) value from dualØ取整(小)S:select floor(-1.001) valueO:select floor(-1.001) value from dual Ø取整(截取)S:select cast(-1.002 as int) valueO:select trunc(-1.002) value from dual Ø四舍五入S:select round(1.23456,4) value 1.23460O:select round(1.23456,4) value from dual 1.2346Ø取随机数S:select rand() valueO:select sys.dbms_random.value(0,1) value from dual Ø如何处理null值(F2中的null以10代替)S:select F1,IsNull(F2,10) value from TblO:select F1,nvl(F2,10) value from TblØ连接S:select '11'+'22' valueO:select CONCAT('11','22') value from dualØ子串位置--返回3S:select CHARINDEX('s','sdsq',2) valueO:select INSTR('sdsq','s',2) value from dualØ求子串S:select substring('abcd',2,2) valueO:select substr('abcd',2,2) value from dualØ子串代替返回aijklmnefS:SELECT STUFF('abcdef', 2, 3, 'ijklmn') valueO:SELECT Replace('abcdef', 'bcd', 'ijklmn') value from dual Ø子串全部替换S:没发现O:select Translate('fasdbfasegas','fa','我' ) value from dual Ø长度S:len,datalengthO:lengthØ左补空格(LPAD的第一个参数为空格则同space函数)S:select space(10)+'abcd' valueO:select LPAD('abcd',14) value from dualØ右补空格(RPAD的第一个参数为空格则同space函数)S:select 'abcd'+space(10) valueO:select RPAD('abcd',14) value from dualØ删除空格S:ltrim,rtrimO:ltrim,rtrim,trimØ系统时间S:select getdate() valueO:select sysdate value from dualØ求日期S:select convert(char(10),getdate(),20) valueO:select trunc(sysdate) value from dualselect to_char(sysdate,'yyyy-mm-dd') value from dual Ø求时间S:select convert(char(8),getdate(),108) valueO:select to_char(sysdate,'hh24:mm:ss') value from dual Ø字符串转时间S:可以直接转或者select cast('2004-09-08'as datetime) valueO:SELECT To_date('2004-01-05 22:09:38','yyyy-mm-dd hh24-mi-ss') vaule FROMDUALØ求两日期某一部分的差(比如秒)S:select datediff(ss,getdate(),getdate()+12.3) valueO:直接用两个日期相减(比如d1-d2=12.3)SELECT (d1-d2)*24*60*60 vaule FROM DUALØ根据差值求新的日期(比如分钟)S:select dateadd(mi,8,getdate()) valueO:SELECT sysdate+8/60/24 vaule FROM DUAL2、其它差异Ø返回记录集S:直接在存储过程中用select即可O:一般在参数中定义一个游标类型的输出参数,在过程体中用open 游标名称for select 的方式返回记录集Ø代码格式S:语句结尾不用加分号O:语句结尾需要加分号Ø临时表S:一般动态创建临时表,临时表是一种”内存表”,不用后会自动删除表结构O:提前创建好临时表,oracle中临时表保存的是一个会话或者事务的数据,当断开连接或事务提交回滚后,临时表中的数据自动清空(清空的只是当前会话的临时表数据),但表结构还存在。
Oracle存储过程语法
Oracle存储过程语法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 。
Oracle存储过程常用语法及其使用
Oracle存储过程常⽤语法及其使⽤1、什么是存储过程存储过程Procedure是⼀组为了完成特定功能的SQL语句集合,经编译后存储在数据库中,⽤户通过指定存储过程的名称并给出参数来执⾏。
它可以接受参数、输出参数,并可以返回单个或多个结果集以及返回值。
2、存储过程基本语法存储过程的⼀般格式如下:CREATE [OR REPLACE] PROCEDURE procedure_nameIS [AS]声明部分BEGIN执⾏部分EXCEPTION异常处理部分END;调⽤存储过程:call procedure_name();---------------------------------exec procedure_name();---------------------------------beginpro_update_emp();end;写⼀个简单的存储过程使emp表的sal值增加300。
CREATE or replace procedure pro_update_empasbeginupdate emp set sal=sal+300;end;调⽤存储过程call pro_update_emp ();3、数据类型3.1 %type 数据类型:当使⽤%TYPE属性定义变量时,Oracle会⾃动地按照数据库表中相应的列来确定新变量的类型和长度。
如下,将emp表的ename字段的数据类型(如 ‘varchar(2)’)赋给变量 v_enamev_ename emp.ename%type3.2 %ROWTYPE数据类型:如果⼀张表中包含较多的列,则可以使⽤%ROWTYPE来表⽰表中⼀⾏记录的变量的数据类型。
如下:将dept表中⼀⾏中各字段的数据类型(‘number’,’varchar2(50)’,varchar2(50))赋给v_dept_row,⾮常便利,可以直接查询后将⼀⾏数据赋值。
(注:语句中 into 执⾏赋值操作,将查询结果直接赋值给 v_dept_row)CREATE or replace procedure pro_update_empasv_dept_row dept%rowtype;beginselect * into v_dept_row from dept where deptno=11;end;3.3 %record数据类型:⾃定义记录的数据类型,声明⼀个⾏数据类型,将每列的数据类型进⾏⾃定义。
Oracle存储过程基本语法 存储过程
(1) 使用Oracle 自带的数组类型
x array; -- 使用时需要需要进行初始化
e.g:
create or replace procedure test(y out array) is
x array;
begin
x := new array();
while 条件语句 LOOP
begin
end;
end LOOP;
E.g
create or replace procedure test(i in number) as
begin
while i < 10 LOOP
begin
i:= i + 1;
If (判断条件) then
Select 列名 into 变量2 from 表A where列名=param1;
Dbms_output。Put_line(‘打印信息’);
Elsif (判断条件) then
Dbms_output。Put_line(‘打印信息’);
(
--定义参数
is_ym IN CHAR(6) ,
the_count OUT NUMBER,
)
AS
--定义变量
vs_msg VARCHAR2(4000); --错误信息变量
vs_ym_beg CHAR(6); --起始月份
vs_ym_end CHAR(6); --终止月份
(1)Cursor 型游标( 不能用于参数传递)
create or replace procedure test() is
Else
Raise 异常名(NO_DATA_FOUND);
ORACLE存储过程详解教程
ORACLE存储过程详解教程ORACLE是一种关系数据库管理系统,它支持存储过程的概念。
存储过程是一段预编译的SQL代码,可以被重复调用,用于实现复杂的业务逻辑。
在本篇文章中,我将详细介绍ORACLE存储过程的概念、语法和使用方法。
一、存储过程的概念存储过程是一种封装了一系列SQL语句的代码块,可以在数据库中创建和保存。
它可以接受输入参数,并返回输出参数。
存储过程通常用于实现复杂的业务逻辑,提高数据库的性能和安全性。
二、存储过程的语法在ORACLE中,可以使用CREATEPROCEDURE语句来创建存储过程。
以下是CREATEPROCEDURE语句的基本语法:```CREATE [OR REPLACE] PROCEDURE procedure_name[(parameter_name [IN , OUT , IN OUT] data_type [, ...])] [IS,AS]BEGIN--存储过程的SQL语句[EXCEPTION--异常处理代码END [procedure_name];```其中,CREATE PROCEDURE用于创建存储过程,OR REPLACE用于替换已存在的存储过程。
procedure_name是存储过程的名称。
parameter_name是存储过程的参数名,可以指定参数的类型(IN、OUT或IN OUT)。
data_type是参数的数据类型。
BEGIN和END之间是存储过程的代码块,可以包含多条SQL语句。
EXCEPTION用于处理异常情况。
三、存储过程的使用方法以下是一个简单的示例,演示了如何在ORACLE中创建和调用存储过程:```CREATE OR REPLACE PROCEDURE get_employee_name(p_employee_id IN NUMBER, p_employee_name OUT VARCHAR2)ISBEGINSELECT employee_name INTO p_employee_nameFROM employeesWHERE employee_id = p_employee_id;EXCEPTIONWHENNO_DATA_FOUNDTHENp_employee_name := 'Employee not found';END;```在这个例子中,我们创建了一个名为get_employee_name的存储过程。
Oracle存储过程及调用
Oracle存储过程及调⽤Oracle存储过程语法Oracle的存储过程语法如下:create procedure 存储过程名称(随便取)is在这⾥可以定义常量、变量、游标、复杂数据类型这⾥可以定义变量、常量begin执⾏部分end;(2)带参数的存储过程语法:create procedure 存储过程名称(随便取) (变量1 数据类型,变量2 数据类型,...,变量n 数据类型)is在这⾥可以定义常量、变量、游标、复杂数据类型这⾥可以定义变量、常量begin执⾏部分end;(3)带输⼊、输出参数的存储过程语法:create procedure 存储过程名称(随便取) (变量1 in(或out) 数据类型,变量2 in(或out) 数据类型,...,变量n in(或out) 数据类型)is在这⾥可以定义常量、变量、游标、复杂数据类型这⾥可以定义变量、常量begin执⾏部分end;注意:⽤上⾯的语法创建存储过程时可能会碰到数据库中已经有了同名的存储过程,这样Oracle就会弹框报错,说名字已被现有对象使⽤。
解决⽅法有两种: ⽅法⼀:换个存储过程名 ⽅法⼆:在最开头的create procedure 之间加上 or replace 关键字,例如:create or replace procedure 存储过程名称。
但是这种⽅法不建议使⽤,因为这种⽅法会把之前同名的存储过程替换为你当前写的这个存储过程案例⼀:没参数的存储过程create replace procedure procedure_1isbegindbms_output.put_line('procedure_1.......');end;存储过程案例⼆:带参数的的存储过程create procedure procedure_2(v_i number,v_j number)isv_m number(5);begindbms_output.put_line('procedure_2.......');v_m := v_i + v_j;dbms_output.put_line(v_i||' + '||v_j||' = '||v_m);end;存储过程案例三:带输⼊、输出参数的存储过程存储过程的参数分为输⼊参数和输出参数,输⼊参数:输⼊参数⼀般会在变量名和数据类型之间加in来表⽰该参数是输⼊参数输出参数:输出参数⼀般会在变量名和数据类型之间加out来表⽰该变量是输出参数不写in和out的话,默认为输⼊参数create procedure procedure_3(v_i in number,v_j in number ,v_m out number)isbegindbms_output.put_line('procedure_3.......');v_m:=v_i - v_j;dbms_output.put_line(v_i||' - '||v_j||' = '||v_m);end;PL/SQL块中调⽤存储过程下⾯以调⽤上⾯三个存储过程为例declarev_param1 number(5):=2;v_param2 number(5):=8;v_result number(5);begin--调⽤上⾯案例⼀的存储过程procedure_1();--调⽤上⾯案例⼆的存储过程procedure_2(v_param1,v_param2);--调⽤上⾯案例三的存储过程procedure_3(v_param1,v_param2,v_result);dbms_output.put_line(v_result);end;/*执⾏结果:*/procedure_1.......procedure_2.......2 + 8 = 10procedure_3.......2 - 8 = -610java调⽤存储过程案例⼀:java调⽤没有返回值的存储过程要求:编写⼀个像数据库emp表插⼊⼀条编号为6666,姓名为张三,职位为MANAGER的记录/*存储过程*/create procedure procedure_4(v_empno emp.empno%type,v_ename emp.ename%type,v_job emp.job%type )isbegininsert into emp (empno,ename,job) values (v_empno,v_ename,v_job);end;//java调⽤存储过程public static void main(String[] args) {Connection conn=null;CallableStatement cs=null;ResultSet rs=null;//java调⽤存储过程try {Class.forName("oracle.jdbc.OracleDriver");conn=DriverManager.getConnection("jdbc:oracle:thin:@127.0.01:1521:orcl", "scott", "tiger");cs=conn.prepareCall("{call procedure_4(?,?,?)}");//给输⼊参数赋值cs.setInt(1, 6666);cs.setString(2, "张三");cs.setString(3, "MANAGER");cs.execute();//执⾏} catch (Exception e) {e.printStackTrace();}finally{closeResource(conn,cs,rs);//关闭资源}}//执⾏后就会向数据库的emp表中插⼊⼀条编号为6666,姓名为张三,职位为MANAGER的记录案例⼆:java调⽤返回单列单⾏的存储过程要求:编写⼀个根据员⼯编号查找员⼯姓名的存储过程,并⽤java调⽤该存储过程/*存储过程*/create procedure procedure_5(v_empno in emp.empno%type,v_ename out emp.ename%type)isbeginselect ename into v_ename from emp where empno=v_empno;end;//java调⽤存储过程public static void main(String[] args) {Connection conn=null;CallableStatement cs=null;ResultSet rs=null;try {Class.forName("oracle.jdbc.OracleDriver");conn=DriverManager.getConnection("jdbc:oracle:thin:@127.0.01:1521:orcl", "scott","tiger");cs=conn.prepareCall("{call procedure_5(?,?)}");cs.setInt(1, 6666);//给输⼊参数赋值/*指定输出参数的数据类型语法:oracle.jdbc.OracleTypes.输出参数的数据类型此例输出参数的数据类型是varchar,所以是oracle.jdbc.OracleTypes.VARCHAR*/cs.registerOutParameter(2, oracle.jdbc.OracleTypes.VARCHAR);cs.execute();//执⾏//获取输出参数的值,位置要和输出参数对应?的位置对应起来,该例输出参数对应第2个问号,⽽且输出参数的数据类型为字符型,所以是cs.getString(2) String a=cs.getString(2);System.out.println("员⼯姓名:"+a);} catch (Exception e) {e.printStackTrace();}finally{closeResource(conn,cs,rs);//关闭资源}}/*执⾏结果,控制台打印:*/结果:员⼯姓名:张三案例三:java调⽤返回单⾏多列的存储过程要求:编写⼀个根据员⼯编号查找员⼯姓名、职位和⼯资的存储过程,并⽤java调⽤该存储过程/*存储过程*/create procedure procedure_6(v_empno in emp.empno%type,v_ename out emp.ename%type,v_job out emp.job%type,v_sal out emp.sal%type)isbeginselect ename,job,sal into v_ename,v_job,v_sal from emp where empno=v_empno;end;//java调⽤存储过程public static void main(String[] args) {Connection conn=null;CallableStatement cs=null;ResultSet rs=null;try {Class.forName("oracle.jdbc.OracleDriver");conn=DriverManager.getConnection("jdbc:oracle:thin:@127.0.01:1521:orcl", "scott","tiger");cs=conn.prepareCall("{call procedure_6(?,?,?,?)}");cs.setInt(1, 7788);//指定输出参数的数据类型,注意:顺序要对应起来cs.registerOutParameter(2, oracle.jdbc.OracleTypes.VARCHAR);cs.registerOutParameter(3, oracle.jdbc.OracleTypes.VARCHAR);cs.registerOutParameter(4, oracle.jdbc.OracleTypes.DOUBLE);cs.execute();//执⾏//获取返回值String ename=cs.getString(2);//获取姓名String job=cs.getString(3);//获取职位double sal=cs.getDouble(4);//获取薪⽔System.out.println("员⼯编号为7788的姓名为:"+ename+" 职位是:"+job+" 薪⽔是:"+sal);} catch (Exception e) {e.printStackTrace();}finally{closeResource(conn,cs,rs);//关闭资源}}/*执⾏结果,控制台打印:*/员⼯编号为7788的姓名为:SCOTT 职位是:ANALYST 薪⽔是:3000.0案例四:java调⽤返回多⾏多列(返回列表)的存储过程要求:编写⼀个根据部门编号查找部门所有员⼯信息的存储过程,并⽤java调⽤该存储过程/*定义游标*/create package my_package astype emp_cursor is ref cursor;end my_package;/*存储过程*/create procedure procedure_7(v_deptno in emp.deptno%type,emp_cursor out my_package.emp_cursor)isbeginopen emp_cursor for select * from emp where deptno=v_deptno;end;//java调⽤存储过程public static void main(String[] args) {Connection conn=null;CallableStatement cs=null;ResultSet rs=null;try {Class.forName("oracle.jdbc.OracleDriver");conn=DriverManager.getConnection("jdbc:oracle:thin:@127.0.01:1521:orcl", "scott","tiger");cs=conn.prepareCall("{call procedure_7(?,?)}");cs.setInt(1, 20);//给输⼊参数赋值cs.registerOutParameter(2, oracle.jdbc.OracleTypes.CURSOR );//指定输出参数的数据类型cs.execute();rs=(ResultSet) cs.getObject(2);//获取输出参数的值while(rs.next()){//顺序为数据库中字段前后顺序,例如数据库emp表中第5列为hiredate,数据类型为Date,所以获取第5列值时就应该⽤rs.getDate(5) System.out.println(rs.getInt(1)+" "+rs.getString(2)+" "+rs.getDate(5));}} catch (Exception e) {e.printStackTrace();}finally{closeResource(conn,cs,rs);//关闭资源}}/*以下就是20号部门所有员⼯的信息,这⾥为⽅便我们只打印了编号、姓名和⼊职时间运⾏结果,控制台打印:*/7369 SMITH 1980-12-177566 JONES 1981-04-027788 SCOTT 1987-04-197876 ADAMS 1987-05-237902 FORD 1981-12-03这是上⾯java调⽤存储过程代码中关闭资源⽅法的代码public static void closeResource(Connection conn,CallableStatement cs,ResultSet rs){if(rs!=null){try {rs.close();} catch (SQLException e) {e.printStackTrace();}}if(cs!=null){try {cs.close();} catch (SQLException e) {e.printStackTrace();}}if(conn!=null){try {conn.close();} catch (SQLException e) {e.printStackTrace();}}}最后给个应⽤,分页的存储过程分页存储过程:/*定义游标*/create package page_package astype page_cursor is ref cursor;end page_package;/*存储过程*/create procedure pro_paging (v_page_size in number,--每页显⽰多少条v_page_count out number,--总页数v_current_page in number,--当前页v_total_count out number,--记录总条数emp_cursor out page_package.page_cursor--返回查询结果集的游标)isv_begin number(5):=v_page_size*(v_current_page-1)+1;--查询起始位置v_end number(5):=v_page_size*v_current_page;--查询结束位置v_sql varchar2(1000):='select empno,ename from(select a.empno,a.ename,rownum rn from(select empno,ename from emp) awhere rownum<='|| v_end ||') bwhere b.rn>='||v_begin;/*不能像下⾯这么写,不然调⽤该存储过程时会报类型不⼀致的错,因为最⾥⾯查的只有empno,ename,因此外⾯也要和⾥⾯保持⼀致 v_sql varchar2(1000):=\'select * from(select a.*,rownum rn from(select empno,ename from emp) awhere rownum<=\'|| v_end ||\') bwhere b.rn>='||v_begin;*/v_ename varchar2(10);v_empno number(4);beginopen emp_cursor for v_sql;loopfetch emp_cursor into v_empno,v_ename;exit when emp_cursor%notfound;dbms_output.put_line(v_empno||' '||v_ename);end loop;v_sql:='select count(empno) from emp';execute immediate v_sql into v_total_count;if(mod(v_total_count,v_page_size)=0) thenv_page_count:=v_total_count/v_page_size;elsev_page_count:=trunc(v_total_count/v_page_size)+1;end if;dbms_output.put_line('共 '||v_total_count||' 条记录');dbms_output.put_line('共 '||v_page_count||' 页');dbms_output.put_line('当前页: '||v_current_page);dbms_output.put_line('每页显⽰ '||v_page_size||' 条');end;Java调⽤的话和上⾯java调⽤存储过程的例⼦⼀样。
oracle存储过程语法
oracle存储过程语法Oracle储过程语法是用来创建可重复使用的程序单元,供多个应用程序使用。
存储过程可以被定义为一组操作,包括查询和访问数据库,改变数据库中的数据,以及执行SQL和PL/SQL语句的一般程序单元。
Oracle存储过程语法的优点是以下几点:一、优化查询效率:使用存储过程可以大大提高查询性能,因为它可以将查询的结果直接缓存在内存中,而不必每次都重新执行查询。
二、安全性:存储过程可以限制某种角色或用户的访问权限,并根据角色或用户来控制某种SQL语句被执行的次数,以此来提高数据库的安全性。
三、减少网络传输开销:存储过程可以在服务器端执行,减少客户端和服务器端之间的网络传输开销,提高系统的运行效率。
四、简化数据库调用:通过存储过程,可以把多个SQL语句封装成一个存储过程,从而更简便地使用数据库,减少客户端和服务器端之间的消息交互次数。
Oracle存储过程的语法有如下几个基本组成部分:一、创建存储过程:定义存储过程的SQL语句,包括create procedure,begin,end等。
二、声明变量:可以将特定的变量定义在存储过程中,这些变量可以用来缓存中间结果,或者用于SQL语句中。
三、执行SQL语句:存储过程中可以执行多个SQL语句,这些语句可以是select,insert,update,delete等,也可以是PL/SQL语句等。
四、流程控制:存储过程中可以使用if语句,case语句,while 循环等,来控制程序的流程。
五、参数的处理:存储过程可以使用参数来接收客户端传来的数据。
Oracle存储过程语法也有几种常用的函数和操作,其中包括:一、用户定义函数:函数可以被定义为存储过程,用来解决复杂的计算问题。
二、游标操作:存储过程可以声明游标,在游标中操作数据库表中的行,以此来实现复杂的查询效果。
三、事务处理:存储过程中可以使用begin transaction和commit 等语句,对数据库表中的事务作为一组整体来处理,从而保证事务的安全性。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
存储过程1 CREATE OR REPLACE PROCEDURE 存储过程名2 IS3 BEGIN4 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 类型(值围);BeginSelect count(*) into 变量1 from 表A where列名=param1;If (判断条件) thenSelect 列名 into 变量2 from 表A where列名=param1;Dbms_output。
Put_line(‘打印信息’);Elsif (判断条件) thenDbms_output。
Put_line(‘打印信息’);ElseRaise 异常名(NO_DATA_FOUND);End if;ExceptionWhen others thenRollback;End;注意事项:1,存储过程参数不带取值围,in表示传入,out表示输出类型可以使用任意Oracle中的合法类型。
2,变量带取值围,后面接分号3,在判断语句前最好先用count(*)函数判断是否存在该条操作记录4,用select 。
into。
给变量赋值5,在代码中抛异常用 raise+异常名CREATE OR REPLACE PROCEDURE存储过程名(--定义参数is_ym IN CHAR(6) ,the_count OUT NUMBER,)AS--定义变量vs_msg VARCHAR2(4000); --错误信息变量vs_ym_beg CHAR(6); --起始月份vs_ym_end CHAR(6); --终止月份vs_ym_sn_beg CHAR(6); --同期起始月份vs_ym_sn_end CHAR(6); --同期终止月份--定义游标(简单的说就是一个可以遍历的结果集)CURSOR cur_1 ISSELECT 。
FROM 。
WHERE 。
GROUP BY 。
;BEGIN--用输入参数给变量赋初值,用到了Oralce的SUBSTR TO_CHAR ADD_MONTHSTO_DATE 等很常用的函数。
vs_ym_beg := SUBSTR(is_ym,1,6);vs_ym_end := SUBSTR(is_ym,7,6);vs_ym_sn_beg :=TO_CHAR(ADD_MONTHS(TO_DATE(vs_ym_beg,'yyyymm'),-12),'yyyymm');vs_ym_sn_end :=TO_CHAR(ADD_MONTHS(TO_DATE(vs_ym_end,'yyyymm'),-12),'yyyymm');--先删除表中特定条件的数据。
DELETE FROM 表名 WHERE ym = is_ym;--然后用置的DBMS_OUTPUT对象的put_line方法打印出影响的记录行数,其中用到一个系统变量SQL%rowcountDBMS_OUTPUT.put_line('del上月记录='||SQL%rowcount||'条');INSERT INTO表名(area_code,ym,CMCODE,rmb_amt,usd_amt)SELECTarea_code,is_ym,CMCODE,SUM(rmb_amt)/10000,SUM(usd _amt)/10000FROM BGD_AREA_CM_M_BASE_TWHERE ym >= vs_ym_begAND ym <= vs_ym_endGROUP BY area_code,CMCODE;DBMS_OUTPUT.put_line('ins当月记录='||SQL%rowcount||'条');--遍历游标处理后更新到表。
遍历游标有几种方法,用for语句是其中比较直观的一种。
FOR rec IN cur_1 LOOPUPDATE 表名SET rmb_amt_sn = rec.rmb_amt_sn,usd_amt_sn = d_amt_snWHERE area_code = rec.area_codeAND CMCODE = rec.CMCODEAND ym = is_ym;END LOOP;COMMIT;--错误处理部分。
OTHERS表示除了声明外的任意错误。
SQLERRM是系统置变量保存了当前错误的详细信息。
EXCEPTIONWHEN OTHERS THENvs_msg := 'ERROR INxxxxxxxxxxx_p('||is_ym||'):'||SUBSTR(SQLERRM,1,50 0);ROLLBACK;--把当前错误记录进日志表。
INSERT INTOLOG_INFO(proc_name,error_info,op_date)VALUES('xxxxxxxxxxx_p',vs_msg,SYSDATE);COMMIT;RETURN;END;oracle存储过程语法1 、判断语句:if 比较式 then begin end; end if;create or replace procedure test(x in number) is beginif x >0 thenbeginx := 0 - x;end;end if;if x = 0 thenbeginx: = 1;end;end if;end test;2 、For 循环For ... in ... LOOP-- 执行语句end LOOP;(1) 循环遍历游标create or replace procedure test() asCursor cursor is select name from student; name varchar(20);beginfor name in cursor LOOPbegindbms_output.putline(name);end;end LOOP;end test;(2) 循环遍历数组create or replace procedure test(varArray in myPackage.TestArray) as--( 输入参数varArray 是自定义的数组类型,定义方式见标题6)i number;begini := 1; -- 存储过程数组是起始位置是从1 开始的,与java 、C 、C++ 等语言不同。
因为在Oracle 中本是没有数组的概念的,数组其实就是一-- 表(Table), 每个数组元素就是表中的一个记录,所以遍历数组时就相当于从表中的第一条记录开始遍历for i in 1..varArray.count LOOPdbms_output.putline('The No.'|| i ||'record in varArrayis:'||varArray(i));end LOOP;end test;3 、While 循环while 条件语句 LOOPbeginend;end LOOP;E.gcreate or replace procedure test(i in number) as beginwhile i < 10 LOOPbegini:= i + 1;end;end LOOP;end test;4 、数组首先明确一个概念:Oracle 中本是没有数组的概念的,数组其实就是一表(Table), 每个数组元素就是表中的一个记录。
使用数组时,用户可以使用Oracle 已经定义好的数组类型,或可根据自己的需要定义数组类型。
(1) 使用Oracle 自带的数组类型x array; -- 使用时需要需要进行初始化e.g:create or replace procedure test(y out array) isx array;beginx := new array();y := x;end test;(2) 自定义的数组类型 ( 自定义数据类型时,建议通过创建Package 的方式实现,以便于管理)create or replace package myPackage isPublic type declarations type info is record( name varchar(20), y number);type TestArray is table of info index bybinary_integer;-- 此处声明了一个TestArray 的类型数据,其实其为一存储Info 数据类型的Table 而已,及TestArray 就是一表,有两个字段,一个是name ,一个是y 。
需要注意的是此处使用了Index by binary_integer 编制该Table 的索引项,也可以不写,直接写成:type TestArray istable of info ,如果不写的话使用数组时就需要进行初始化:varArray myPackage.TestArray; varArray := new myPackage.TestArray();end TestArray;5. 游标的使用 Oracle 中Cursor 是非常有用的,用于遍历临时表中的查询结果。
其相关方法和属性也很多,现仅就常用的用法做一二介绍:(1)Cursor 型游标( 不能用于参数传递)create or replace procedure test() iscusor_1 Cursor is select std_name from student where ...; --Cursor 的使用方式1 cursor_2 Cursor;beginselect class_name into cursor_2 from classwhere ...; --Cursor 的使用方式2可使用For x in cursor LOOP .... end LOOP; 来实现对Cursor 的遍历end test;(2)SYS_REFCURSOR 型游标,该游标是Oracle 以预先定义的游标,可作出参数进行传递create or replace procedure test(rsCursor out SYS_REFCURSOR) iscursor SYS_REFCURSOR;name varhcar(20);beginOPEN cursor FOR select name from student where ... --SYS_REFCURSOR 只能通过OPEN 方法来打开和赋值LOOPfetch cursor into name --SYS_REFCURSOR 只能通过fetch into 来打开和遍历 exit whencursor%NOTFOUND; --SYS_RE FCURSOR 中可使用三个状态属性:---%NOTFOUND( 未找到记录信息) %FOUND( 找到记录信息)---%ROWCOUNT( 然后当前游标所指向的行位置)dbms_output.putline(name);end LOOP;rsCursor := cursor;end test;实例下面写一个简单的例子来对以上所说的存储过程的用法做一个应用:现假设存在两表,一是学生成绩表(studnet) ,字段为:stdId,math,article,language,music,sport,total,avera ge,step一是学生课外成绩表(out_school), 字段为:stdId,parctice,comment通过存储过程自动计算出每位学生的总成绩和平均成绩,同时,如果学生在课外课程中获得的评价为A ,就在总成绩上加20 分。