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 Consoleで、次のような例を試しました。

_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 に答える