如何在Ruby on Rails中调用存储过程?

3

我是ROR的新手。我想在点击VIEW中的提交按钮时调用存储过程进行处理。

    Model:
    -------

    class Pro::DataImport < ActiveRecord::Base
      attr_accessible :file_name, :process_name, :updated_by, :validates

    end

    Controller:
    -----------------

    class Pro::DataImportsController < ApplicationController
       before_filter :authenticate_user!
      layout "layouts/enr/energy_master"

      def index
       @pro_data_imports = Pro::DataImport.all 
      end

      def new
        @pro_data_import = Pro::DataImport.new
      end

    end

    View
    ----------

     <%= form_for @pro_data_import do %>

  <div class="field">
    Browse the file to upload:<br />
    <%= file_field_tag ':file_name' %>
  </div>

  <div class="actions">
    <%= submit_tag 'Import File' %>
  </div>
<% end %>


    Stored Proc
    ---------------

    ALTER PROCEDURE "DBA"."my_enr_test"(file_name long varchar)
    BEGIN
        INSERT INTO DBA.pro_data_imports(file_name) values(file_name);
    END

谢谢您提前的支持。请帮我一下。我想从上传按钮获取文件路径并将其存储到数据库列file_name中。如何执行submit按钮的存储过程。请帮帮我!

2个回答

9
如果您使用的是ActiveRecord SQLServer适配器,请查看:

http://rubydoc.info/gems/activerecord-sqlserver-adapter/3.2.9/ActiveRecord/ConnectionAdapters/Sqlserver/DatabaseStatements:execute_procedure

在你的代码中做类似这样的事情。
class Pro::DataImport < ActiveRecord::Base
  def self.update(user)
    self.execute_procedure("Stored Procedure Name", arg1, arg2)
  end
end

每个普通的SQL查询都会被转换成存储过程来执行。这就是ActiveRecord为SQL Server提供的适配器的工作方式。因此,你只需要关心在数据库中定义的永久存储过程。

是的,我正在使用 SQL Server 适配器。但问题是它在视图页面中显示错误... - Sri
尝试将 connection.execute("my_enr_test") 替换为 ActiveRecord::Base.execute_procedure(:my_enr_test)。 - Unixmonkey
你好,我编辑了这个问题。现在它很简单。请告诉我如何将我的存储过程连接到提交按钮上。当我点击按钮时,它会调用存储过程并将文件路径获取到数据库中的file_name列中。谢谢。 - Sri
我会从一个简单的概念验证开始,逐步构建到文件上传。通常情况下,您的控制器中会定义两个操作:updatecreate。这些操作将接收表单提交响应。在这些操作中,您可以让代码执行存储过程。 - Teddy

0
# PL/SQL records or object type parameters should be passed as Hash

p_employee = { :employee_id => 1, :first_name => 'First', :last_name => 'Last', :hire_date => Time.local(2000,01,31) }
 plsql.test_full_name(p_employee)

# test_full_name is procedure name in oracle
# p_employee holds parameter list 
#employee_id is first param defined in stored procedure

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接