加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > MsSql教程 > 正文

sqlserver、db2、oracle存储过程动态sql语句示例

发布时间:2020-12-12 13:51:05 所属栏目:MsSql教程 来源:网络整理
导读:Oracle ? ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 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);
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 CREATEORREPLACEPROCEDUREa_testAS????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';????? ????EXECUTEIMMEDIATE t_sql????INTO? t_a,t_b? --如果不需要查询赋值,这里不用写 INTO XXX语句.????USING t_c,t_d? -- 如果不需要使用变量,不用写USING XXX语句.????;ENDa_test;/

?

? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 --带返回游标的动态执行语句.CREATEORREPLACEPROCEDUREa_test2(????o_cursor OUTSYS_REFCURSOR)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 * FROM t1 WHERE c = :tempC OR c = :tempD'; ? ????OPEN? o_cursor FORt_sql????USING t_c,t_d?? -- 同样如果不需要使用变量,不用写USING XXX语句.????;ENDa_test2;/

?

SQL Server

? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 CREATEPROCEDUREa_testAS????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后边拼接字符串????EXECUTESP_EXECUTESQL @t_sql????? ????--如果不带参数,以下申明变量及传入参数都不需要写.????--申明变量类型及出入参.必须一行写完,不能换行.????,N'@tempA VARCHAR(20) OUT,@tempB VARCHAR(20) OUT,@tempC VARCHAR(20),@tempD VARCHAR(20)'????-- 参数值.? 传入变量的顺序要与申明变量的顺序一致,????,@t_a OUT,@t_b OUT,@t_c,@t_d????;ENDGO--sql server返回游标与普通的语句一样,直接将t_sql赋值成 select * from XXX 即可.


Db2

?

? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 CREATEPROCEDUREa_test(????v_c?????????? VARCHAR(20))BEGIN????DECLAREt_sql VARCHAR2(2000);????DECLAREt_a?? VARCHAR2(20);????DECLAREt_b?? VARCHAR2(20);????DECLAREt_c?? VARCHAR2(20);????DECLAREt_d?? VARCHAR2(20);????-- FOR 后边的t_stmt要与下边的 prepare后的变量一致,其类型为 statement.????DECLAREt_cur CURSORFORt_stmt; ? ????SETt_c = 'f';????SETt_d = 'g';????? ????--这里可为insert 等任何sql语句.????SETt_sql = 'SELECT MAX(a),MAX(b) FROM t1 WHERE c = :tempC OR c = :tempD';????? ????--我目前在这里没找到其它方式来替代,只能使用游标读取:????PREPAREt_stmt FROMt_sql;????? ????OPENt_cur????--如果不需要使用变量,不用写USING XXX语句.????USING t_c,t_d????;????? ????FETCHt_cur INTOt_a,t_b;????CLOSEt_cur;END

?

? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 /*带游标返回的动态语句与普通语句一样,只是申明游标时,要申明返回类型的游标并且在begin关键字之前需要插入:DYNAMIC RESULT SETS 1LANGUAGE SQL*/ ? CREATEPROCEDUREa_test2(????v_c?????????? VARCHAR(20))DYNAMICRESULT SETS 1LANGUAGE SQLBEGIN????DECLAREt_sql VARCHAR2(2000);????DECLAREt_a?? VARCHAR2(20);????DECLAREt_b?? VARCHAR2(20);????DECLAREt_c?? VARCHAR2(20);????DECLAREt_d?? VARCHAR2(20);????-- FOR 后边的t_stmt要与下边的 prepare后的变量一致,其类型为 statement.????DECLAREt_cur CURSORWITHRETURNFORt_stmt; ? ????SETt_c = 'f';????SETt_d = 'g';????? ????--这里可为insert 等任何sql语句.????SETt_sql = 'SELECT MAX(a),MAX(b) FROM t1 WHERE c = :tempC OR c = :tempD';????? ????PREPAREt_stmt FROMt_sql;????? ????OPENt_cur????--如果不需要使用变量,不用写USING XXX语句.????USING t_c,t_d????;END

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

Oracle

?

?
    推荐文章
      热点阅读