Oracle存储过程执行动态sql

来源:互联网 发布:喜马拉雅无法使用网络 编辑:程序博客网 时间:2024/05/29 17:53

create or replace PROCEDURE systemxm(starttime VARCHAR2,

shendtime VARCHAR2,

gxstarttime VARCHAR2,

gxendtime VARCHAR2,

 v_Num OUT VARCHAR2)
AS
  v_succeed VARCHAR2(1000);
  v_fail    VARCHAR2(1000);
  v_sql     VARCHAR2(1000);--动态sql条件
  v_jj       VARCHAR2(1000);
  v_sql_where_str varchar(4000);--动态sql   
BEGIN
  v_sql:='';
 if(starttime is not null) then
     v_sql:=v_sql||' and a.CREATED >= to_date('||starttime||',''yyyy-MM-dd'' )';
  end if;
   if(shendtime is not null) then
    v_sql:=v_sql||' and a.CREATED <= to_date('||shendtime||',''yyyy-mm-dd'' )+1';
  end if;
   if(gxstarttime is not null) then
    v_sql:=v_sql||' and a.item_Employ >= to_date('||gxstarttime||',''yyyy-mm-dd'' )';
  end if;
   if(gxendtime is not null) then
    v_sql:=v_sql||' and a.item_Employ <= to_date('||gxendtime||',''yyyy-mm-dd'')+1';
  end if;
    dbms_output.put_line(v_sql);--输出参数值
  v_Num:='';
  DECLARE
    --类型定义
    CURSOR c_job
    IS
      SELECT item_code FROM tlk_system_dic;
    --定义一个游标变量v_cinfo c_emp%ROWTYPE ,该类型为游标c_emp中的一行数据类型
    c_row tlk_system_dic.item_code%type;
  BEGIN
    FOR c_row IN c_job
    LOOP
    v_sql_where_str:='SELECT COUNT( b.item_name),
        b.item_name
      FROM tlk_P_ExpertRegister a
      INNER JOIN tlk_system_dic b
      ON b.item_code='''||c_row.item_code
      ||''' WHERE a.item_Account =2 and  a.item_jszVal LIKE ''%'||c_row.item_code||'%'''
     ||v_sql||' GROUP BY b.item_name';
    DBMS_OUTPUT.PUT_LINE('output:'||v_sql_where_str );   --監視SQL語句
    execute immediate v_sql_where_str   INTO v_succeed,
        v_fail; --执行SQL 
      v_Num:=v_Num||';'||v_succeed||','||v_fail;
    END LOOP;
    --抛出异常
  EXCEPTION
  WHEN NO_DATA_FOUND THEN
    v_fail    := 0;
    v_succeed := 0;
  END;
  dbms_output.put_line(v_Num);
END;
1 0
原创粉丝点击