当前位置:首页 » 存储配置 » sql存储过程动态语句

sql存储过程动态语句

发布时间: 2022-09-02 22:46:13

Ⅰ Mysql存储过程中实现执行动态SQL语句的方法

本文实例讲述了MySQL存储过程中实现执行动态SQL语句的方法。分享给大家供大家参考。具体实现方法如下:
mysql>
mysql>
delimiter
$$
mysql>
mysql>
CREATE
PROCEDURE
set_col_value
->
(in_table
VARCHAR(128),
->
in_column
VARCHAR(128),
->
in_new_value
VARCHAR(1000),
->
in_where
VARCHAR(4000))
->
->
BEGIN
->
DECLARE
l_sql
VARCHAR(4000);
->
SET
l_sql=CONCAT_ws('
',
->
'UPDATE',in_table,
->
'SET',in_column,'=',in_new_value,
->
'
WHERE',in_where);
->
SET
@sql=l_sql;
->
PREPARE
s1
FROM
@sql;
->
EXECUTE
s1;
->
DEALLOCATE
PREPARE
s1;
->
END$$
Query
OK,
0
rows
affected
(0.00
sec)
希望本文所述对大家的MySQL数据库程序设计有所帮助。

Ⅱ Sql存储过程 如何动态修改sql语句!

利用动态sql:
将整个sql语句编辑成一个字符串,最终通过execute语句来执行动态sql

Select @Count = count(ID)
FROM NetDIY_Procts_CN
那么这个呢?需要把结果返回到@Count中,要怎么在这个sql加上@SqlWhere 条件语句

exec('select ' + @Count + '= count(ID) from NetDIY_Procts_CN ' + @SqlWhere)

SELECT * FROM NetDIY_Procts_CN Where weighting <= @Name order By weighting desc
exec('select * FROM NetDIY_Procts_CN Where weighting <= '+@Name+' ' + @SqlWhere+' order By weighting desc')
两种都出错

Ⅲ oracle存储过程中如何执行动态SQL语句

有时需要在oracle
存储过程
中执行动态SQL
语句
,例如表名是动态的,或字段是动态的,或查询命令是动态的,可用下面的方法:
set
serveroutput
on
declare
n
number;
sql_stmt
varchar2(50);
t
varchar2(20);
begin
execute
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_pkg
IS
TYPE
cur_typ
IS
REF
CURSOR;
PROCEDURE
test_proc
(v_table
VARCHAR2,t_cur
OUT
cur_typ);
END;
/
CREATE
OR
REPLACE
PACKAGE
BODY
test_pkg
IS
PROCEDURE
test_proc
(v_table
VARCHAR2,t_cur
OUT
cur_typ)
IS
sqlstr
VARCHAR2(2000);
BEGIN
sqlstr
:=
'SELECT
*
FROM
'||v_table;
OPEN
t_cur
FOR
sqlstr;
END;
END;
/
在oracle
中批量导入,导出和删除表名以某些字符开头的表
spool
c:\a.sql
select
'drop
table
'
||
tname
||
';'
from
tab
where
tname
like
'T%';
spool
off
@c:\a

Ⅳ 动态SQL语句与存储过程,谁有高见谢谢

如果你不写存储过程你有没想过会效率根低呢!
说白了你就是不明白存储过程!
在一个名称下存储并作为一个单元进行编译和处理的T-SQL 语句的集合。

在一个存储过程内,可以设计、编码、测试和执行某个常用任务所需的 SQL 语句和逻辑。之后,每个需要执行该任务的应用程序只须执行此存储过程即可。
允许模块化程序设计
对于需要重复执行的代码,执行效率更高
减少网络流量
可作为安全机制使用
好了如果你不用!那好我问你SQL注入你要怎么防止!
而且插入数据如果出现问题!数据会保存么!
这样你就会有那样这样的BAG出现!
存储过程为什么叫存储过程呢!
就是因为它预先把T-SQL语句存起来!在执行的时候系统会省掉很多缓存资源!
而且不会浪费资源!
假如有几百条的存储过程要写!又要计算!
那么为什么不可以在客户端实现一些这样又可以减轻SQL的负担!
现在的电脑配置能很高啦!问题一般出现不大!
界面验证呀!像一些简单的查询大可以在客户端实现么!
敏感数据在用存储过程计算!
我就做你说的那种第二种的开发!
效果也挺不错!
问题不在于存储过程!在于你代码的如何编写!
怎么样能够大大提高运行的效率!
例如不必要浪费的常量!开辟会占堆中资源!
有的代码运行次数太少!可以简写!甚至不写!非必要都可以省略!
4层架构知道吧!尽量的做到代码要重用!可大大减少资源的浪费!
SQL的负担也会腾出来许多!
扯远啦!
好了就这吧!
希望对你有帮助!

Ⅳ 存储过程里,如何调用动态子存储过程

您好,很高兴为您解答。

/*动态执行存储过程DEMO*/
DECLARE
v_Procere_Name VARCHAR2(320); --存储过程名
v_Input_Parameter1 VARCHAR2(320); --传入参数1
v_Input_Parameter2 VARCHAR2(320); --传入参数2
v_Return_Int INTEGER; --接收返回值
v_Return_String VARCHAR2(320); --接收返回值

v_Sql_Str VARCHAR2(320); --动态执行SQL语句
BEGIN
/*获取存储过程名,可以从数据库中动态读取需要执行的存储过程,本DEMO直接赋值*/
v_Procere_Name := 'Wms_Application_Out_p.Application_Out_List_Refuse(:i_Str1,:i_Str2,_Return_Int,_Return_String)';
/*本DEMO假定需要调用的存储过程有两个传入参数和两个传出参数*/
v_Input_Parameter1 := 'test01'; --传入参数1,在实际应用中根据具体情况机型赋值
v_Input_Parameter2 := 'test01'; --传入参数2,在实际应用中根据具体情况机型赋值
/*动态生成需要执行存储过程的SQL语句*/
v_Sql_Str := 'BEGIN ' || v_Procere_Name || '; END;';
/*执行该SQL语句*/
EXECUTE IMMEDIATE v_Sql_Str
USING IN v_Input_Parameter1, IN v_Input_Parameter2, OUT v_Return_Int, OUT v_Return_String; --参数类型和传递顺序必须与存储过程中的保持一致
/*输出返回值*/
Dbms_Output.Put_Line(v_Return_Int || v_Return_String);
END;

/*动态执行函数DEMO*/
DECLARE
v_Function_Name VARCHAR2(320); --函数名
v_Input_Parameter1 VARCHAR2(320); --传入参数1
v_Return_String VARCHAR2(320); --接收返回值

v_Sql_Str VARCHAR2(320); --动态执行SQL语句
BEGIN
/*获取函数名,可以从数据库中动态读取需要执行的函数,本DEMO直接赋值*/
v_Function_Name := 'Return_Str_f(:i_Str1)';
/*本DEMO假定需要调用的函数有1个传入参数*/
v_Input_Parameter1 := 'test01'; --传入参数1,在实际应用中根据具体情况机型赋值
/*动态生成需要执行函数的SQL语句*/
v_Sql_Str := 'begin :v_Return_String := ' || v_Function_Name || '; end;';
/*执行该SQL语句*/
EXECUTE IMMEDIATE v_Sql_Str
USING OUT v_Return_String, IN v_Input_Parameter1; --接收返回值必须在前,传入参数类型和传递顺序必须与函数中保持一致
/*输出返回值*/
Dbms_Output.Put_Line(v_Return_String);
END;

/*所调用函数*/
CREATE OR REPLACE FUNCTION Return_Str_f(i_Str1 VARCHAR2) RETURN VARCHAR2 IS
v_Sql_Str VARCHAR2(320);
v_Str1 VARCHAR2(320);
BEGIN
/*生成动态执行SQL*/
v_Sql_Str := 'SELECT ''' || i_Str1 || ''' FROM DUAL';
EXECUTE IMMEDIATE v_Sql_Str
INTO v_Str1; --接收返回值
/*输出返回结果*/
Dbms_Output.Put_Line('v_str1=' || v_Str1);
RETURN v_Str1;
END;

相关资料:
Oracle PL/SQL中动态执行SQL EXECUTE IMMEDIATE

在plsql中经常遇到sql语句是在过程中动态生成的,这个时候可以用EXECUTE IMMEDIATE来执行生成的sql语句。转一个javaeye(貌似他也是转的,找不到出处)上的EXECUTE IMMEDIATE用法。
EXECUTE IMMEDIATE代替了以前Oracle8i中DBMS_SQL package包.它解析并马上执行动态的SQL语句或非运行时创建的PL/SQL块.动态创建和执行SQL语句性能超前,EXECUTE IMMEDIATE的目标在于减小企业费用并获得较高的性能,较之以前它相当轻易编码.尽管DBMS_SQL仍然可用,

但是推荐使用EXECUTE IMMEDIATE,因为它获的收益在包之上。
使用技巧
1. EXECUTE IMMEDIATE将不会提交一个DML事务执行,应该显式提交
假如通过EXECUTE IMMEDIATE处理DML命令,那么在完成以前需要显式提交或者作为EXECUTE IMMEDIATE自己的一部分. 假如通过EXECUTE IMMEDIATE处理DDL命令,它提交所有以前改变的数据
2. 不支持返回多行的查询,这种交互将用临时表来存储记录(参照例子如下)或者用REF cursors.
3. 当执行SQL语句时,不要用分号,当执行PL/SQL块时,在其尾部用分号.
4. 在Oracle手册中,未具体覆盖这些功能。下面的例子展示了所有用到Execute immediate的可能方面.希望能给你带来方便.
5. 对于Forms开发者,当在PL/SQL 8.0.6.3.版本中,Forms 6i不能使用此功能.
EXECUTE IMMEDIATE用法例子
1. 在PL/SQL运行DDL语句
begin
execute immediate 'set role all';
end;
2. 给动态语句传值(USING 子句)
declare
l_depnam varchar2(20) := 'testing';
l_locvarchar2(10) := 'Du';
begin
execute immediate 'insert into dept values(:1, :2, :3)'
using 50, l_depnam, l_loc;
commit;
end;
3. 从动态语句检索值(INTO子句)
declare
l_cntvarchar2(20);
begin
execute immediate 'select count(1) from emp'
into l_cnt;
dbms_output.put_line(l_cnt);
end;
4. 动态调用例程.例程中用到的绑定变量参数必须指定参数类型.黓认为IN类型,其它类型必须显式指定
declare
l_routin varchar2(100) := 'gen2161.get_rowcnt';
l_tblnam varchar2(20) := 'emp';
l_cntnumber;
l_status varchar2(200);
begin
execute immediate 'begin ' l_routin '(:2, :3, :4); end;'
using in l_tblnam, out l_cnt, in out l_status;
if l_status != 'OK' then
dbms_output.put_line('error');
end if;
end;
5. 将返回值传递到PL/SQL记录类型;同样也可用%rowtype变量
declare
type empdtlrec is record (empnonumber(4),
enamevarchar2(20),
deptnonumber(2));
empdtl empdtlrec;
begin
execute immediate 'select empno, ename, deptno '
'from emp where empno = 7934'
into empdtl;
end;
6. 传递并检索值.INTO子句用在USING子句前
declare
l_deptpls_integer := 20;
l_nam varchar2(20);
l_loc varchar2(20);
begin
execute immediate 'select dname, loc from dept where deptno = :1'
into l_nam, l_loc
using l_dept ;
end;
7. 多行查询选项.对此选项用insert语句填充临时表,用临时表进行进一步的处理,也可以用REF cursors纠正此缺憾.
declare
l_sal pls_integer := 2000;
begin
execute immediate 'insert into temp(empno, ename) '
'select empno, ename from emp '
'wheresal :1'
using l_sal;
commit;
end;
对于处理动态语句,EXECUTE IMMEDIATE比以前可能用到的更轻易并且更高效.当意图执行动态语句时,适当地处理异常更加重要.应该关注于捕捉所有可能的异常.

如若满意,请点击右侧【采纳答案】,如若还有问题,请点击【追问】

希望我的回答对您有所帮助,望采纳!

Ⅵ 如何在oracle存储过程中执行动态sql语句

时需要在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

Ⅶ oracle存储过程中如何执行动态SQL语句 详细

有时需要在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

Ⅷ 存储过程含有动态SQL,与静态SQL有什么差别

SQL 语句从编译和运行的角度可以分为两种,静态 SQL和 动态 SQL,这两种 SQL 在使用方式、运行机制和性能表现等方面各有特点 :

静态 SQL:静态 SQL 语句一般用于嵌入式 SQL 应用中,在程序运行前,SQL 语句必须是确定的,例如 SQL 语句中涉及的列名和表名必须是存在的。静态 SQL 语句的编译是在应用程序运行前进行的,编译的结果会存储在数据库内部。而后程序运行时,数据库将直接执行编译好的 SQL 语句,降低运行时的开销。

动态 SQL:动态 SQL 语句是在应用程序运行时被编译和执行的,例如,使用 DB2 的交互式工具 CLP 访问数据库时,用户输入的 SQL 语句是不确定的,因此 SQL 语句只能被动态地编译。动态 SQL 的应用较多,常见的 CLI 和 JDBC 应用程序都使用动态 SQL。

静态sql:语句类型在编程时候必须是确定好的。比如
select * from employee where empno='abc'select * from employee where empno='12'都必须是确定的,唯一可以变化的是abc的值。
动态sql:语句类型可以在运行期间指定,比如clp就是最典型的动态sql程序,你可以输入任何命令。
静态sql的存取路径是在运行前就确定好的,而动态sql的存取路径是在运行时动态生成的。因此生成的存取计划相对更优,但考虑到生成存取路径的开销,有可能应用程序的运行时间相对会比静态sql长些。

热点内容
青少儿编程品牌 发布:2025-03-16 07:43:24 浏览:627
江西电商存储设备怎么样 发布:2025-03-16 07:32:10 浏览:303
中信电话密码是多少 发布:2025-03-16 07:32:08 浏览:366
怎么样学好编程 发布:2025-03-16 07:31:24 浏览:569
python输出素数 发布:2025-03-16 07:31:21 浏览:418
显卡加速编译 发布:2025-03-16 07:28:53 浏览:683
javadebug 发布:2025-03-16 07:16:21 浏览:284
怎么搭建linux服务器ftp 发布:2025-03-16 07:07:38 浏览:989
芯片存储原理 发布:2025-03-16 06:58:21 浏览:284
c语言中的整型 发布:2025-03-16 06:40:48 浏览:184