怎样SQL存储过程中执行动态SQL语句
答案:2 悬赏:50
解决时间 2021-03-22 13:44
- 提问者网友:长安小才冯
- 2021-03-22 07:24
怎样SQL存储过程中执行动态SQL语句
最佳答案
- 二级知识专家网友:一池湖水
- 2021-03-22 07:33
1.EXEC的使用
EXEC命令有两种用法,一种是执行一个存储过程,另一种是执行一个动态的批处理。以下所讲的都是第二种用法。
下面先使用EXEC演示一个例子,代码1
DECLARE @TableName VARCHAr(50),@Sql NVARCHAr (MAX),@OrderID INT;
SET @TableName = 'Orders';
SET @OrderID = 10251;
SET @sql =
'SELECt * FROM '+QUOTENAME(@TableName) +'WHERe OrderID = '+
CAST(@OrderID AS VARCHAr(10))+' ORDER BY ORDERID DESC'
EXEC(@sql);
sp_executesql命令在SQL Server中引入的比EXEC命令晚一些,它主要为重用执行计划提供更好的支持。
为了和EXEC作一个鲜明的对比,我们看看如果用代码1的代码,把EXEC换成sp_executesql,看看是否得到我们所期望的结果
DECLARE @TableName VARCHAr(50),@sql NVARCHAr(MAX),@OrderID INT ,@sql2 NVARCHAr(MAX);
SET @TableName = 'Orders ';
SET @OrderID = 10251;
SET @sql = 'SELECt * FROM '+QUOTENAME(@TableName) + ' WHERe OrderID = '+CAST(@OrderID AS VARCHAr(50)) + ' ORDER BY ORDERID DESC'
EXEC sp_executesql @sql
EXEC命令有两种用法,一种是执行一个存储过程,另一种是执行一个动态的批处理。以下所讲的都是第二种用法。
下面先使用EXEC演示一个例子,代码1
DECLARE @TableName VARCHAr(50),@Sql NVARCHAr (MAX),@OrderID INT;
SET @TableName = 'Orders';
SET @OrderID = 10251;
SET @sql =
'SELECt * FROM '+QUOTENAME(@TableName) +'WHERe OrderID = '+
CAST(@OrderID AS VARCHAr(10))+' ORDER BY ORDERID DESC'
EXEC(@sql);
sp_executesql命令在SQL Server中引入的比EXEC命令晚一些,它主要为重用执行计划提供更好的支持。
为了和EXEC作一个鲜明的对比,我们看看如果用代码1的代码,把EXEC换成sp_executesql,看看是否得到我们所期望的结果
DECLARE @TableName VARCHAr(50),@sql NVARCHAr(MAX),@OrderID INT ,@sql2 NVARCHAr(MAX);
SET @TableName = 'Orders ';
SET @OrderID = 10251;
SET @sql = 'SELECt * FROM '+QUOTENAME(@TableName) + ' WHERe OrderID = '+CAST(@OrderID AS VARCHAr(50)) + ' ORDER BY ORDERID DESC'
EXEC sp_executesql @sql
全部回答
- 1楼网友:一身浪痞味
- 2021-03-22 08:48
有时需要在oracle 存储过程中执行动态sql 语句 ,例如表名是动态的,或字段是动态的,
或查询命令是动态的,可用下面的方法:
set serveroutput ondeclaren number;sql_stmt varchar2(50);
t varchar2(20);beginexecute immediate 'alter session set nls_date_format=''yyyymmdd''';
t := 't_' || sysdate;
sql_stmt := 'select count(*) from ' || t;
execute immediate sql_stmt into n;
dbms_output.put_line('the number of rows of ' || t || ' is ' || n);end;
如果动态sql 语句 很长很复杂,则可用包装.
create or replace package test_pkgistype cur_typ is ref cursor;
procedure test_proc (v_table varchar2,t_cur out cur_typ);end;/
create or replace package body test_pkgisprocedure test_proc (v_table varchar2,t_cur out cur_typ)issqlstr varchar2(2000);beginsqlstr := 'select * from '||v_table;
open t_cur for sqlstr;end;end;/
在oracle 中批量导入,导出和删除表名以某些字符开头的表
spool c:\a.sql
我要举报
如以上问答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
推荐资讯