----------------------------建立存储过程:
CREATE OR REPLACE PROCEDURE P_name--存储过程名字
(
i_var in int, --输入参数1
o_var OUT varchar2 --输出参数1
)
IS
v_STR VARCHAR2(200)--定义存储过程内部的局部变量
BEGIN
--下面是存储过程的主体实现部分
v_STR := i_var
dbms_output.put_line(v_STR)
o_var := v_STR
exception--错误异常处理部分
when others then
dbms_output.put_line(sqlerrm)--打印错误信息
END P_name
-----------------------------------调用存储过程示例:
declare
v_in int
v_out varchar2(50)
begin
v_in :=100
P_name (v_in,v_out)--调用存储过程P_name
dbms_output.put_line('存储过程输入结果为:'||v_out)
exception--错误异常处理部分
when others then
dbms_output.put_line(sqlerrm)--打印错误信息
end
基本结构
CREATE OR REPLACE PROCEDURE 存储过程名字
(
参数 IN NUMBER
参数 IN NUMBER
) IS
变量 INTEGER :=
变量 DATE
BEGIN
END 存储过程名字
SELECT INTO STATEMENT
将select查询的结果存入到变量中 可以同时将多个列存储多个变量中 必须有一条
记录 否则抛出异常(如果没有记录抛出NO_DATA_FOUND)
例子
BEGIN
SELECT col col into 变量 变量 FROM typestruct where xxx
EXCEPTION
WHEN NO_DATA_FOUND THEN
xxxx
END
IF 判断
IF V_TEST= THEN
BEGIN
do something
END
END IF
while 循环
WHILE V_TEST= LOOP
BEGIN
XXXX
END
END LOOP
变量赋值
V_TEST :=
用for in 使用cursor
IS
CURSOR cur IS SELECT * FROM xxx
BEGIN
FOR cur_result in cur LOOP
BEGIN
V_SUM :=cur_result 列名 +cur_result 列名
END
END LOOP
END
带参数的cursor
CURSOR C_USER(C_ID NUMBER) IS SELECT NAME FROM USER WHERE TYPEID=C_ID
OPEN C_USER(变量值)
LOOP
FETCH C_USER INTO V_NAME
EXIT FETCH C_USER%NOTFOUND
do something
END LOOP
CLOSE C_USER
用pl/sql developer debug
连接数据库后建立一个Test WINDOW
在窗口输入调用SP的代码 F 开始debug CTRL+N单步调试
关于oracle存储过程的若干问题备忘
在oracle中 数据表别名不能加as 如
select a appname from appinfo a正确
select a appname from appinfo as a错误
也许 是怕和oracle中的存储过程中的关键字as冲突的问题吧
在存储过程中 select某一字段时 后面必须紧跟into 如果select整个记录 利用游标的话就另当别论了
select af keynode into kn from APPFOUNDATION af where af appid=aid and af foundationid=fid有into 正确编译
select af keynode from APPFOUNDATION af where af appid=aid and af foundationid=fid没有into 编译报错 提示 Compilation
Error: PLS : an INTO clause is expected in this SELECT statement
在利用select into 语法时 必须先确保数据库中有该条记录 否则会报出 no data found 异常
可以在该语法之前 先利用select count(*) from 查看数据库中是否存在该记录 如果存在 再利用select into
在存储过程中 别名不能和字段名称相同 否则虽然编译可以通过 但在运行阶段会报错
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 :exact fetch returns more than requested number of rows
在存储过程中 关于出现null的问题
假设有一个表A 定义如下
create table A(
id varchar ( ) primary key not null
vcount number( ) not null
bid varchar ( ) not null 外键
)
如果在存储过程中 使用如下语句
select sum(vcount) into fcount from A where bid= xxxxxx
如果A表中不存在bid= xxxxxx 的记录 则fcount=null(即使fcount定义时设置了默认值 如 fcount number( ):= 依然无效 fcount还是会变成null) 这样以后使用fcount时就可能有问题 所以在这里最好先判断一下
if fcount is null then
fcount:=
end if
这样就一切ok了
Hibernate调用oracle存储过程
this pnumberManager getHibernateTemplate() execute(
new HibernateCallback() {
public Object doInHibernate(Session session)
throws HibernateException SQLException {
CallableStatement cs = session
nnection()
prepareCall( {call modifyapppnumber_remain(?)} )
cs setString( foundationid)
cs execute()
return null
}
lishixinzhi/Article/program/Oracle/201311/16725create
or
replace
procedure
testproc
<--如果这个要导入参数,就在testproc后面加上如下格式:(P1
number
default
0,
p2
date
default
sysdate,
p3
varchar2
default
null)
<-括号结尾无须分号
is
<---这里是is
<---
is
和begin中间可以定义些变量比如:
v_variable
varchar2(100)
default
null
<--定义例子
begin
select
*
from
studet
<--如果是定义个空的procedure,这一行
你可以用
null代替
end
testproc
<--
结尾方式。
--------------------
另外,又登录以后看到楼下的发言。其实是不对的。
Oracle
里当然可以用select
*.这里的存储过程并没有做什么事情而已,仅仅是一个select
*.
你用into是将内容存放到变量中,其实没有什么不同。
应为select的部分是在Oracle中执行,你无论怎么用也是要先select
并且你select
column
into
变量
还需要知道这个column在表中的字段(当然,你如果用rowtype或者其他的array形式那另当别论)
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)