2

如何从 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呢?

4

4 回答 4

2

这是我已经证明的一个例子,它可能会对你有所帮助......

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,只需将它添加到 PGAdmin 中的 SQL 编辑器(指向你的数据库)中,执行之后,这个函数必须像这样可用select average(ARRAY[4.5,3.2,7.0]);

在 Rails 控制台中,我尝试了这样的示例:

_calificaciones = Calificacion.all(:conditions => ["promedio_parciales != average(array[parcial1,parcial2,parcial3])"])

它对我来说很好......祝你好运......

于 2013-03-15T18:39:14.907 回答
2

就像其他人所说的那样,类似于:

result = connection.execute ("SELECT add_org_pincode(#{user_id}, #{org_id}, #{amount}, #{pincode_id};")
于 2012-05-08T15:11:34.987 回答
1

你可以直接去 ActiveRecord::Base.connection 执行 SQL ,这是我为一些原型代码所做的......

result = ActiveRecord::Base.connection.execute("SELECT * FROM stock_hourly_performance(#{stock_id})")

我不知道它是否是解决问题的最佳方法,但它让我开始运行。

于 2012-05-08T13:42:25.687 回答
0

您可以使用以下命令执行原始 SQL:

ActiveRecord::Base.connection.execute('SQL goes here')

确保绝对有必要绕过 ActiveRecord(Rail 的 ORM)。

于 2012-05-08T13:42:44.120 回答