oracle动态sql查询
‘壹’ oracle 动态sql是否可以用子查询呢请帮忙解答!
可以,例
--创建TTT表
CREATE TABLE TTT AS SELECT LEVEL ID FROM DUAL CONNECT BY LEVEL<100;
--创建SUB_TTT表
CREATE TABLE SUB_TTT AS SELECT 1 ID,'A' DOC FROM DUAL UNION SELECT 2 ID,'B' DOC FROM DUAL UNION SELECT 3 ID,'C' DOC FROM DUAL;
--在SUB_TTT表中计算ID小于指定值的个数,并且这些ID要在TTT表中出现
DECLARE
CNT NUMBER := 0;
SQL_STR VARCHAR2(100) := 'SELECT COUNT(1) CC FROM SUB_TTT A WHERE EXISTS(SELECT 1 FROM TTT B WHERE A.ID=B.ID AND B.ID<:ID)';
BEGIN
EXECUTE IMMEDIATE SQL_STR
INTO CNT
USING 5;
DBMS_OUTPUT.PUT_LINE(CNT);
END;
‘贰’ 如何在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;
procere
test_proc
(v_table
varchar2,t_cur
out
cur_typ);
end;
/
create
or
replace
package
body
test_pkg
is
procere
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
‘叁’ Oracle sql语句查询动态日期区间里的数据
select * from tb
where scbj=0 and sj between sysdate-14 and sysdate
‘肆’ oracle 存储过程执行动态sql实例
oracle的动态sql是指在语句块使用execute immediate 执行sql语句,sql语句可以使用存储过程传的参数进行拼接,本文针对varchar2和number两种类型的参数类型,进行sql拼接并执行。
功能:输入日期区间,销售数量满足上限和下限的产品id
1.正常传值
输出结果
2.若果number类型的参数传空,会报ora-00936:缺失表达式,可以在存储过程中增加对参数null值的判断
oracle 动态拼接传入参数,varchar2类型可以使用'''|| IN_START_DTIME || ''' ,number类型可以使用'||IN_DOWN_LIMIT||' ; 拼接的过程需要注意校验参数的合法性,增加存储过程的容错性。临时表使用了会话级,存储过程执行完,可以通过查询存储过程获取结果。
‘伍’ oracle 动态sql是什么意思
个人理解动态sql就是在sql语句中存在变量,根据变量的不同组合成各种条件的sql语句。比如一个循环里面有一个查询,这个循环的内容应用在这个查询中,那么这个查询一定会有一个变量,而这个电邮变量的sql语句,就叫做动态sql。
‘陆’ oracle的动态查询和sql server的动态查询有什么区别
DECLARE
strsqlVARCHAR2(100):=‘SELECT*FROMempWHEREempno=7788‘;
emp_recordemp%ROWTYPE;
BEGIN
EXECUTEIMMEDIATEstrsqlINTOemp_record;
dbms_output.put_line(姓名:||emp_record.ename||,岗位:||emp_record.job);
END;
以上是Oracle的动态sql语法
而SQLServer一般使用的是sp_executesql 函数,它可以执行动态的修改,查询,删除功能。
Sp_executesql:执行可以多次重复使用或动态生成的Transact-SQL语句或批处理。Transact-SQL语句或批处理可以包含嵌入参数。
语法:
sp_executesql[@statement=]statement
[
{,[@params=]N'@parameter_namedata_type[OUT|OUTPUT][,...n]'}
{,[@param1=]'value1'[,...n]}
]
‘柒’ 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