ITPub博客

首页 > Linux操作系统 > Linux操作系统 > 动态SQL的学习

动态SQL的学习

原创 Linux操作系统 作者:csweiliang 时间:2009-09-22 14:09:37 0 删除 编辑
 ---下面是本人在学习中遇到的动态SQL在这里记录一下:

giti_get_avg_pkg

/*均匀性计算加权平均数和平均数*/

   ----------------------------------------------------

   FUNCTION get_avg(p_column    IN VARCHAR

                   ,p_date      IN VARCHAR

                   ,p_item_code IN VARCHAR

                   ,p_fac_flag  IN NUMBER) RETURN NUMBER IS

      RESULT      NUMBER;

      l_count     NUMBER;             --计算:记录行数

      l_fz        NUMBER := 0; --计算:分子

      l_test_date VARCHAR2(100);

      l_item_code VARCHAR2(100);

      l_fac_flag  NUMBER;

      l_column    VARCHAR2(100);

      -- l_column2   VARCHAR2(100);

      l_sigma  NUMBER;

      l_sqlstr VARCHAR2(1000);

         --动态游标的第一步:定义游标变量

      TYPE my_cursor IS REF CURSOR;

      my_cur my_cursor;

  

   BEGIN

      l_test_date := p_date;

      l_item_code := p_item_code;

      l_fac_flag  := p_fac_flag;

      l_column    := p_column;

      -----------------计算记录行数------------------

      --INTO l_count

      /*  l_sqlstr := 'SELECT COUNT(*)

       FROM bg_jy_quality_v bdq

      WHERE bdq.test_date = to_date(''' || :test_date || ''', ''yyyy - mm - dd'')

      AND bdq.item_code =''' || p_item_code || '''

      AND bdq.organization_id = nvl(''' || p_fac_flag || ''', bdq.organization_id)

      AND ''' || l_column2 || '''IS NOT NULL';*/

  

                

     l_sqlstr := ' SELECT COUNT(*) ' || ' FROM  bg_jy_quality_v t ' ||

                  ' WHERE t.test_date       = to_date(''' || l_test_date || ''',''yyyy-mm-dd'') ' ||

                  ' AND   t.item_code       = ''' || l_item_code || '''' ||

                  ' AND   t.organization_id = nvl(:3, t.organization_id) ' ||

                  ' AND '|| l_column || ' IS NOT NULL ' ;            

   --单行查询时候用:

      EXECUTE IMMEDIATE l_sqlstr

         INTO l_count

         USING l_fac_flag;

  

      ------------计算平均数----------------------------

      IF l_count = 0 THEN

         RESULT := 0;

      ELSE

         /*l_test_date := p_date;

         l_item_code := p_item_code;

         l_fac_flag  := p_fac_flag;

         l_column    := p_column;*/

            ----打开游标

         OPEN my_cur FOR 'SELECT  ' || l_column || '

              FROM gt.bg_jy_quality_V t

              WHERE t.test_date = to_date(''' || l_test_date || ''', ''yyyy-mm-dd'')

              AND t.item_code = ''' || l_item_code || ''' AND t.organization_id = ' ||            l_fac_flag;

     

         LOOP

               --循环提取数据

            FETCH my_cur

               INTO l_sigma;

            EXIT WHEN my_cur%NOTFOUND;

            l_fz := l_fz + nvl(l_sigma, 0);

         END LOOP;

         RESULT := l_fz / l_count;

      END IF;

           ---关闭游标变量

      RETURN RESULT;

   EXCEPTION

      WHEN OTHERS THEN

         RETURN 0;

   END;

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/13996372/viewspace-615305/,如需转载,请注明出处,否则将追究法律责任。

上一篇: EBS报表
下一篇: XMLP 学习
请登录后发表评论 登录
全部评论

注册时间:2009-05-09

  • 博文量
    23
  • 访问量
    39992