存储过程创建语法:
create or replace procedure 存储过程名(param1 in type,param2 out type)
as
变量1 类型(值范围);
变量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表示输出
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 除数为 0
SUBSCRIPT_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 在等待资源时超时
参数变量的设置
declare bb int ;
var_sta varchar(2);
begin
loop
select c_org into var_sta from res_driver group by c_org;
dbms_output.put_line(var_sta);
end loop;
/-- EXCEPTION
/-- WHEN OTHERS THEN
/-- dbms_output.put_line('执行出错了,老板!');
end;
案例
create or replace procedure sp_java_staffarrangedata(arrangedate in varchar2,
mycursor out sys_refcursor,mycursor2 out sys_refcursor,mycursor3 out sys_refcursor,
monthStr out varchar2)
authid current_user
as
v_sql varchar2(200);
v_sql1 varchar2(200);
v_sql2 varchar2(200);
v_sql3 varchar2(300);
v_sql4 varchar2(300);
lastMonth varchar2(10);
arrDate date;
begin
select to_char(add_months(to_date(arrangedate,'yyyy-mm'),-1),'yyyy-mm') res into lastMonth from dual;
select to_date(arrangedate,'yyyy-mm') retval into arrDate from dual;
--1自动排班的时候,根据当前排班的月份,删除当前月份的上一次的排班数据
v_sql:='delete from tml_admin_arrange_month_gather t where ';
v_sql:= v_sql||' t.c_month='''||arrangedate||'''';
execute immediate v_sql;
commit;
--2自动排班的时候,根据当前排班的月份,删除当前月份排班详情的所有数据
v_sql:='delete from tml_admin_arrange_detail t where ';
v_sql:= v_sql||' t.c_month='''||arrangedate||'''';
execute immediate v_sql;
commit;
--3获取没有离职的清机员数据
v_sql1:='select * from tml_admin t where t.c_status!=''3'' order by d_date desc ';
open mycursor for(v_sql1);
---4获取老员工和新员工的搭档数据
v_sql2:='select * from task_staff_partner_choose ';
open mycursor2 for(v_sql2);
--5获取上一个月的加班数据
v_sql3:='select * from tml_admin_arrange_month_gather t ';
v_sql3:= v_sql3||' where t.c_month='''||lastMonth||'''';
-- dbms_output.put_line('v_sql4:'||v_sql4);
open mycursor3 for(v_sql3);
--6获取排班月份的天数组合
v_sql4:='select wm_concat(lpad(rownum,2,''0'')) day from dual ';
v_sql4:= v_sql4||' connect by rownum<=to_char(last_day('''||arrDate||'''';
v_sql4:= v_sql4||' ),''DD'') ';
-- dbms_output.put_line('v_sql4:'||v_sql4);
execute immediate v_sql4 into monthStr;
end sp_java_staffarrangedata;
------------范例
CREATE OR REPLACE PROCEDURE fims.UP_BALANCE_TOTAL_COUNTRY
--///*利用外资分国别表平衡检查*/
( V_USER_DEPT_CODE IN VARCHAR2,
V_REPORT_PERIOD IN VARCHAR2, --//要求格式YYYYMM
V_DATA_TYPE IN VARCHAR2, --//数据类型:置为’2’,外商直接投资
V_RetResult OUT VARCHAR2, --结果:’0’:失败,’1’:成功。
V_RetMsg OUT VARCHAR2,
RetCur OUT SYS_REFCURSOR
)
AS
V_DEPT_QUERY_CODE VARCHAR2(10);
BEGIN
V_RetResult := '1';
V_RetMsg := '成功';
V_DEPT_QUERY_CODE := UF_GET_QUERY_CODE(V_USER_DEPT_CODE);
INSERT INTO GTMP_QUERY_SIC_BALANCE
( REPORT_PERIOD,DEPT_CODE,STAT_DEPT_CODE,ENTP_TYPE_CODE,
ENTP_NUMBER,CONTRACT_INVESTMENT,ACTUAL_INVESTMENT )
SELECT A.REPORT_PERIOD,A.DEPT_CODE,A.STAT_DEPT_CODE,A.ENTP_TYPE_CODE,
NVL(SUM(A.ENTP_NUMBER),0),
NVL(SUM(A.CONTRACT_INVESTMENT),0),
NVL(SUM(A.ACTUAL_INVESTMENT),0)
FROM T_FI_TOTAL_SUM A
WHERE A.DEPT_CODE = V_USER_DEPT_CODE
AND A.REPORT_PERIOD = V_REPORT_PERIOD
AND SUBSTR(A.ENTP_TYPE_CODE,1,1) = V_DATA_TYPE
GROUP BY A.REPORT_PERIOD,A.DEPT_CODE,A.STAT_DEPT_CODE,A.ENTP_TYPE_CODE;
INSERT INTO GTMP_QUERY_SIC_BALANCE
( REPORT_PERIOD,DEPT_CODE,STAT_DEPT_CODE,ENTP_TYPE_CODE,
ENTP_NUMBER_1,CONTRACT_INVESTMENT_1,ACTUAL_INVESTMENT_1 )
SELECT A.REPORT_PERIOD,A.DEPT_CODE,A.STAT_DEPT_CODE,A.ENTP_TYPE_CODE,
NVL(SUM(A.ENTP_NUMBER),0),
NVL(SUM(A.CONTRACT_INVESTMENT),0),
NVL(SUM(A.ACTUAL_INVESTMENT),0)
FROM T_FI_TOTAL_COUNTRY A
WHERE A.DEPT_CODE = V_USER_DEPT_CODE
AND A.REPORT_PERIOD = V_REPORT_PERIOD
AND SUBSTR(A.ENTP_TYPE_CODE,1,1) = V_DATA_TYPE
GROUP BY A.REPORT_PERIOD,A.DEPT_CODE,A.STAT_DEPT_CODE,A.ENTP_TYPE_CODE;
--//置各下级单位名称,合计行名称用“合计”
UPDATE GTMP_QUERY_SIC_BALANCE A
SET STAT_DEPT_NAME=(SELECT B.DEPT_NAME
FROM T_CODE_DEPT B
WHERE A.STAT_DEPT_CODE = B.DEPT_CODE);
UPDATE GTMP_QUERY_SIC_BALANCE A
SET ENTP_TYPE_NAME=(SELECT B.ENTP_TYPE_SHORT_NAME
FROM T_CODE_ENTP_TYPE B
WHERE A.ENTP_TYPE_CODE = B.ENTP_TYPE_CODE);
OPEN RetCur FOR
SELECT A.STAT_DEPT_NAME,A.ENTP_TYPE_NAME,
NVL(SUM(A.ENTP_NUMBER),0),
NVL(SUM(A.CONTRACT_INVESTMENT),0),
NVL(SUM(A.ACTUAL_INVESTMENT),0),
NVL(SUM(A.ENTP_NUMBER_1),0),
NVL(SUM(A.CONTRACT_INVESTMENT_1),0),
NVL(SUM(A.ACTUAL_INVESTMENT_1),0)
FROM GTMP_QUERY_SIC_BALANCE A
GROUP BY A.STAT_DEPT_NAME,A.ENTP_TYPE_NAME
HAVING NVL(SUM(A.CONTRACT_INVESTMENT),0) <> NVL(SUM(A.CONTRACT_INVESTMENT_1),0)
OR NVL(SUM(A.ACTUAL_INVESTMENT),0) <> NVL(SUM(A.ACTUAL_INVESTMENT_1),0);
END UP_BALANCE_TOTAL_COUNTRY;
---------------------------
CREATE OR REPLACE Procedure fims.UP_GET_TABLE_COL_STR_XH
(V_TableName in varchar2,
V_ContainKey in varchar2,
V_column_id in integer,
V_Ret out varchar2)
as
V_columnName varchar2(30);
V_columnList sys_refcursor;
V_count integer;
Begin
V_count := 0;
open V_columnList for
select column_name from user_tab_columns where table_name= V_TableName and column_id >= v_column_id order by column_id;
Loop
fetch V_columnList into V_columnName;
exit when V_columnList%Notfound;
V_count := V_count + 1;
if (V_ContainKey = '0' and (V_count = 1 or V_Count = 2)) then
V_count := v_count;
else
V_Ret := V_Ret || V_columnName || ',';
end if;
end loop;
close V_columnList;
v_ret := substr(v_ret,1,length(v_ret)-1);
End UP_GET_TABLE_COL_STR_XH;
相关推荐
Oracle 存储过程学习目录是 Oracle 存储过程学习的基础知识,了解 Oracle 存储过程的基本语法、基础知识和一些常见问题的解决方法是非常重要的。本文将从 Oracle 存储过程的基础知识开始,逐步深入到 Oracle 存储...
这个"ORACLE存储过程学习源码"集合包含了从基础到高级的30个示例,是学习和掌握Oracle存储过程的理想资源。下面,我们将深入探讨存储过程的基本概念、结构、类型,以及如何通过这些源码进行学习。 1. **存储过程的...
### Oracle存储过程学习经典 #### Oracle存储过程基础知识与实践 Oracle存储过程是SQL与PL/SQL结合的强大功能,用于封装复杂的数据操作逻辑于数据库内部,从而实现高效的事务处理和数据管理。以下是对Oracle存储...
### ORACLE存储过程学习知识点详解 #### 一、存储过程概述 存储过程是数据库中预编译好的一组SQL语句,它可以实现复杂的数据处理逻辑,提高应用开发效率,并且能够增强应用程序的安全性。Oracle存储过程使用PL/SQL...
通过这份"Oracle的存储过程学习资料",你可以系统地学习和掌握存储过程的各个方面,从而提升你在Oracle数据库管理和开发中的技能。无论是初学者还是经验丰富的DBA,这些资源都将为你的知识库增添宝贵的一笔。
### 存储过程学习1:Oracle中的存储过程基础与示例 #### 一、存储过程简介 存储过程是在数据库中预编译好的SQL语句集合,它可以接受输入参数并返回输出值。存储过程的主要优点包括提高性能(通过预编译减少网络...
### Oracle存储过程学习经典知识点详解 #### 一、Oracle存储过程概述 - **定义**: 存储过程是在数据库中预编译并存储的一段SQL或PL/SQL代码块,它可以包含复杂的逻辑处理,用于实现特定的功能。存储过程提高了代码...
DB2存储过程基础培训
DB2 SQL存储过程基础 DB2 存储过程是指在 DB2 服务器端编写、执行的程序单元,可以实现业务逻辑、数据处理和事务控制等功能。存储过程是一种特殊的数据库对象,能够接受输入参数、执行复杂的业务逻辑、返回结果集等...
本资源“Oracle学习开发常用的SQL和存储过程学习(内含SQL面试题目和存储过程,函数面试题目).zip”提供了全面的学习材料,旨在帮助初学者和求职者提升在Oracle数据库中的SQL查询和存储过程编写技能。 SQL...
### Oracle存储过程学习经典知识点详解 #### Oracle存储过程概述与基础知识 存储过程是数据库中预编译的一系列SQL和PL/SQL语句的集合,它提供了执行复杂操作的能力,如事务处理、数据处理和错误处理。Oracle存储...
### Oracle存储过程学习经典知识点详解 #### 一、Oracle存储过程概述 **Oracle存储过程**是一种可以在Oracle数据库中存储并可被多次调用的程序单元。它可以包含一系列SQL语句和控制流语句,用于执行复杂的操作。...
**存储过程基础教程(MSSQL)** 存储过程是数据库管理系统中的一个重要概念,尤其是在Microsoft SQL Server(MSSQL)中,它们是预编译的SQL语句集合,用于执行特定任务或实现特定业务逻辑。存储过程可以理解为...
存储过程是数据库管理系统中预编译的SQL语句集合,它封装了特定的数据库操作,可以理解为数据库中的可执行程序。在SQL中,存储过程是数据库...通过深入学习和实践,我们可以更好地利用存储过程来解决实际的数据库问题。
开发者可以针对存储过程提出新的特性请求,同时也有许多资源可以用来学习和参考,包括官方文档、开发者社区等。 #### 18. 安装配置MySQL 5.0 文档提供了关于如何在不同操作系统上安装MySQL 5.0的信息,并包括了相关...
通过本文的学习,我们了解了MySQL存储过程的基础概念、创建方法、调用方式以及如何使用参数来增强其灵活性和功能性。存储过程不仅可以帮助开发者简化复杂操作,还能提高应用程序的性能和安全性。随着进一步的学习和...
Oracle存储过程学习总结涵盖了Oracle中存储过程的编写与应用,涉及到字符串处理、游标使用、PL/SQL编程等方面的知识点。 首先,字符串处理是存储过程中常见的操作。文章中提到了多个内置函数,如CONCAT用于连接字符...
SQL存储过程是数据库管理系统中一组为了完成特定功能的SQL语句集合,它是预...这份“存储过程学习资料--总结的很全的”压缩包,无疑是深入学习存储过程的好助手,无论你是初学者还是经验丰富的开发者,都能从中受益。
通过“Oracle存储过程学习经典[语法+实例+调用].doc”和“oracle存储过程超详细使用手册.pdf”这两个文档,你可以找到更多实际操作示例和详细的解释,进一步提升你的Oracle存储过程技能。记得理论结合实践,多编写和...
在学习Oracle存储过程时,结合详细的文档如《oracle存储过程超详细使用手册.doc》和实例资料《oracle存储过程学习经典[语法+实例+调用].doc》会非常有帮助。这些文档通常会涵盖基础语法、实例解析、调用方法、异常...