Oracle中的子程序之一存储过程

子程序就是能够接受参数并被其他程序所调用的命名PL/SQL块。PL/SQL子程序有两种类型,过程和函 数。通俗地讲,过程用于执行一个操作,而函数用于返回一个结果值。同匿名PL/SQL块类似,子程序也 有声明部分,执行部分和一个可选的异常处理部分,声明部分包含类型、游标、常量、变量、异常和嵌 套子程序的声明。这些内容都针对当前的子程序有效,也就是说在子程序退出时声明的这些内容会自动 失效。执行部分包含赋值语句、流程控制语句和Oracle的数据操作语句。异常处理部分包含异常处理程 序。

一、过程 (存储过程)

过程是一个能执行某个特定操作的子程序。使用CREATE OR REPLACE创建或者替换保存在数据库中的一个子程序。

示例1:声明存储过程,该过程返回dept表 行数

DECLARE
PROCEDURE getDeptCount
AS
deptCount INT;
BEGIN
SELECT COUNT(*) INTO deptCount FROM DEPT;
DBMS_OUTPUT.PUT_LINE('DEPT 表的共有记录数:'||deptCount);
END getDeptCount;
BEGIN
getDeptCount [()];
END;

注意:此存储过程getDeptCount只在块运行时有效。

示例2:创 建不带参数的存储过程,该过程返回dept表行数

CREATE OR REPLACE PROCEDURE getDeptCount
AS | IS
deptCount int;
BEGIN
SELECT COUNT(*) INTO deptCount FROM dept;
DBMS_OUTPUT.PUT_LINE('dept表共有'||deptCount||'行记录 ');
END [getDeptCount];

当我们创建的存储过程没有参数时,在存储过程名 字后面不能有括号。在AS或者IS后至BEGIN之前是声明部分,存储过程中的声明不使用DECLARE关键字。 同匿名PL/SQL块一样,EXCEPTION和声明部分都是可选的。

当我们创建的过程带有错误时,我们 可以通过SELECT * FROM USER_ERRORS查看,或者使用SHOW ERRORS [ PROCEDURE Proc_Name]查看。

使用以下代码可以执行存储过程:

BEGIN
getDeptCount;
END;

以上存储过程还可以通过以下代码来简化调用:

EXEC getDeptCount[;]   
CALL  getDeptCount();

注意:

并不是所有的存 储过程都可以用这种方式来调用

定义无参存储过程时,存储过程名后不能加()

在块中或 是通过EXEC调用存储过程时可以省略()

通过CALL调用无参存储过程必须加上()

示例3:创 建带有输入参数的存储过程,该过程通过员工编号打印工资额

CREATE OR REPLACE PROCEDURE getSalaryByEmpNo(eNo NUMBER)  --参数的数据类型不能指定长度
AS
salary emp.sal%TYPE;
BEGIN
SELECT SAL INTO salary  FROM EMP WHERE EMPNO=eNo;
DBMS_OUTPUT.PUT_LINE(eNo||'号员工的工资为'||salary);
EXCEPTION
WHEN NO_DATA_FOUND THEN
DBMS_OUTPUT.PUT_LINE('没有找到该编号的员工');
END;

时间: 2024-10-27 12:16:00

Oracle中的子程序之一存储过程的相关文章

Oracle中的子程序之二函数

函数是一个能够计算结果值的子程序,函数除了有一个RETURN子句之外,其它结构跟过程类似.值得 注意的是,Oracle中的函数必须提供返回值,如果你定义的子程序没有返回值,那么你不应该把它定义 成函数,而应该定义成过程. 一.函数 示例1:创建不带参数的函数 CREATE OR REPLACE FUNCTION currentTime --没有参数,不能加括号 RETURN VARCHAR2 AS BEGIN RETURN TO_CHAR(SYSDATE,'YYYY"年"MM"

oracle中一些sql以及存储过程小积累(转)

将当前日期转换为上一个月   SELECT TO_CHAR(ADD_MONTHS(SYSDATE, -1), 'yyyymm') --获取当前时间的前一个月             FROM DUAL; select sysdate from dual; /**获取当前时间到秒**/ select  sysdate-3 from dual;/**获取当前2天**/ select round(sysdate)  as 格式成日期 from dual; select to_date('2008-9-

教你在Oracle中启动脚本跟踪存储过程

一.用脚本启动并设置跟踪的示例 我们可以用脚本进行跟踪存储过程,当然要了解这些存储过程的具体语法和参数的含义,至于这些语法和参数含义请查询联机帮助.下面请看一实例: /*******************************************/ /* Created by: SQL Profiler */ /* Date: 2004/06/19 16:50:05 */ /*******************************************/ -- Create a

Oracle中 关于数据库存储过程和存储函数的使用_oracle

存储过程和存储函数指存储在数据库中供所有用户程序调用的子程序叫存储过程.存储函数.存储过程没有返回值.存储函数有返回值   创建存储过程      用CREATE PROCEDURE命令建立存储过程和存储函数.       语法:create [or replace] PROCEDURE过程名(参数列表) AS         PLSQL子程序体:   存储过程示例:为指定的职工在原工资的基础上长10%的工资 /*为指定的职工在原工资的基础上长10%的工资,并打印工资前和工资后的工资*/SQL>

Oracle中存储过程执行大的Sql语句时如何查看sql是否正确

  在Oracle中编写一个存储过程中,有时会用到较大的sql语句,但是通过PL/sql工具Test查看时又不能看到sql的样子,通过查看发现可以通过Oracle的物理临时表来处理, 在存储过程中添加DBMS_OUTPUT.put_line('要输出的Sql语句'); 然后在PL/sql工具中选中存储过程,右键选择Test执行,执行完成后可以通过DBMS_OUTPUT窗口查看sql结果了,很实用的

oracle中函数和存储过程简单示例-动态sql

oracle中函数和存储过程 1. 函数 create or replace function getArtCount(keyword in varchar2) return number as   Result number;    Sqlt varchar2(4000); begin    -- select t.sys_documentid into Result from dom_2_doclib t where t.sys_topic like '%key%';        -- s

oracel-如何把下面的oracle中的存储过程转换成sql的?

问题描述 如何把下面的oracle中的存储过程转换成sql的? create or replace procedure BJ_MAXCASENO_Get(InCount in number, OutMaxCaseNO out number) as tem number; begin select max(caseno) into tem from BJ_MAXCASENO; if tem is null then tem := 0; -- 没有数据时新增0进入 insert into BJ_MA

Mybatis调用Oracle中的存储过程和function

一.Mybatis调用存储过程 1 在数据库中创建以下的存储过程 create or replace procedure pro_hello(p_user_name in varchar2,p_result out varchar2) is begin   p_result := 'hello,' || p_user_name; end; 2 编写SQL映射文件mapper.xml statementType里的CALLABLE是标注此sql为存储过程. parameterType是标注要传的参

oracle-求助诸君:EF调用Oracle包中带游标的存储过程

问题描述 求助诸君:EF调用Oracle包中带游标的存储过程 大家好,项目开发时遇到了瓶颈,是关于EF6调用Oracle包中带游标的存储过程,小弟尝试了N遍后,还是百试不得其解,望诸君助小弟一臂之力. Oracle packages如下:--------------分割线-----------------------------Oracle package bodies如下: ----------------------分割线----------------------------- 这是ADO