回输出参数或结果集
存储过程的优点 :
1、改善性能
2、提高安全性
3、减少网络交通量
4、提高开发人员的生产率
5、能充分发挥专家的作用
6、简化了应用的维护
7、应用的灵活性
8、确保算法的一致性
9、数据透明性
存储过程的缺点:
1、可能加重了服务器方的负载
2、要注意对该共享资源的管理以免造成并发冲突
3、可移植性差
存储过程的结构 :
在CREATE PROCEDURE 语句中可包含:
1、过程参数清单的说明
2、结果集
3、过程体,它由复合SQL语句构成
存储过程的结果:
1、OUT 或 INOUT 参数
2、结果集
3、允许存储过程返回多个列和行
4、RETURN 状态
5、允许你无条件地退出一个存储过程,同时返回一个特定的状态值。
CREATE PROCEDURE:
1、CREATE PROCEDURE
进行语法分析 存入系统表 SYSPROCEDURE
2、直到被调用时才被编译
然后建立存取计划并存储在内存中
在ASE中,你必须以明显方式指明要进行编译。
3、基本语法 CREATE PROCEDURE procedure-name ([IN | OUT | INOUT] parameter-name datatype [DEFAULT expression], …) [RESULT (result-col1, result-col2, ...)] compound-statement
实例 :
CREATE PROCEDURE big_num
(IN a INT, IN b INT, OUT c INT)
BEGIN
IF a > b
THEN
SET c = a;
ELSE
SET c = b;
END IF;
END;
参数列表清单 :
1、用来向存储过程传送值或接受存储过程返回值
2、参数的定义
种类: IN, OUT 或 INOUT
名字: 要遵守数据库标识符约定
数据类型: 任何有效的Adaptive Server Anywhere 数据类型
可给出 DEFAULT 值
3、在掉用该存储过程时,必须为每个参数提供一个值。
为参数赋值 :
1、SET 语句
2、SELECT INTO 语句
实例:
CREATE PROCEDURE order_count
(IN @customer_id INT, OUT @orders INT)
BEGIN
SELECT COUNT("dba".sales_order.id) INTO @orders FROM "dba".customer KEY LEFT OUTER JOIN "dba".sales_order WHERE "dba".customer.id = @customer_id;
END
结果集 :
1、允许一个存储过程返回多行
2、实例 1 — 返回客户的 ID和订单
CREATE PROCEDURE customer_orders( )
RESULT (customer_id INT, order_count INT)
BEGIN
SELECT "dba".customer.id, COUNT( "dba".sales_order.id ) FROM "dba".customer KEY LEFT OUTER JOIN "dba".sales_order GROUP BY "dba".customer.id;
END;
3、还可由多个SELECT 语句返回数据
4、结果集中必须: 列的数目相同 有相同的数据类型 (或是可进行隐式转换)
5、T-SQL 可以包含动态的结果集
6、实例 2 — 返回客户和联系人的清单
CREATE PROCEDURE custs_and_contacts ( )
RESULT (lname CHAR (36), fname CHAR (36))
BEGIN
SELECT lname, fname FROM "dba".customer;
SELECT last_name, first_name FROM "dba".contact;
END;
组合语句 :
1、用在过程本体中
被BEGIN 和 END所包围
2、可包含局部说明,它仅在组合语句的上下文中有效。
局部说明可被嵌套的子句所访问
3、被内部语句所使用的资源要在它们的语句的 END处才释放
4、实例:
CREATE PROCEDURE someproc ( )
BEGIN
DECLARE x INT;
DECLARE y INT;
SELECT count(*) INTO x FROM TableA;
SELECT count(*) INTO y FROM TableB;
BEGIN
DECLARE z INT;
CALL greater (x, y, z);
PRINT ‘z = %1!’, z;
END;
END;
编写存储过程的注意事项 :
1、校验命令分隔符
2、语句的分隔
使用分号
3、应采用完全受限命名
4、应采用无二意性的日期和时间格式
过程化语言 :
1、Adaptive Server Anywhere 过程化扩展
说明语句
条件语句
反复循环语句
分支语句
错误处理指令
2、编写存储过程就类似于编程序
说明语句 :
1、BEGIN, END
2、DECLARE, SET
3、说明: 变量 表达式 语句块
4、赋值
BEGIN 和 END:
1、定义一个组合语句
2、可包含局部变量,游标,临时表及表达式。
3、语法
BEGIN [ATOMIC]
…
…
END
4、实例
BEGIN
UPDATE product SET unit_price = 1.25 * unit_price;
UPDATE employee SET salary = .95 * salary;
END;
原子化多个SQL语句 :
1、这些语句或是全部完成或是一个也不做
2、确保数据的一致性
3、使用 BEGIN ATOMIC 语法
4、实例:
CREATE PROCEDURE update_dept(IN @old_dept_num INT, IN @new_dept_num INT, IN @new_dept_name CHAR (40), IN @new_dept_head_id INT)
BEGIN ATOMIC
INSERT INTO department (dept_id, dept_name, dept_head_id) VALUES (@new_dept_num, @new_dept_name, @new_dept_head_id);
UPDATE employee SET dept_id = @new_dept_num
WHERE dept_id = @old_dept_num;
DELETE FROM department
WHERE dept_id = @old_dept_num;
END ;
DECLARE:
1、说明变量,游标,临时表及表达式。
2、利用SET设置初始值
3、必须紧跟在一个 BEGIN 语句之后
ASE的T-SQL 允许在存储过程中的任何点使用 DECLARE
DECLARE variable-name datatype;
SET variable-name expression;
DECLARE LOCAL TEMPORARY TABLE table-name (table-definition) •[ON COMMIT {DELETE | PRESERVE} ROWS]
4、实例:
BEGIN
DECLARE discount numeric (6,2);
SET discount = .15;
SELECT discount * unit_price FROM product;
END
BEGIN
DECLARE LOCAL emp_temp (emp_fname char(20), emp_lname char (20) ON COMMIT DELETE ROWS);
END
条件语句 :
1、根据前面的语句来改变执行流程
2、IF
3、CASE
4、RETURN (经常是伴有条件来使用)
IF 语句 :
1、当一个条件为 TRUE(真)时准许执行
2、ELSE 子句是当一个条件为 FALSE(失败)时准许执行
3、ELSE IF 准许附加的条件
4、语法:
IF search-condition1 THEN statement-list1;
[ELSEIF search-condition2
THEN statement-list2];
[ELSE statement-list3];
END IF;
5、实例
IF @color = red
THEN SELECT * FROM product WHERE color = 'red';
ELSEIF @color = blue
THEN
SELECT * FROM product WHERE color = 'blue';
ELSE SELECT * FROM product;
END IF;
CASE 语句 :
1、利用WHEN子句指明多个条件
2、ELSE子句是用于如果没有一个WHEN子句能成为 TRUE时
3、语法:
CASE value-expression
WHEN constant1 THEN statement-list1
WHEN constant2 THEN statement-list2
WHEN constant3 THEN statement-list3
ELSE statement-list4;
END CASE;
4、实例
CASE @id_type
WHEN 'cust' THEN
SELECT id FROM customer
WHEN 'dept' THEN
SELECT dept_id FROM department
WHEN 'contact' THEN
SELECT id FROM contact
ELSE
SELECT emp_id FROM employee;
END CASE;
RETURN 语句:
1、导致立即退出一个存储过程
2、可带有表达式以向调用者返回单个值
3、语法:
RETURN [表达式]
4、实例:
IF @quantity =>1
THEN
UPDATE sales_order_items SET quantity = @quantity;
ELSE RETURN 'You must enter a quantity';
END IF;
反复循环语句:
1、请看Adaptive Server Anywhere参考手册第9章:SQL语句
2、 LOOP 语句 [WHILE…] LOOP
3、其中 WHILE 条件是选项
4、FOR (用在游标中)
WHILE…LOOP:
1、只要WHILE条件为TRUE则不断地重复执行
2、语法
[statement-label:]
[WHILE condition] LOOP
statement-list
END LOOP [statement-label]
3、实例:
SET @total = 0;
SET @num_items = 0;
INSERT INTO total_temp VALUES (0,0);
loop1:
WHILE @total < 100.00 LOOP
UPDATE total_temp SET num_items = @num_items;
SET @total = @total + SELEC上一页 [1] [2] [3] [4] [5] [6] [7] [8] [9] [10] 下一页 |