oracle存储过程学习经典[语法+实例+调用]
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存储过程开发基础语法
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 数据库中,存储过程是一组预定义的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 存储过程优秀例子Oracle存储过程是一种在数据库中存储和执行SQL语句的过程。
它可以接受参数并返回结果,用于实现复杂的业务逻辑和数据操作。
下面是10个优秀的Oracle存储过程示例,展示了不同方面的功能和用法。
1. 创建表并插入数据```sqlCREATE PROCEDURE create_employee_table ASBEGINEXECUTE IMMEDIATE 'CREATE TABLE employee (id NUMBER, name VARCHAR2(100))';EXECUTE IMMEDIATE 'INSERT INTO employee VALUES (1, ''John Doe'')';EXECUTE IMMEDIATE 'INSERT INTO employee VALUES (2, ''Jane Smith'')';END;```这个存储过程创建了一个名为employee的表,并插入了两条数据。
2. 更新员工姓名```sqlCREATE PROCEDURE update_employee_name(p_id NUMBER,p_name VARCHAR2) ASBEGINUPDATE employee SET name = p_name WHERE id = p_id;COMMIT;END;```这个存储过程接受员工的ID和新的姓名作为参数,然后更新对应员工的姓名。
3. 删除员工记录```sqlCREATE PROCEDURE delete_employee(p_id NUMBER) AS BEGINDELETE FROM employee WHERE id = p_id;COMMIT;END;```这个存储过程接受员工的ID作为参数,然后删除对应的员工记录。
oracle存储过程案例及详解
存储过程经典案例及详解收藏以下案例都是在pl/sql环境运行无误的情况下,由本人整理收集的,大家可以放心浏览,案例中的分析有不妥之处望大家指正。
案例1:用fetch游标取值。
declaretype c is ref cursor;emp_sor c;cname emp.ename%type;csal emp.sal%type;beginopen emp_sor for select ename,sal from emp where deptno=10;loopfetch emp_sor into cname,csal; --取游标的值给变量。
dbms_output.put_line('ename:'||cname||'sal'||csal);exit when emp_sor%notfound;end loop;close emp_sor;end;打开emp_sor游标之后,emp_sor指针从表的第一行开始往下移动,在指定位置取值,并把该行的值赋给对应的变量。
循环取值,每一次对应行的值赋给对应的变量。
Fetch…. into 每次提取一行。
案例2:用fetch游标取值,并循环打印出部门编号为10的员工的名字和薪水。
declarecursor emp_sor is select ename,sal from emp where deptno=10;cname emp.ename%type;csal emp.sal%type;beginopen emp_sor ;loopfetch emp_sor into cname,csal; --取游标的值给变量。
dbms_output.put_line('ename:'||cname||'sal'||csal);exit when emp_sor%notfound;end loop;close emp_sor;end;案例3:运用记录变量接收游标指定的表数据。
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复杂的存储过程代码实例
Oracle 数据库的存储过程是一种在数据库中存储复杂程序,这个程序可以被调用执行。
下面是一个 Oracle 存储过程的简单示例,这个存储过程将根据提供的参数更新一个表中的数据:
```sql
CREATE OR REPLACE PROCEDURE update_employee_salary(
p_emp_id IN NUMBER,
p_salary IN NUMBER
) AS
BEGIN
UPDATE employees
SET salary = p_salary
WHERE employee_id = p_emp_id;
COMMIT;
END;
/
```
在这个例子中,我们创建了一个名为 `update_employee_salary` 的存储过程,它接受两个参数:`p_emp_id` 和 `p_salary`。
这个存储过程会更新
`employees` 表中对应 `employee_id` 的员工的工资。
要调用这个存储过程,你可以使用以下 SQL 语句:
```sql
BEGIN
update_employee_salary(1, 5000);
END;
/
```
这个例子是非常基础的,实际使用中的存储过程可能会涉及到更复杂的 SQL 查询和逻辑处理。
在实际使用中,需要根据具体的业务需求来设计和编写存储过程。
oracle存&储过程and语法
存储过程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 。
oracle存储过程学习经典[语法+实例+调用]
Oracle存储过程学习目录Oracle存储过程 (1)Oracle存储过程基础知识 (1)Oracle存储过程的基本语法 (2)关于Oracle存储过程的若干问题备忘 (4)1.在Oracle中,数据表别名不能加as。
(4)2.在存储过程中,select某一字段时,后面必须紧跟into,如果select整个记录,利用游标的话就另当别论了。
(5)3.在利用select...into...语法时,必须先确保数据库中有该条记录,否则会报出"no datafound"异常。
(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)O racle存储过程基础知识商业规则和业务逻辑可以通过程序存储在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');FUNCTION))的区别。
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存储过程基本语法
Oracle存储过程基本语法⼀、形式 1 CREATE OR REPLACE PROCEDURE 存储过程名 //是⼀个SQL语句通知Oracle数据库去创建⼀个叫做skeleton存储过程, 如果存在就覆盖它; 2 IS //IS关键词表明后⾯将跟随⼀个PL/SQL体。
3 BEGIN //BEGIN关键词表明PL/SQL体的开始。
4 NULL; //NULL PL/SQL语句表明什么事都不做,这句不能删去,因为PL/SQL体中⾄少需要有⼀句; 5 END; //END关键词表明PL/SQL体的结束⼆、存储过程创建语法:create or replace procedure 存储过程名(param1 in type,param2 out type)as变量1 类型(值范围);变量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;使⽤以下代码可以执⾏存储过程:BEGINgetDeptCount;END;以上存储过程还可以通过以下代码来简化调⽤:EXEC getDeptCount[;]CALL getDeptCount();注意事项:1,存储过程参数不带取值范围,in表⽰传⼊,out表⽰输出类型可以使⽤任意Oracle中的合法类型。
2,变量带取值范围,后⾯接分号3,在判断语句前最好先⽤count(*)函数判断是否存在该条操作记录4,⽤select 。
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存储过程是一组预编译的SQL语句,可以在数据库中进行重复性的操作。
它们可以接受输入参数,并返回输出参数,可以帮助提高数据库性能,简化复杂的操作,并且可以在应用程序中进行复用。
下面是一个Oracle存储过程的示例,用于计算一个员工的平均工资:```sqlCREATE OR REPLACE PROCEDURE calculate_avg_salaryp_employee_id IN NUMBER,p_avg_salary OUT NUMBERISv_total_salary NUMBER;v_num_employees NUMBER;BEGINSELECT SUM(salary), COUNT(*) INTO v_total_salary,v_num_employeesFROM employeesWHERE department_id = p_employee_id;IF v_num_employees > 0 THENp_avg_salary := v_total_salary / v_num_employees;ELSEp_avg_salary := 0;ENDIF;END;```在上面的示例中,存储过程接受一个输入参数p_employee_id,表示部门ID,同时定义了一个输出参数p_avg_salary,用于返回平均工资。
存储过程内部使用SELECT语句查询指定部门的员工工资总和和员工数量,并将结果存储在变量v_total_salary和v_num_employees中。
然后,根据员工数量的值,计算平均工资并将结果存储在输出参数p_avg_salary 中。
存储过程可以使用CREATEORREPLACEPROCEDURE语句创建,其中的IN和OUT关键字用于指定参数的传递方式。
在存储过程内部可以使用各种SQL语句、控制结构和变量来实现业务逻辑。
存储过程可以通过调用EXECUTE或CALL语句来执行,也可以在应用程序中通过存储过程的名称来调用。
oracle存储过程学习语法实例调用
o r a c l e存储过程学习语法实例调用Revised by Chen Zhen in 2021Oracle 存储过程学习目录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. 在存储过程中,别名不能和字段名称相同,否则虽然编译可以通过,但在运行阶段会报错55. 在存储过程中,关于出现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 权限。
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 存储过程实例详解:1. 什么是存储过程?Oracle 存储过程是一种类似于子程序或函数的数据库对象,在数据库中完成特定任务,其能大大加快数据库操作的响应时间。
Oracle存储过程功能表现为一个静态数据库对象,它可以接受参数,在每次执行制定的任务时还可以返回结果。
它也可以根据参数进行多次执行,以便对数据进行多次处理。
2. Oracle 存储过程的使用步骤(1)创建存储过程:使用CREATE PROCEDURE 语句创建存储过程,指定参数,SQL语句或控制结构;(2)调用存储过程:通过使用 CALL 语句调用该存储过程。
(3)定义变量:为Oracle 存储过程定义变量;(4)使用 OUT 参数:处理 OUT 参数,其所提供的数据将被程序处理;(5)处理返回值:在Oracle存储过程中返回值可以被处理;(6)删除存储过程:使用DROPPROCEDURE 语句删除存储过程;3. Oracle 存储过程的优点(1)提高运行性能:Oracle 存储过程能够提高数据库查询性能,并利用该存储过程重复运行减少数据库操作;(2)高安全性:由于Oracle存储过程运行在数据库中,因此可以很好地保证安全性;(3)实现更高级的功能:Oracle存储过程支持流程控制语句、变量以及丰富的函数。
4. Oracle 存储过程的实例以下是一个 Oracle 存储过程示例:CREATE OR REPLACE PROCEDURE employees_by_department(p_department_id IN employees.department_id%TYPE)ISBEGINSELECT last_name, salaryINTO l_last_name, l_salaryFROM employeesWHERE department_id = p_department_id;DBMS_OUTPUT.PUT_LINE('Last name: ' || l_last_name);DBMS_OUTPUT.PUT_LINE('Salary: ' || l_salary);END;这个 Oracle 存储过程 employees_by_department,用于根据部门 ID 查询某部门员工的最后一个名字和工资,最后将结果输出到DBMS_OUTPUT 对象中。
Oracle存储过程语法
Oracle存储过程语法创建基本的存储过程1CREATE OR REPLACE PROCEDURE MyProName IS2BEGIN3NULL;4END;⾏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体的结束创建带参数存储过程现在想给存储过程加上参数,定义变量怎么处理呢?如下1CREATE OR REPLACE PROCEDURE MyPro(param1 in varchar2,param2 out varchar2) as2 v_cnt number; --定义变量13 tablename1 varchar2(80); --定义变量24 sqlTxt varchar2(2000); --定义变量25BEGIN6--处理逻辑7NULL;8END;(1)存储过程参数不带取值范围,in表⽰传⼊,out表⽰输出;类型可以使⽤任意Oracle中的合法类型。
(2) 变量带取值范围,后⾯接分号创建带事务的存储过程CREATE OR REPLACE PROCEDURE MyPro(param1 in varchar2,param2 out varchar2) asv_cnt number; --定义变量1tablename1 varchar2(80); --定义变量2sqlTxt varchar2(2000); --定义变量2BEGIN--处理逻辑NULL;commit;--提交事务ExceptionWhen others thenDbms_output.Put_line(sqlerrm);--打印输出错误Rollback;--回滚事务END;提交事务,存在异常则回滚事务;使⽤游标游标遍历CREATE OR REPLACE PROCEDURE MyPro(param1 in varchar2, param2 out varchar2) asv_cnt number; --定义变量1tablename1 varchar2(80); --定义变量2sqlTxt varchar2(2000); --定义变量2BEGIN--定义游标cursor c_tab_temp1 isselect t.modelnumber, t.tablename from d_modelmap t;c_bom_row1 c_tab_temp1%rowtype;--处理逻辑--循环游标for c_bom_row1 in c_tab_temp1 looptablename1 := c_bom_row1.tablename; --取游标中的值END LOOP;commit; --提交事务ExceptionWhen others thenDbms_output.Put_line(sqlerrm); --打印输出错误Rollback; --回滚事务END;返回游标create or replace procedure test(res out varchar2,p_cur out sys_refcursor) asBeginopen p_cur forselect*from tableNameres:='';end;其他使⽤技巧分⽀条件判断--分⽀判断if tablename1 <>''then--处理逻辑null;else--处理逻辑null;end if;动态sql--拼接动态sqlsqltxt :='update '|| tablename1 ||' tset t.partid=(select t3.f_id from i_partlist t3 where t3.part_no=t.part_no and nvl(t3.part_techstate,'''')=nvl(t.part_techstate,''''))where not exists(select t2.f_id from i_Partlist t2 where t2.f_id=t.partid)'; --执⾏动态sqlexecute immediate sqlTxt;给变量赋值(1)⽤select XX into xx给变量赋值select count(1) into v_count from A t where t.A='aaa';(2)直接赋值V_TEST :=123;while 循环WHILE V_TEST=1 LOOPBEGINXXXXEND;END LOOP;判断是否存在在判断语句前最好先⽤count(*)函数判断是否存在该条操作记录--判断是否存在,v_count是定义的数值变量select count(1)into v_countfrom A twhere t.A='aaa';if v_count =0thenelseend if;。
Oracle存储过程语法学习(Procedure+实例)
存储过程创建语法:(1)无参create or replace procedure 存储过程名as变量1 类型(值范围);变量2 类型(值范围);Begin........................Exception........................End;(2)带参create or replace procedure 存储过程名(param1 in type,param2 out type)as变量1 类型(值范围);变量2 类型(值范围);BeginSelect count(*) into 变量1 from 表A where列名=param1;If (判断条件) thenSelect 列名into 变量2 from 表A where列名=param1;Dbms_output.Put_line(‘打印信息’);Elseif (判断条件) thenDbms_output.Put_line(‘打印信息’);ElseRaise 异常名(NO_DATA_FOUND);End if;ExceptionWhen others thenRollback;End;注意事项:1,存储过程参数不带取值范围,in表示传入,out表示输出2,变量带取值范围,后面接分号3,在判断语句前最好先用count(*)函数判断是否存在该条操作记录4,用select 。
into。
给变量赋值5,在代码中抛异常用raise+异常名以命名的异常命名的系统异常产生原因ACCESS_INTO_NULL 未定义对象CASE_NOT_FOUND CASE 中若未包含相应的WHEN ,并且没有设置ELSE 时COLLECTION_IS_NULL 集合元素未初始化CURSER_ALREADY_OPEN 游标已经打开DUP_VAL_ON_INDEX 唯一索引对应的列上有重复的值INVALID_CURSOR 在不合法的游标上进行操作INVALID_NUMBER 内嵌的SQL 语句不能将字符转换为数字NO_DATA_FOUND 使用select into 未返回行,或应用索引表未初始化的TOO_MANY_ROWS 执行select into 时,结果集超过一行ZERO_DIVIDE 除数为0SUBSCRIPT_BEYOND_COUNT 元素下标超过嵌套表或VARRAY 的最大值SUBSCRIPT_OUTSIDE_LIMIT 使用嵌套表或VARRAY 时,将下标指定为负数VALUE_ERROR 赋值时,变量长度不足以容纳实际数据LOGIN_DENIED PL/SQL 应用程序连接到oracle 数据库时,提供了不正确的用户名或密码NOT_LOGGED_ON PL/SQL 应用程序在没有连接oralce 数据库的情况下访问数据PROGRAM_ERROR PL/SQL 内部问题,可能需要重装数据字典&pl./SQL 系统包ROWTYPE_MISMATCH 宿主游标变量与PL/SQL 游标变量的返回类型不兼容SELF_IS_NULL 使用对象类型时,在null 对象上调用对象方法STORAGE_ERROR 运行PL/SQL 时,超出内存空间SYS_INVALID_ID 无效的ROWID 字符串TIMEOUT_ON_RESOURCE Oracle 在等待资源时超时例子:1 create or replace procedure runbyparmeters (isal in emp.sal%type,sname out varchar,sjob in out varchar)2 as icount number;3 begin4 select count(*) into icount from emp where sal>isal and job=sjob;5 if icount=1 then6 ....9 else10 ....12 end if;13 exception14 when too_many_rows then15 DBMS_OUTPUT.PUT_LINE('返回值多于1行');16 when others then17 DBMS_OUTPUT.PUT_LINE('在RUNBYPARMETERS过程中出错!');18 end;过程调用方式一1 declare2 realsal emp.sal%type;3 realname varchar(40);4 realjob varchar(40);5 begin6 realsal:=1100;7 realname:='';8 realjob:='CLERK';9 runbyparmeters(realsal,realname,realjob); --必须按顺序10 DBMS_OUTPUT.PUT_LINE(REALNAME||' '||REALJOB);11 END;12方式二1 declare2 realsal emp.sal%type;3 realname varchar(40);4 realjob varchar(40);5 begin6 realsal:=1100;7 realname:='';8 realjob:='CLERK';9 runbyparmeters(sname=>realname,isal=>realsal,sjob=>realjob); --指定值对应变量顺序可变10 DBMS_OUTPUT.PUT_LINE(REALNAME||' '||REALJOB);11 END;说明:(1)使用%TYPE在许多情况下,PL/SQL变量可以用来存储在数据库表中的数据。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
Oracl e 存储过程学习目录Oracle 存储过程 (1)Oracle存储过程基础知识 (1)Oracle存储过程的基本语法 (2)关于Oracle存储过程的若干问题备忘 (4)1. 在Oracle中,数据表别名不能加as。
(4)2. 在存储过程中,select某一字段时,后面必须紧跟into,如果select整个记录,利用游标的话就另当别论了。
(5)3. 在利用select...into...语法时,必须先确保数据库中有该条记录,否则会报出"no datafound"异常。
(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)的区别。
function有返回值,并且可以直接在Query中引用function和或者使用function的返回值。
本质上没有区别,都是PL/SQL 程序,都可以有返回值。
最根本的区别是:存储过程是命令, 而函数是表达式的一部分。
比如:select max(NAME) FROM但是不能exec max(NAME) 如果此时max是函数。
PACKAGE是function,procedure,variables 和sql 语句的组合。
package允许多个procedure使用同一个变量和游标。
创建procedure的语法:可以使用create or replace procedure 语句,这个语句的用处在于,你之前赋予的excute 权限都将被保留。
IN, OUT, IN OUT用来修饰参数。
IN 表示这个变量必须被调用者赋值然后传入到PROCEDURE进行处理。
OUT 表示PRCEDURE 通过这个变量将值传回给调用者。
IN OUT 则是这两种的组合。
authid代表两种权限:定义者权限(difiner right 默认),执行者权限(invoker right)。
定义者权限说明这个procedure中涉及的表,视图等对象所需要的权限只要定义者拥有权限的话就可以访问。
执行者权限则需要调用这个procedure的用户拥有相关表和对象的权限。
Oracle存储过程的基本语法将select查询的结果存入到变量中,可以同时将多个列存储多个变量中,必须有一条记录,否则抛出异常(如果没有记录抛出NO_DATA_FOUND)7.带参数的cursor8.用pl/sql developer debug连接数据库后建立一个Test WINDOW在窗口输入调用SP的代码,F9开始debug,CTRL+N单步调试9.Pl/Sql中执行存储过程注:在EXECUTE IMMEDIATE STR语句是SQLPLUS中动态执行语句,它在执行中会自动提交,类似于DP中FORMS_DDL语句,在此语句中str是不能换行的,只能通过连接字符"||",或着在在换行时加上"-"连接字符。
关于Oracle存储过程的若干问题备忘1.在Oracl e中,数据表别名不能加as。
如:select a.appname from appinfo a;-- 正确select a.appname from appinfo as a;-- 错误也许,是怕和Oracle中的存储过程中的关键字as冲突的问题吧2.在存储过程中,select某一字段时,后面必须紧跟into,如果sel ect整个记录,利用游标的话就另当别论了。
select af.keynode into knfrom APPFOUNDATION afwhere af.appid=aid and af.foundationid=fid; -- 有into,正确编译select af.keynodefrom APPFOUNDATION afwhere af.appid=aid and af.foundationid=fid;-- 没有into,编译报错,提示:Compilation Error: PLS-00428: an INTO clause is expected in this SELECT statement3.在利用select...into...语法时,必须先确保数据库中有该条记录,否则会报出"no data found"异常。
可以在该语法之前,先利用select count(*) from 查看数据库中是否存在该记录,如果存在,再利用select...into...4.在存储过程中,别名不能和字段名称相同,否则虽然编译可以通过,但在运行阶段会报错select keynode into kn from APPFOUNDATION where appid=aid and foundationid=fid;-- 正确运行select af.keynode into kn from APPFOUNDATION af where af.appid=appid and af.foundationid =foundationid;-- 运行阶段报错,提示:ORA-01422:exact fetch returns more than requested number of rows5.在存储过程中,关于出现null的问题假设有一个表A,定义如下:create table A(id varchar2(50) primary key not null,vcount number(8) not null,bid varchar2(50) not null -- 外键);如果在存储过程中,使用如下语句:select sum(vcount) into fcount from A where bid='xxxxxx';如果A表中不存在bid="xxxxxx"的记录,则fcount=null(即使fcount定义时设置了默认值,如:fcount number(8):=0依然无效,fcount还是会变成null),这样以后使用fcount时就可能有问题,所以在这里最好先判断一下:if fcount is null thenfcount:=0;end if;这样就一切ok了。
6.Hibernate调用Oracle存储过程this.pnumberManager.getHibernateTemplate().execute(new HibernateCallback() ...{public Object doInHibernate(Session session)throws HibernateException, SQLException ...{ CallableStatement cs = session.connection().prepareCall("{callmodifyapppnumber_remain(?)}");cs.setString(1, foundationid);cs.execute();return null;}});用Java调用Oracl e存储过程总结一、无返回值的存储过程-- Create tablecreate table TESTTB(ID VARCHAR2(30),NAME VARCHAR2(30))tablespace BOMpctfree 10initrans 1maxtrans 255例: 存储过程为(当然了,这就先要求要建张表TESTTB,里面两个字段(I_ID,I_NAME)。
二、有返回值的存储过程(非列表)例:存储过程为:注意,这里的proc.getString(2)中的数值2并非任意的,而是和存储过程中的out列对应的,如果out是在第一个位置,那就是proc.getString(1),如果是第三个位置,就是proc.getString(3),当然也可以同时有多个返回值,那就是再多加几个out参数了。
三、返回列表由于Oracle存储过程没有返回值,它的所有返回值都是通过out参数来替代的,列表同样也不例外,但由于是集合,所以不能用一般的参数,必须要用pagkage了.所以要分两部分,1.建一个程序包。
如下:2.在Java里调用时就用下面的代码:在这里要注意,在执行前一定要先把Oracle的驱动包放到class路径里,否则会报错的。
在存储过程中做简单动态查询在存储过程中做简单动态查询代码 ,例如:一般的PL/SQL程序设计中,在DML和事务控制的语句中可以直接使用SQL,但是DDL 语句及系统控制语句却不能在PL/SQL中直接使用,要想实现在PL/SQL中使用DDL语句及系统控制语句,可以通过使用动态SQL来实现。
首先我们应该了解什么是动态SQL,在Oracle数据库开发PL/SQL块中我们使用的SQL 分为:静态SQL语句和动态SQL语句。
所谓静态SQL指在PL/SQL块中使用的SQL语句在编译时是明确的,执行的是确定对象。
而动态SQL是指在PL/SQL块编译时SQL语句是不确定的,如根据用户输入的参数的不同而执行不同的操作。