oracle
存储过程的基本语法
①基本结构
CREATE
OR
REPLACE
PROCEDURE
存储过程名字
(
参数1
IN
NUMBER,
NUMBER
)
IS
变量1
INTEGER
:=0;
DATE;
BEGIN
END
INTO
STATEMENT
将select查询的结果存入到变量中,可以同时将多个列存储多个变量中,必须有一条
记录,否则抛出异常(如果没有记录抛出NO_DATA_FOUND)
例子:
SELECT
into
FROM
typestruct
where
xxx;
EXCEPTION
WHEN
NO_DATA_FOUND
THEN
xxxx;
END;
...
判断
IF
V_TEST=1
do
something
IF;
循环
WHILE
LOOP
XXXX
LOOP;
V_TEST
:=
in
使用cursor
CURSOR
cur
*
FOR
cur_result
V_SUM
C_USER(C_ID
NUMBER)
NAME
USER
WHERE
TYPEID=C_ID;
OPEN
C_USER(变量值);
FETCH
C_USER
V_NAME;
EXIT
C_USER%NOTFOUND;
CLOSE
C_USER;
developer
debug
连接数据库后建立一个Test
WINDOW
一:存储过程
创建存储过程,需要有CREATE PROCEDURE或CREATE ANY PROCEDURE的系统权限? ?
删除存储过程,是过程的创建者或者拥有DROP ANY PROCEDURE系统权限?
修改存储过程,则只能是过程的创建者或者拥有ALTER ANY PROCEDURE系统权限的人
执行(或调用)存储过程,是过程的创建者或是拥有EXECUTE ANY PROCEDURE系统权限的人或是被拥有者授予EXECUTE权限的人
①.:语法
①.)创建
CREATE[ORREPLACE]PROCEDURE存储过程名[(参数[IN|OUT|INOUT] 数据类型...)]
{AS|IS}
[说明部分]
可执行部分
[EXCEPTION
错误处理部分]
END[过程名];
说明:
?OR REPLACE?表示如果存在就覆盖存储过程
?参数有三种形式:IN、OUT和IN OUT.则默认为IN.
关键字AS也可以写成IS,后跟过程的说明部分,可以在此定义过程的局部变量.
DROP PROCEDURE 存储过程名;
? ? ALTER PROCEDURE 存储过程名 COMPILE;?
? ?EXECUTE 模式名.存储过程名[(参数...)];?
? ?或
? ? ?BEGIN?
模式名.存储过程名[(参数...)];
另外:参数可以是变量、常量或表达式
要其它用户执行存储过程须要给其它用户授权
GRANT EXECUTE ON 存储过程名 TO 用户名
IN 定义一个输入参数变量,用于传递参数给存储过程
OUT 定义一个输出参数变量,用于从存储过程获取数据
IN OUT 定义一个输入、输出参数变量,兼有以上两者的功能
①.)参数名 IN 数据类型 DEFAULT 值;
? ? ? ?定义一个输入参数变量,用于传递参数给存储过程.
? ? ? ?可以是常量、有值变量或表达式
? ? ? ?DEFAULT 关键字为可选项,用来设定参数的默认值.如果在调用存储过程时不指明参数,则参数变量取默认值
? ? ? ?在存储过程中,输入变量接收主程序传递的值,但不能对其进行赋值.
? ? ? ?定义一个输出参数变量,用于从存储过程获取数据,即变量从存储过程中返回值给主程序.
? ? ? ? 在调用存储过程时,主程序的实际参数只能是一个变量,而不能是常量或表达式.
? ? ? ?在存储过程中,参数变量只能被赋值而不能将其用于赋值,而且必须给输出变量至少赋值一次.
? ? ? ?定义一个输入、输出参数变量,兼有以上两者的功能.
? ? ? ?在调用存储过程时,主程序的实际参数只能是一个变量,而不能是常量或表达式.
? ? ? ?DEFAULT 关键字为可选项,用来设定参数的默认值.
? ? ? ?在存储过程中,变量接收主程序传递的值,同时可以参加赋值运算,也可以对其进行赋值.在存储过程中必须给变量至少赋值一次.
补充:如果省略IN、OUT或IN OUT,则默认模式是IN.?
? ? ? ? 调用它时参数个数与位置可以不一致,用以下形式调用:
二:函数
创建函数,需要有CREATE PROCEDURE或CREATE ANY PROCEDURE的系统权限
删除函数,需要是函数的创建者或者是拥有DROP ANY PROCEDURE系统权限的人
修改函数,需要是函数的创建者或者拥有ALTER ANY PROCEDURE系统权限的人
执行函数,需要是函数的创建者或拥有EXECUTE ANY PROCEDURE系统权限的人
①.)创建:
CREATE[ORREPLACE]FUNCTION函数名[(参数[IN] 数据类型...)]
RETURN数据类型
RETURN(表达式)
? 错误处理部分]
END[函数名];
? ?参数是可选的,但只能是IN类型(IN关键字可以省略).
? ?在定义部分的RETURN 数据类型,用来表示函数的数据类型,也就是返回值的类型,不可省略.
? ?在可执行部分的RETURN(表达式),用来生成函数的返回值,其表达式的类型应该和定义部分说明的函数返回值的数据类型一致.在函数的执行部分可以有多个RETURN语句,但只有一个RETURN语句会被执行,一旦执行了RETURN语句,则函数结束并返回调用环境.?
? ?DROP FUNCTION 函数名;
? ?ALTER PROCEDURE 函数名 COMPILE;
? ?变量名:=函数名(...)?
三:对存储过程 和 函数的查看(可以通过对数据字典【USER_SOURCE】的访问来查询存储过程或函数的有关信息)
①.:查询某个存储过程序内容
select TEXT from user_source WHERE NAME='存储过程名';
DESCRIBE USER_SOURCE ; //命令行中
DESCRIBE say_hello; //后面是过程名
SHOW ERRORS ;
SELECT STATUS FROM USER_OBJECTS WHERE OBJECT_NAME='过程名';//注意大小写
VALID表示该存储过程有效(即通过编译),INVALID表示存储过程无效或需要重新编译.它的状态会改变,这与它依赖外部表(表删除修改等操作)有关系
SELECT REFERENCED_NAME,REFERENCED_TYPE FROM USER_DEPENDENCIES WHERE NAME='SAY_HELLO';
说明
NAME为实体名,TYPE为实体类型,REFERENCED_OWNER为涉及到的实体拥有者账户,REFERENCED_NAME为涉及到的实体名,REFERENCED_TYPE 为涉及到的实体类型.
问题:
如果一个用户A被授予执行属于用户B的一个存储过程的权限,在用户B的存储过程中,访问到用户C的表,用户B被授予访问用户C的表的权限,但用户A没有被授予访问用户C表的权限,那么用户A调用用户B的存储过程是失败的还是成功的呢?答案是成功的.
Oracle存储过程基本语法:
CREATE?OR?REPLACE?PROCEDURE?存储过程名?
IS?
BEGIN?
NULL;?
解释:
行1:?
CREATE OR REPLACE PROCEDURE 是一个SQL语句通知Oracle数据库去创建一个叫做skeleton存储过程, 如果存在就覆盖它;?
IS关键词表明后面将跟随一个PL/SQL体.?
BEGIN关键词表明PL/SQL体的开始.?
NULL PL/SQL语句表明什么事都不做,这句不能删去,因为PL/SQL体中至少需要有一句;?
END关键词表明PL/SQL体的结束.
你首先要了解存储过程包括哪些模块,哪些是必备的,哪些是可选的.\x0d\x0a另外呢,如果有条件的话,最好能找一些模板看看别人是怎么写的,再结合你们公司的实际情况,做一些适当的调整.\x0d\x0a例如create or replace procedure +过程名字(变量名 in,数据类型,变量名 out 数据类型)等\x0d\x0adeclare\x0d\x0a变量 类型\x0d\x0abegin\x0d\x0a过程体\x0d\x0aexception\x0d\x0aend\x0d\x0a等\x0d\x0a最好有些实例,可以先模仿着写一写\x0d\x0a等熟练之后呢,再自己按照自己的思路去写