实例 :
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、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
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