2012-05-08 28 views
2

Ruby on Railsアプリケーションからplpgsql関数を呼び出す方法は?Ruby on railから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

いくつかのより多くの議論についてはこちらをご覧ください: HTTP ://stackoverflow.com/questions/10343988/how-to-make-attribute-setter-send-value-through-sql-function/10389074 –

答えて

1

がに、似た何かを言っている:これは私が証明されている例である

result = connection.execute ("SELECT add_org_pincode(#{user_id}, #{org_id}, #{amount}, #{pincode_id};") 
+3

EwwをSQLクエリに補間する...安全ではありません。 –

0

あなたは、いくつかのプロトタイプのコードのためのSQL which is what I didを実行するためにはActiveRecord :: Base.connectionにまっすぐに行くことができる...

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

問題に対する最善の解決策が、それは得た場合、私は知りません私は稼働している。

+1

これを行うSQLインジェクションに注意してください。クエリをパラメータ化できない場合は、すべての入力をエスケープし、その型を検証して安全にする必要があります。 – Lee

0

あなたはとの生のSQLを実行することができます:ActiveRecordは(レールのORM)をバイパスすることが絶対に必要であることを確認してください

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

。他の人のように

0

、それはあなたを助けるかもしれない...

明らか
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])"]) 

、それは私のためにうまく働いた...

関連する問題