存储过程语法?1、 创建语法 create proc | procedure pro_name [{@参数数据类型} [=默认值] [output],{@参数数据类型} [=默认值] [output],.]as SQL_statements 2、那么,存储过程语法?一起来了解一下吧。
Navicat执行存储过程和函数的详细方法
在Navicat中执行存储过程和函数是数据库开发中的常见操作,掌握这些方法可以提高开发效率。以下是详细的执行步骤和实用技巧。
一、执行存储过程的方法
存储过程是预编译的SQL语句集合,适合处理复杂业务逻辑。在Navicat中执行存储过程需要使用CALL语句。
基本语法:
CALL 存储过程名称(参数1, 参数2, ...);执行步骤:
在Navicat中连接到目标数据库
打开查询窗口(Query)或命令行界面
输入CALL语句并执行
示例:假设有一个计算总价的存储过程calculate_total_price,接受数量和单价两个参数:
CALL calculate_total_price(10, 20.5);这条语句会返回10个商品、单价20.5元的总价。
注意事项:
参数顺序必须与存储过程定义一致
如果存储过程有输出参数,需要在Navicat中设置变量接收
确保有执行该存储过程的权限
二、执行函数的方法
函数是返回单个值的特殊存储过程,在Navicat中通常使用SELECT语句调用。
在Oracle数据库中,存储过程调用存储过程可通过直接嵌套调用实现,具体步骤和关键点如下:
1. 调用语法与基本形式
Oracle中调用存储过程的语法为{call 存储过程名(参数)},但在存储过程内部调用其他存储过程时,可直接使用存储过程名及参数列表,无需额外关键字。例如,存储过程B中调用存储过程A的语句为A(emp.id, v_emp_name, v_emp_age);,其中emp.id为输入参数,v_emp_name和v_emp_age为输出参数。
2. 参数传递与类型匹配
调用时需确保参数类型、数量与被调用存储过程的定义一致。输入参数可直接传递常量或变量,输出参数需使用变量接收结果。例如,存储过程A定义了三个参数(输入ID、输出姓名、输出年龄),存储过程B中通过声明变量v_emp_name和v_emp_age接收输出值,并在调用时传入。
3. 嵌套调用逻辑设计
被调用的存储过程可嵌入循环、条件语句等控制结构中。例如,存储过程B通过游标遍历部门下所有员工ID,在循环体内调用存储过程A获取每个员工的详细信息,再通过DBMS_OUTPUT.PUT_LINE输出结果。
基本结构
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/16725
--[例7.1]不带参的
use pxscj
go
create procedure student_info
as
select *
from cjb
where xh='081101'
go
--[例7.2]带参的
use pxscj
go
create procedure student_info1 @name char(8),@cname char(16)
as
select a.xh,xm,kcm,cj,t.xf
from xsb a inner join cjb b
on a.xh=b.xh inner join kcb t
on b.kch=t.kch
where a.xm=@name and t.kcm=@cname
go
execute student_info1 '王林','计算机基础'
1、 创建语法
createproc|procedurepro_name
[{@参数数据类型}[=默认值][output],
{@参数数据类型}[=默认值][output],
....
]
as
SQL_statements
2、 创建不带参数存储过程
--创建存储过程
if(exists(select*fromsys.objectswherename='proc_get_student'))
dropprocproc_get_student
go
createprocproc_get_student
as
select*fromstudent;
--调用、执行存储过程
execproc_get_student;
3、 修改存储过程
--修改存储过程
alterprocproc_get_student
as
select*fromstudent;
4、 带参存储过程
--带参存储过程
if(object_id('proc_find_stu','P')isnotnull)
dropprocproc_find_stu
go
createprocproc_find_stu(@startIdint,@endIdint)
as
select*fromstudentwhereidbetween@startIdand@endId
go
execproc_find_stu2,4;
5、 带通配符参数存储过程
--带通配符参数存储过程
if(object_id('proc_findStudentByName','P')isnotnull)
dropprocproc_findStudentByName
go
createprocproc_findStudentByName(@namevarchar(20)='%j%',@nextNamevarchar(20)='%')
as
select*fromstudentwherenamelike@nameandnamelike@nextName;
go
execproc_findStudentByName;execproc_findStudentByName'%o%','t%';
扩展资料:
SQL存储过程优点:
1、重复使用。

以上就是存储过程语法的全部内容,有参数的存储过程:create procedure 存储过程名称(参数1, 参数2, )begin