db2与oracle存储过程,sql server、db2、oracle 存储过程动态sql语句示例

Oracle

CREATE OR REPLACE PROCEDURE a_test

AS

t_sql VARCHAR2(2000);

t_a VARCHAR2(20);

t_b VARCHAR2(20);

t_c VARCHAR2(20);

t_d VARCHAR2(20);

BEGIN

t_c := ‘f‘;

t_d := ‘g‘;

--这里可为insert 等任何sql语句.

t_sql := ‘SELECT MAX(a), MAX(b) FROM t1 WHERE c = :tempC OR c = :tempD‘;

EXECUTE IMMEDIATE t_sql

INTO t_a, t_b --如果不需要查询赋值,这里不用写 INTO XXX语句.

USING t_c, t_d -- 如果不需要使用变量,不用写USING XXX语句.

;

END a_test

?SQL Server

CREATE PROCEDURE a_test

AS

DECLARE @t_sql NVARCHAR(2000); --sql server 动态语句要申明为NVARCHAR类型.

DECLARE @t_a VARCHAR(20);

DECLARE @t_b VARCHAR(20);

DECLARE @t_c VARCHAR(20);

DECLARE @t_d VARCHAR(20);

BEGIN

SET t_c = ‘f‘;

SET t_d = ‘g‘;

--这里可为insert 等任何sql语句.

SET t_sql = ‘SELECT @tempA = MAX(a), @tempB = MAX(b) FROM t1 WHERE c = @tempC OR c = @tempD‘;

--不可在EXECUTE SP_EXECUTESQL后边拼接字符串

EXECUTE SP_EXECUTESQL @t_sql

--如果不带参数,以下申明变量及传入参数都不需要写.

--申明变量类型及出入参.必须一行写完,不能换行.

,[email protected] VARCHAR(20) OUT, @tempB VARCHAR(20) OUT, @tempC VARCHAR(20), @tempD VARCHAR(20)‘

-- 参数值. 传入变量的顺序要与申明变量的顺序一致,

,@t_a, @t_b, @t_c, @t_d

;

END

GO

--sql server返回游标与普通的语句一样,直接将t_sql赋值成 select * from XXX 即可.

?

Db2

CREATE PROCEDURE a_test

(

v_c VARCHAR(20)

)

AS

DECLARE t_sql VARCHAR2(2000);

DECLARE t_a VARCHAR2(20);

DECLARE t_b VARCHAR2(20);

DECLARE t_c VARCHAR2(20);

DECLARE t_d VARCHAR2(20);

-- FOR 后边的t_stmt要与下边的 prepare后的变量一致,其类型为 statement.

DECLARE t_cur CURSOR FOR t_stmt;

BEGIN

SET t_c = ‘f‘;

SET t_d = ‘g‘;

--这里可为insert 等任何sql语句.

SET t_sql = ‘SELECT MAX(a), MAX(b) FROM t1 WHERE c = :tempC OR c = :tempD‘;

--我目前在这里没找到其它方式来替代,只能使用游标读取:

PREPARE t_stmt FROM t_sql;

OPEN t_cur

--如果不需要使用变量,不用写USING XXX语句.

USING t_c, t_d

;

FETCH t_cur INTO t_a, t_b;

CLOSE t_cur;

END

/*

带游标返回的动态语句与普通语句一样,只是申明游标时,要申明返回类型的游标

并且在begin关键字之前需要插入:

DYNAMIC RESULT SETS 1

LANGUAGE SQL

*/

CREATE PROCEDURE a_test2

(

v_c VARCHAR(20)

)

DYNAMIC RESULT SETS 1

LANGUAGE SQL

AS

DECLARE t_sql VARCHAR2(2000);

DECLARE t_a VARCHAR2(20);

DECLARE t_b VARCHAR2(20);

DECLARE t_c VARCHAR2(20);

DECLARE t_d VARCHAR2(20);

-- FOR 后边的t_stmt要与下边的 prepare后的变量一致,其类型为 statement.

DECLARE t_cur CURSOR WITH RETURN FOR t_stmt;

BEGIN

SET t_c = ‘f‘;

SET t_d = ‘g‘;

--这里可为insert 等任何sql语句.

SET t_sql = ‘SELECT MAX(a), MAX(b) FROM t1 WHERE c = :tempC OR c = :tempD‘;

--我目前在这里没找到其它方式来替代,只能使用游标读取:

--如果大家有好的方式可以共享一下。

PREPARE t_stmt FROM t_sql;

OPEN t_cur

--如果不需要使用变量,不用写USING XXX语句.

USING t_c, t_d

;

END

?

原文:http://lianggeblog.iteye.com/blog/2182035

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值