zoukankan      html  css  js  c++  java
  • postgresql 函数demo

    create or replace function refresh_product_usage() returns void as  $$
    declare
    	rec record;
    	sub_rec record;
    	init_pro_id integer;
    	parent_product_id integer;
    	now_bom_id integer;
    	total_product_qty float;
    	cinsider_efficiency boolean:=true;
    	
    begin
            TRUNCATE TABLE  product_usage;  
    	for rec in select id,bom_id,product_id,product_qty,product_efficiency from mrp_bom where bom_id is not null loop
    		now_bom_id:=rec.bom_id;
    		total_product_qty:= rec.product_qty;
    		if cinsider_efficiency then
    			total_product_qty = total_product_qty/rec.product_efficiency;
    		end if;
    		loop	
    			for sub_rec in select product_id as parent_product_id from mrp_bom where id =now_bom_id loop
    				parent_product_id:=sub_rec.parent_product_id;
    			end loop;
    
    			if not exists(select id from mrp_bom where bom_id is not null and product_id = parent_product_id ) then --(no record)-->root bom
    				if exists(select id from product_usage where bom_id = now_bom_id and product_id = rec.product_id) then
    					update product_usage set product_qty = product_qty + total_product_qty where  bom_id = now_bom_id and product_id = rec.product_id;
    				else
    					insert into product_usage(bom_id,product_id,product_qty) values(now_bom_id, rec.product_id, total_product_qty);
    				end if;
    				exit;
    			else
    				for sub_rec in select bom_id,product_qty,product_efficiency from mrp_bom where bom_id is not null and product_id = parent_product_id limit 1 loop
    					now_bom_id:=sub_rec.bom_id;
    					total_product_qty = total_product_qty* sub_rec.product_qty;
    					if cinsider_efficiency then
    						total_product_qty = total_product_qty/sub_rec.product_efficiency;
    					end if;
    				end loop;
    			end if;
    								
    		end loop;
    		
    	end loop;
    end;
    $$ LANGUAGE plpgsql;
    

     

    实际上,本来打算只写一个sql代码块,也就是只要以下部分:

    declare
    	rec record;
    	sub_rec record;
    	init_pro_id integer;
    	parent_product_id integer;
    	now_bom_id integer;
    	total_product_qty float;
    	cinsider_efficiency boolean:=true;
    	
    begin
            TRUNCATE TABLE  product_usage;  
    	for rec in select id,bom_id,product_id,product_qty,product_efficiency from mrp_bom where bom_id is not null loop
    		now_bom_id:=rec.bom_id;
    		total_product_qty:= rec.product_qty;
    		if cinsider_efficiency then
    			total_product_qty = total_product_qty/rec.product_efficiency;
    		end if;
    		loop	
    			for sub_rec in select product_id as parent_product_id from mrp_bom where id =now_bom_id loop
    				parent_product_id:=sub_rec.parent_product_id;
    			end loop;
    
    			if not exists(select id from mrp_bom where bom_id is not null and product_id = parent_product_id ) then --(no record)-->root bom
    				if exists(select id from product_usage where bom_id = now_bom_id and product_id = rec.product_id) then
    					update product_usage set product_qty = product_qty + total_product_qty where  bom_id = now_bom_id and product_id = rec.product_id;
    				else
    					insert into product_usage(bom_id,product_id,product_qty) values(now_bom_id, rec.product_id, total_product_qty);
    				end if;
    				exit;
    			else
    				for sub_rec in select bom_id,product_qty,product_efficiency from mrp_bom where bom_id is not null and product_id = parent_product_id limit 1 loop
    					now_bom_id:=sub_rec.bom_id;
    					total_product_qty = total_product_qty* sub_rec.product_qty;
    					if cinsider_efficiency then
    						total_product_qty = total_product_qty/sub_rec.product_efficiency;
    					end if;
    				end loop;
    			end if;
    								
    		end loop;
    		
    	end loop;
    end;
    

     

    但奇怪的是会报很多莫名其妙的语法错误:

    貌似无法识别很多诸如 record / open 之类的关键字。

    郁闷之下写了个函数。

    postgresql 用于sql debug输出可以用:raise notice 'your_message;%s'%your_message_var

    然后游标的概念弱化了,与其用cursor,不如直接用 for rec in select .... loop  ....  end loop;

    有点小遗憾没有找到从结果集里直接赋值的方法。

    动态执行sql语句使用DO/EXECUTE

  • 相关阅读:
    2.12 使用@DataProvider
    2.11 webdriver中使用 FileUtils ()
    Xcode8 添加PCH文件
    The app icon set "AppIcon" has an unassigned child告警
    Launch Image
    iOS App图标和启动画面尺寸
    iPhone屏幕尺寸、分辨率及适配
    Xcode下载失败 使用已购项目页面再试一次
    could not find developer disk image
    NSDate与 NSString 、long long类型的相互转化
  • 原文地址:https://www.cnblogs.com/Tommy-Yu/p/4061685.html
Copyright © 2011-2022 走看看