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;
/
--带返回游标的动态执行语句.
CREATE OR REPLACE PROCEDURE a_test2
(
    o_cursor OUT SYS_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 FOR t_sql
    USING t_c, t_d   -- 同样如果不需要使用变量,不用写USING XXX语句.
    ;
END a_test2;
/

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

    --如果不带参数,以下申明变量及传入参数都不需要写.
    --申明变量类型及出入参.必须一行写完,不能换行.
    ,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
    ;
END
GO
--sql server返回游标与普通的语句一样,直接将t_sql赋值成 select * from XXX 即可.

Db2

CREATE PROCEDURE a_test
(
    v_c           VARCHAR(20)
)
BEGIN
    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;

    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
BEGIN
    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;

    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
时间: 2024-12-21 01:28:24

sql server、db2、oracle 存储过程动态sql语句示例的相关文章

不同数据库oracle mysql SQL Server DB2 infomix sybase分页查询语句

在不同数据库中的使用的分页查询语句: 当前页:currentpage 页大小:pagesize 1. Oracle数据库 select * from (select A.*,rownum rn from ( QUERY_SQL ) A )  where rn <= ((currentpage+1)*pagesize) and rn > (currentpage*pagesize) 注:QUERY_SQL为查询sql语句. 或 select * from (select rownum rn,id

C#连接Access、SQL Server、Oracle、MySQL、DB2和SyBase数据库的代码集

C#连接六类数据库的代码集 本文列出了C#连接Access.SQL Server.Oracle.MySQL.DB2和SyBase六种不同数据库的程序源码和需要注意的点. 1.C#连接Access 程序代码: Code using System.Data;using System.Data.OleDb; .. string strConnection="Provider=Microsoft.Jet.OleDb.4.0;"; strConnection+[email protected]&

Sql Server 常用系统存储过程大全

-- 来源于网络 -- 更详细的介结参考联机帮助文档 xp_cmdshell --*执行DOS各种命令,结果以文本行返回. xp_fixeddrives --*查询各磁盘/分区可用空间 xp_loginconfig --*报告SQL Server 实例在Windows 上运行时的登录安全配置 xp_logininfo --*返回有关Windows 认证登录的信息. xp_msver --*返回有关Microsoft SQL Server 的版本信息 xp_enumgroups    --返回Wi

SQL Server 、 Oracle 以及 MySQL 有哪些区别?

SQL,在这里我理解成SQL Server.三者是目前市场占有率最高(依安装量而非收入)的关系数据库,而且很有代表性.排行第四的DB2(属IBM公司),与Oracle的定位和架构非常相似,就不赘述了. 如果要说明三者的区别,首先就要从历史入手. Oracle:中文译作甲骨文,这是一家传奇的公司,有一个传奇的大老板Larry Ellision. Ellision 32岁还一事无成,读了三个大学,没得到一个学位文凭,换了十几家公司,老婆也离他而去.开始创业时只有1200美元,却使得Oracle公司连

Oracle本地动态 SQL

本地动态 SQL 首先我们应该了解什么是动态 SQL,在 Oracle数据库开发 PL/SQL块中我们使用的 SQL 分为:静态 SQL语句和动态 SQL语句.所谓静态 SQL指在 PL/SQL块中使用的 SQL语句在编 译时是明确的,执行的是确定对象.而动态 SQL是指在 PL/SQL块编译时 SQL语句是不确定 的,如根据用户输入的参数的不同而执行不同的操作.编译程序对动态语句部分不进行处理, 只是在程序运行时动态地创建语句.对语句进行语法分析并执行该语句. Oracle中动态 SQL可以通

SQL Server 2000 系统存储过程

SQL Server 2000 系统存储过程 在 Microsoft? SQL Server? 中,许多管理和信息活动可以通过系统存储过程执行.系统存储过程按这些分类分组. 分类 描述 Active Directory 过程 用于在 Microsoft Windows? 2000 Active Directory? 中注册 SQL Server 实例和 SQL Server 数据库. 目录过程 执行 ODBC 数据字典功能,并隔离 ODBC 应用程序,使之不受基础系统表更改的影响. 游标过程 执

sql server 与 oracle的区别(转)

--1.数据类型不同.      --sql server 的数据类型:int ,smallint ,char,varchar,nchar,nvarchar,ntext,datetime,smalldatetime,money,decima,      --float,bit……                  --oracle 的数据类型:number(p,s),char,varchar2,Date,LOB               --注意:insert into table_name

SQL Server基础之&lt;存储过程&gt;

  简单来说,存储过程就是一条或者多条sql语句的集合,可视为批处理文件,但是其作用不仅限于批处理.本篇主要介绍变量的使用,存储过程和存储函数的创建,调用,查看,修改以及删除操作. 一:存储过程概述  SQL Server中的存储过程是使用T_SQL编写的代码段.它的目的在于能够方便的从系统表中查询信息,或者完成与更新数据库表相关的管理任务和其他的系统管理任务.T_SQL语句是SQL Server数据库与应用程序之间的编程接口.在很多情况下,一些代码会被开发者重复编写多次,如果每次都编写相同功能

sql server 与 oracle的区别

转载于:http://blog.csdn.net/it_fengli/article/details/8213839 --sql server 与  oracle的区别: --DBMS 数据库管理系统 --1.数据类型不同. --sql server 的数据类型:int ,smallint ,char,varchar,nchar,nvarchar,ntext,datetime,smalldatetime,money,decima, --float,bit-- --oracle 的数据类型:num