Oracle动态SQL语句

动态SQL返回游标:

create or replace procedure proc_ValidityDueQuery(
     p_regioncode in number,
     p_pscode in number,
     p_outputcode in number,
     p_pollutantType in number,
     p_psclasscode in varchar2,
     p_attencode in varchar2,
     p_checkstatus in number,
     p_auditstatus in number,
     p_cursor out curdata
  )
  as
  begin
     open p_cursor for
     'select bs.regioncode,
             bs.regionname,
             bs.pscode,
             bs.psname,
             bs.outputcode,
             bs.outputname,
             bs.ptype,
             bd.chkname,
             bd.approvename,
             bd.pollutantname,
             case when ((bd.maxvalidtill - sysdate) > 0 and (bd.maxvalidtill - sysdate) <= 7) then ''yellow''
                  when (sysdate - bd.maxvalidtill) > 0 then ''red''
             end color,
             case when bs.ptype = 1 then ''水'' when bs.ptype = 2 then ''气'' end pstype,
             bd.auddate,
             to_char(bd.maxvalidtill, ''yyyy-MM-dd HH24:mi'') validtill
        from (select vb.regioncode,
                     vb.regionname,
                     vb.pscode,
                     vb.psname,
                     vo.outputcode,
                     vo.outputname,
                     vo.ptype
                from (select oregioncode regioncode, oregionname regionname, pscode, psname
                        from v_baseinfo
                       where 1 = 1
                         '|| case when p_regioncode >0 then 'and oregioncode='|| p_regioncode else '' end ||'
                         '|| case when p_pscode>0 then 'and pscode='|| p_pscode else '' end ||'
                         '|| case when p_psclasscode<>'0' then 'and psclasscodexc in ('|| p_psclasscode ||')' else '' end ||'
                         '|| case when p_attencode<>'0' then 'and attentiondegreecode in ('|| p_attencode ||')' else '' end ||'
                     ) vb,
                     (select pscode, outputcode, outputname, inout, psstatus, ptstatus, ptype
                        from v_output t
                       where psstatus = 0
                         and ismonitor = 1
                         and ptstatus = 0
                         '|| case when p_pscode>0 then 'and pscode='|| p_pscode else '' end ||'
                         '|| case when p_outputcode>0 then 'and outputcode='|| p_outputcode else '' end ||'
                         '|| case when p_checkstatus=1 then 'and isgjkh=1 or isskkh=1'
                                  when p_checkstatus=0 then 'and isgjkh=0 or isskkh=0'
                                  else ''
                             end || '
                         and ptype ='|| p_pollutantType ||'
                         '|| case when p_psclasscode<>'0' then 'and psclasscodexc in ('|| p_psclasscode ||')' else '' end ||'
                         '|| case when p_attencode<>'0' then 'and attentiondegreecode in ('|| p_attencode ||')' else '' end ||'
                     ) vo
               where vb.pscode = vo.pscode) bs,
        (select pscode, outputcode, pollutantname, pollutantcode,
                auddate,maxvalidtill, approvename, chkname
           from v_scenecommonite
          where checkresult=''1''
            '|| case when p_pscode>0 then 'and pscode='|| p_pscode else '' end ||'
            '|| case when p_outputcode>0 then 'and outputcode='|| p_outputcode else '' end ||'
            '|| case when p_auditstatus=1 then 'and ((maxvalidtill - sysdate) > 0 and (maxvalidtill - sysdate) <= 7)'
                     when p_auditstatus=2 then 'and maxvalidtill >= sysdate-90'
                     when p_auditstatus=3 then 'and sysdate>maxvalidtill'
                     else ''
                end ||'
        ) bd
       Where bs.pscode=bd.pscode
         and bs.outputcode=bd.outputcode
       order by bd.maxvalidtill desc, bs.regioncode, bs.pscode, bs.outputcode';
   end proc_ValidityDueQuery; 

2.动态创建临时表

--创建临时表
--判断是否存在
select count(*)
  into v_num
  from user_tables
 where table_name=upper('zstemptable');
--如果不存在则创建
if v_num=0 then
   execute immediate 'create global temporary table zstemptable(id number(1),reviseddata number(20,6))
          on commit preserve rows';
end if;
--插入数据
execute immediate 'insert into zstemptable
    select 1,RevisedStrength
      from (select RevisedStrength
              from t_mod_gasfachourdata
             where pscode = '|| p_pscode ||'
               and outputcode = '|| p_outputcode ||'
               and pollutantCode = '''|| p_pollutantcode ||'''
               and monitorTime < to_date('''|| p_recordTime ||''',''yyyy-MM-dd HH24:mi:ss'')
               and availableStatus = 0
             order by MonitorTime desc)
     where rownum = 1';
--查询数据
execute immediate 'select count(*) from zstemptable where id=1' into v_hisstrength;
--清除表信息
execute immediate 'truncate table zstemptable';
时间: 2024-08-27 08:16:33

Oracle动态SQL语句的相关文章

Oracle 动态SQL语句

