当前位置: 首页 > 学英语

存储过程语法,sql存储过程实例详解

  • 学英语
  • 2026-03-18

存储过程语法?1、 创建语法 create proc | procedure pro_name [{@参数数据类型} [=默认值] [output],{@参数数据类型} [=默认值] [output],.]as SQL_statements 2、那么,存储过程语法?一起来了解一下吧。

mysql存储过程实例详解

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语句调用。

存储过程for in loop

在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

数据库procedure的用法

--[例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 ;end;例如:create procedure getNum(num varchar(100))begin select 姓名 from 学生表 where 学号=num;end;默认参数的存储过程:可以设置参数的默认值。注意事项:定义存储过程语法里的SQL语句必须用分号结尾。内容来源于互联网,信息真伪需自行辨别。如有侵权请联系删除。

猜你喜欢