有一个应用,通过B/S的DropDownList值获取年月日,在B/S里做了ToString格式化。
那么在SP里定义的IN变量,该定义成什么类型(VarChar或Date)?B/S传入的值有开始日期时间、结束日期时间、开始月份、结束月份,
所写SP需要通过该月份跨度组合表名(AAA+月份),循环到对应的表中(如1月~3月就到AAA1、AAA2和AAA3表中)查询相关符合条件的记录数、并进行加和运算。
这里的表名预计采用变量的形式,这类查询该如何做?

解决方案 »

  1.   

    都可以,若定义成varchar类型则在procedure内部做格式转换,将字符串换成date类型。若定义成Date类型则在调用procedure前使用程序转,比如java中将其转换成java.sql.Date类型。不过看描述使用第一种方式更好,将月份以varchar2传入,之后和aaa拼接成表名,使用动态sql查询。v_tbl_name := 'AAA'||v_in_mon;v_sql := 'select * from '||v_tbl_name;execute immediate v_sql;
      

  2.   

    1 那么在SP里定义的IN变量,该定义成什么类型(VarChar或Date)?和普通编程一样,对于你的参数的传递,参数和你最后处理的方式一致就可以了,也就是你这里如果是varchar的话,在sp里最后使用的时候,如果需要转日期就用to_date转换一下,同样如果你是date,想转成varchat的话就用to_char转一下。一致就可以了。2. 这里的表名预计采用变量的形式,这类查询该如何做?
    由于表名是sql里的静态部分,是不能用变量代替的,所以你这里需要用动态游标或者是动态sql来进行处理按你这里的需求,可能一个aaa1返回有多条记录,而且需要对返回的记录进行处理。所以这里ls这样的
    v_sql := 'select * from '||v_tbl_name; 
    execute immediate v_sql;
    的方式,在你这里略显单薄,需要加强一下
    加上into语句把结果选择到结果里,但是into只能单条记录,而只能用类似下面的bulk into叻
    execute immediate 'sql' bulk collect into indexed_var这里还可以使用动态游标,这个就更方便和强大了。declare
    type T_CUR is REF CURSOR;
    cur T_CUR;
    begin
    open cur for 'select  * from AAA'||1;
    ---和普通游标一样fetch来操作。
    close cur;
    end;
    /