Oracle 动态SQL语句 (2012-06-18 16:36:12) 转载▼ 标签: oracle it   EXECUTE IMMEDIATE代替了以前Oracle8i中DBMS_SQLpackage包. 它解析并马上执行动态的SQL语句或非运行时创建的PL/SQL块.动态创建和执行SQL语句性能超前,EXECUTEIMMEDIATE的目标在于减小企业费用并获得较高的性能,较之以前它相当容易编码.尽管DBMS_SQL仍然可用,但是推荐使用EXECUTEIMMEDIATE,因为它获的收益在包

使用Oracle的DBMS_SQL包执行动态SQL语句

使用Oracle的DBMS_SQL包执行动态SQL语句 引用自:http://blog.csdn.net/ggjjzhzz/archive/2005/10/17/507880.aspx 引用自:http://www.cnblogs.com/simonhaninmelbourne/archive/2013/01/23/2872438.html 在某些场合下,存储过程或触发器里的SQL语句需要动态生成.Oracle的DBMS_SQL包可以用来执行动态SQL语句.本文通过一个简单的例子来展示如何利用D

Oracle基础 动态SQL语句

一.静态SQL和动态SQL的概念. 1.静态SQL 静态SQL是我们常用的使用SQL语句的方式,就是编写PL/SQL时,SQL语句已经编写好了.因为静态SQL是在编写程序时就确定了,我们只能使用SQL中的DML和事务控制语句,但是DDL语句,以及会话控制语句却不能再PL/SQL中直接使用,如动态创建表或者某个不确定的操作时,这就需要动态SQL来实现. 2.动态SQL 动态SQL是指在PL/SQL编译时SQL语句是不确定的,如根据用户输入的参数的不同来执行不同的操作.编译程序对动态语句部分不进行处

MyBatis学习(三)、动态SQL语句

三.动态SQL语句 有些时候,sql语句where条件中,需要一些安全判断,例如按某一条件查询时如果传入的参数是空,此时查询出的结果很可能是空的,也许我们需要参数为空时,是查出全部的信息.使用Oracle的序列.mysql的函数生成Id.这时我们可以使用动态sql. 下文均采用mysql语法和函数(例如字符串链接函数CONCAT). 3.1 selectKey 标签 在insert语句中,在Oracle经常使用序列.在MySQL中使用函数来自动生成插入表的主键,而且需要方法能返回这个生成主键.使

MyBatis学习 之 四、动态SQL语句

有些时候,sql语句where条件中,需要一些安全判断,例如按某一条件查询时如果传入的参数是空,此时查询出的结果很可能是空的,也许我们需要参数为空时,是查出全部的信息.使用Oracle的序列.mysql的函数生成Id.这时我们可以使用动态sql. 下文均采用mysql语法和函数(例如字符串链接函数CONCAT). 3.1 selectKey 标签 在insert语句中,在Oracle经常使用序列.在MySQL中使用函数来自动生成插入表的主键,而且需要方法能返回这个生成主键.使用myBatis的s

MyBatis学习 之 三、动态SQL语句

有些时候,sql语句where条件中,需要一些安全判断,例如按某一条件查询时如果传入的参数是空,此时查询出的结果很可能是空的,也许我们需要参数为空时,是查出全部的信息.使用Oracle的序列.mysql的函数生成Id.这时我们可以使用动态sql. 下文均采用mysql语法和函数(例如字符串链接函数CONCAT). 3.1 selectKey 标签 在insert语句中,在Oracle经常使用序列.在MySQL中使用函数来自动生成插入表的主键,而且需要方法能返回这个生成主键.使用myBatis的s

动态SQL语句

动态SQL语句不仅是指SQL语句是动态拼接而成的,更主要的是SQL语句所使用的对象也是在运行时期才能创建的. 动态SQL语句基础 create or replace function get_tablecount(table_name in varchar2) return pls_integer is sql_query varchar2(32767):='select count(*) from'||table_name; l_return  pls_integer; begin execu

Oracle Prc C学习 之 Oracle动态SQL

在这里我先说遇到的一个问题 在练习的例子中加入了头文件 #include <oraca.h> 然后我怎么编译都不行,一直说找不到oraca.h 然后我把这个改成了 EXEC SQL INCLUDE oraca; 这样就顺利的编译过去了. 第一种动态SQL语句:无宿主变量的非查询语句 应用程序接收外界输入构造SQL 语句到一个字符串,然后调用EXECUTE IMMEDIATE 命令执行这个SQL 语句.这种SQL 语句不能为SELECT 语句,不能包含输入变量的占位符. 5.pc #includ

MyBatis 源码分析——动态SQL语句

有几年开发经验的程序员应该都有暗骂过原生的SQL语句吧.因为他们不能一句就搞定一个业务,往往还要通过代码来拼接相关的SQL语句.相信大家会理解SQL里面的永真(1=1),永假(1=2)的意义吧.所以mybatis动态SQL功能在笔者看来是最引吸人的.为了更好的区别XML映射文件上的SQL语句.mybatis把SQL语句分为四类.那么这个笔者已经在前面的章节里面讲过了.但是我们在开发过程中常常用到的也就俩种:静态和动态. 关于静态和动态的定义,笔者是这样子理解的--静态SQL语句显示就是里面没有相