如何从Ruby on Rails应用程序调用plpgsql函数?
这是函数定义:
CREATE OR REPLACE FUNCTION add_org_pincode(i_user_id integer, i_org_id integer, i_amount numeric, i_pincode_id integer)
RETURNS integer AS
$BODY$
Declare
v_org_balance numeric;
Begin
Select o.balance
Into Strict v_org_balance
From organizations o
Left Join organizations d On o.parent_organization_id = d.id
Where o.id = i_org_id
For Update Of o;
--
Insert Into org_balance_transactions(organization_id, balance, amount_added, reason, action_user_id, transaction_id)
Values (i_org_id, v_org_balance, i_amount, 10, i_user_id, i_pincode_id);
--
Update organizations
Set balance = balance + i_amount
Where id = i_org_id;
-- Other error
Return 0;
End;$BODY$
LANGUAGE 'plpgsql' VOLATILE;
那么,我该如何致电add_org_pincode
?
答案 0 :(得分:2)
就像其他人所说的那样,类似于:
result = connection.execute ("SELECT add_org_pincode(#{user_id}, #{org_id}, #{amount}, #{pincode_id};")
答案 1 :(得分:1)
您可以直接访问ActiveRecord :: Base.connection来执行SQL which is what I did以获取一些原型代码......
result = ActiveRecord::Base.connection.execute("SELECT * FROM stock_hourly_performance(#{stock_id})")
我不知道它是否是问题的最佳解决方案,但它让我开始运作。
答案 2 :(得分:1)
这是我已经证实的一个例子,它可能对你有所帮助......
CREATE LANGUAGE plpgsql;
/**PROMEDIOS**/
CREATE OR REPLACE FUNCTION average(valores NUMERIC[],OUT prom NUMERIC) AS $$
DECLARE
element_count INT4;
sum numeric := 0.0;
BEGIN
element_count := array_upper(valores, 1) - array_lower(valores, 1) +1;
FOR i IN array_lower(valores, 1) .. array_upper(valores, 1)
LOOP
sum := sum + valores[i];
END LOOP;
prom := trunc(sum/element_count,1);
END;
$$ LANGUAGE plpgsql;
显然你必须在你的数据库中执行这个SQL,只需将它添加到你的SQL编辑器(指向你的数据库)PGAdmin中,执行之后,这个函数必须像select average(ARRAY[4.5,3.2,7.0]);
一样可用。
在Rails控制台中,我尝试了这样的示例:
_calificaciones = Calificacion.all(:conditions => ["promedio_parciales != average(array[parcial1,parcial2,parcial3])"])
它对我来说很好......祝你好运......
答案 3 :(得分:0)
您可以使用以下命令执行原始SQL:
ActiveRecord::Base.connection.execute('SQL goes here')
确保绝对有必要绕过ActiveRecord(Rail的ORM)。