你必须了解的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 [ schema.]procedure

[(argument [IN | OUT | IN OUT ] [NO COPY] datatype

[, argument [IN | OUT | IN OUT ] [NO COPY] datatype]…

)]

[ authid { current_user | definer }]

{ is | as } { pl/sql_subprogram_body |

language { java name 'String' | c [ name, name] library lib_name

}]

Sql 代码:

CREATE PROCEDURE sam.credit (acc_no IN NUMBER, amount IN NUMBER) AS

BEGIN

UPDATE accounts

SET balance = balance + amount

WHERE account_id = acc_no;

END;

可以使用 create or replace procedure 语句, 这个语句的用处在于,你之前赋予的excute权限都将被保留。

IN, OUT, IN OUT用来修饰参数。

IN 表示这个变量必须被调用者赋值然后传入到PROCEDURE进行处理。

OUT 表示PRCEDURE 通过这个变量将值传回给调用者。

IN OUT 则是这两种的组合。

authid代表两种权限:

定义者权限(difiner right 默认),执行者权限(invoker right)。

定义者权限说明这个procedure中涉及的表,视图等对象所需要的权限只要定义者拥有权限的话就可以访问。

执行者权限则需要调用这个 procedure的用户拥有相关表和对象的权限。

查看本栏目更多精彩内容:http://www.bianceng.cnhttp://www.bianceng.cn/database/Oracle/

时间: 2024-12-02 05:49:28

你必须了解的Oracle存储过程基础知识的相关文章

ORACLE字符集基础知识

概念描叙 ORACLE数据库有国家字符集(national character set)与数据库字符集(database character set)之分.两者都是在创建数据库时需要设置的.国家字符集主要是用于NCHAR.NVARCHAR.NCLOB类型的字段数据,而数据库字符集使用很广泛,它用于:CHAR.VARCHAR.CLOB.LONG类型的字段数据: ORACLE的字符集名字一般由以下部分组成:语言或区域.表示一个字符的比特位数.标准字符集名称(可选项,S或C,表示服务器或客户端).OR

Oracle锁基础知识

001 引言     在任何多用户数据库应用程序中,最终免不了会出现两个用户希望同时使用同一行的情况.数据库必须确保这在物理上不可能实现.事务的隔离性原则要求数据库确保:在一个会话的事务完成之前,另一个会话的事务不能影响此会话.为此,数据库必须对数据的并发访问进行串行化,必须确保即使多个会话请求同一行,它们实际上要按顺序排队.     借助于记录和表锁定机制,我们可以实现并发访问的串行化.Oracle数据库中的锁定是完全自动的.一般而言,只有在软件用质量较差的代码干扰自动锁定机制时,或业务分析出

sql注入之必备的基础知识_数据库其它

什么是SQL注入(SQL Injection) 所谓SQL注入式攻击,就是攻击者把SQL命令插入到Web表单的输入域或页面请求的查询字符串,欺骗服务器执行恶意的SQL命令.在某些表单中,用户输入的内容直接用来构造(或者影响)动态SQL命令,或作为存储过程的输入参数,这类表单特别容易受到SQL注入式攻击. mysql常用注释     #     --[空格]或者是--+     /*-*/ 在注意过程中,这些注释可能都需要进行urlencode. mysql认证绕过       ;%00     

SQL点滴17—使用数据库引擎存储过程,系统视图查询,DBA,BI开发人员必备基础知识

原文:SQL点滴17-使用数据库引擎存储过程,系统视图查询,DBA,BI开发人员必备基础知识 在开发过程中会遇到需要弄清楚这个数据库什么时候建的,这个数据库中有多少表,这个存储过程长的什么样子等等信息,今天把自己工作过程中经常用到的一些数据库引擎存储过程,系统视图等等总结一下以备不时之用.下面的知识多是自己总结,有一些参考了MSDN. sp_help 有时候想尽快查出数据库对象的相关信息,这个存储过程就很有用了.使用它可以查询出整个数据库中所有对象的相关信息.直接运行sp_help结果如下图1,

Oracle基础知识-数据迁移

我们常需要对Oracle数据库进行迁移,迁移到更加高级的主机上.迁移到远程的机房上.迁移到不同的平台下 一.exp/imp: 这也算是最常用最简单的方法了,一般是基于应用的owner级做导出导入. 操作方法为:在新库建立好owner和表空间,停老库的应用,在老库做 [sql] view plaincopyprint? exp user/pwd owner=XXX file=exp_xxx.dmp log=exp_xxx.log buffer=6000000 传dmp文件到新库,在新库做 [sql

Oracle基础知识-启动Oracle常见疑难问题分析

实例和数据库的启动与关闭是DBA的重要职责之一.只有打开数据库,其他用户才能对数据库中的数据进行操作.一旦数据库关闭,便不能对其操作.对于DBA们来说,关闭和重新启动数据库以便优化.调整应用程序的运行是经常碰到的事情.如果用户已经进入了数据库,使用SHUTDOWN IMMEDIATE 或SHUTDOWN ABORT命令来执行关闭数据库,则用户将失去连接,直到数据库重新启动.经常关闭和启动会对数据库性能造成一定的影响,当然也会影响到用户对数据库的使用.本文从管理数据库的角度来分析在Oracle启动

Oracle基础知识-Oracle不同的启动关闭方式

Oracle中不同启动和关闭方式的区别 Oracle数据库提供了几种不同的数据库启动和关闭方式,本文将周详介绍这些启动和关闭方式之间的区别连同他们各自不同的功能.一.启动和关闭Oracle数据库 对于大多数Oracle DBA来说,启动和关闭Oracle数据库最常用的方式就是在命令行方式下的Server Manager.从Oracle 8i以后,系统将Server Manager的任何功能都集中到了SQL*Plus中,也就是说从8i以后对于数据库的启动和关闭能够直接通过SQL*Plus来完成,而

Oracle基础知识-oracle常用命令

日志管理 1.forcing log switches [sql] view plaincopyprint? sql> alter system switch logfile; 2.forcing checkpoints [sql] view plaincopyprint? sql> alter system checkpoint; 3.adding online redo log groups [sql] view plaincopyprint? sql> alter database

Oracle基础知识-SQL简单命令

SQL语句包括两个部分:1 DDL 数据定义语言 2 DML 数据控制语言 DDL: create:创建一个表 [html] view plaincopyprint? create table b( clob char(1) ); alter:增加已经定义的表列的分配 drop:删除一个表 desc:查看一个表的定义 DML: selelct: [html] view plaincopyprint? select * from b; insert: [html] view plaincopypr