`
wuhuizhong
  • 浏览: 682513 次
  • 性别: Icon_minigender_1
  • 来自: 中山
社区版块
存档分类
最新评论

RoR 調用 Oracle Function/Procedure

    博客分类:
  • ROR
阅读更多

1.簡單的例子:

 

=begin
--創建Oracle Function
create or replace function FUN_TEST(P_STR VARCHAR2) return varchar2 is
  Result varchar2(100);
begin
  Result := P_STR||'-OK! FUNCTION EXECUTED.';
  return(Result);
end FUN_TEST;
=end

require 'oci8'

conn = OCI8.new("hr","hr","192.168.0.1/sid")
cursor = conn.parse <<-EOS
BEGIN
  :return := FUN_TEST(:p_string);
END;
EOS
cursor.bind_param(':p_string',"xxx",String)
cursor.bind_param(':return',nil,String,4000)
cursor.exec
puts cursor[':return']
cursor.close

 

2.Module 的例子: 

# activerecord.rb: Using ActiveRecord, the ORM module
require 'rubygems'
require 'active_record'

# Establish a connection to Oracle
ActiveRecord::Base.establish_connection(
	:adapter => "oci",
	:host    => '192.168.0.1/sid',
	:username => 'hr',
	:password => 'password' )
	
module SQLStatement

class NoTypeResult < StandardError
end # class

class SQLProc

attr_reader :outs
attr_accessor :name, :arguments

def initialize( args = nil )
@name = args[:name] unless args[:name].nil?
@arguments = args[:arguments] unless args[:arguments].nil?
@conn = ActiveRecord::Base.connection.raw_connection
end # def initialize

def exec( args = nil )
unless args.nil? || ( !args.is_a? Hash )
args.each { |k, v| @arguments[k.to_s.intern] = args[k] }
end # unless
func_args = ''
@arguments.each { |k, v| func_args += "#{func_args == '' ? '' : ', '}#{k.to_s} => :#{k.to_s}"}
sql = "BEGIN #{@name}( #{func_args} );END;"
cursor = @conn.parse( sql )
@arguments.each do |k, v|
cursor.bind_param( ":#{k.to_s}", v)
end # each
cursor.exec()
#outs
@outs = []
@arguments.each do |k, v|
  @outs <<  cursor[":#{k.to_s}"]
end # each
cursor.close
end # def exec

end # class SQLProc

class SQLFunc < SQLProc

attr_reader :result
attr_accessor :result_type,:result_length

def initialize( args = nil )
  @result_type = args[:result_type] unless args[:result_type].nil?
  @result_length = args[:result_length] unless args[:result_length].nil?
  super( args )
end # def

def exec( args = nil )
if @result_type.nil?
raise NoTypeResult, 'No type for result setting', caller
end # if
unless args.nil? || ( !args.is_a? Hash )
args.each { |k, v| @arguments[k.to_s.intern] = args[k] }
end # unless
func_args = ''
@arguments.each { |k, v| func_args += "#{func_args == '' ? '' : ', '}#{k.to_s} => :#{k.to_s}"}
sql = "BEGIN :result := #{@name}( #{func_args} );END;"
cursor = @conn.parse( sql )
@arguments.each do |k, v|
cursor.bind_param( ":#{k.to_s}", v )
end # each
#cursor.bind_param( ":result", nil, @result_type )
#cursor.bind_param(":result",Fixnum)
#cursor.bind_param( ":result", nil, String,100 )
cursor.bind_param( ":result", nil, @result_type,@result_length )
cursor.exec()
@result = cursor[':result']
cursor.close
end # def exec

end # class

end # module SQLStatment

#Example of use:
=begin
CREATE OR REPLACE PROCEDURE pro_test(p1 in varchar2, p2 out varchar2) is
BEGIN
  select p1 || '-OK! PROCEDURE EXECUTED.' into p2 from dual;
end pro_test;
=end
puts 'Example of procedure:'
procedure= SQLStatement::SQLProc.new(
:name => 'pro_test',
:arguments => {
:p1 =>'ruby call',
:p2 =>' '*100}
)
procedure.exec
puts procedure.outs[1]

=begin
create or replace function FUN_TEST(P_STR VARCHAR2) return varchar2 is
  Result varchar2(100);
begin
  Result := P_STR||'-OK! FUNCTION EXECUTED.';
  return(Result);
end FUN_TEST;
=end
puts 'Example of function:'
function = SQLStatement::SQLFunc.new(
:name => 'fun_test',
:result_type => String,
:result_length => 100,
:arguments => {
:p_str =>'ruby call'}
)
function.exec
#raise function.result.inspect 
puts function.result

 

3.應用的例子:

第一步:創建應用(ROR)

rails app

第二步:配置資料連接(ROR)

#database.yml
development:
  adapter: oci
  host: (DESCRIPTION =(ADDRESS_LIST =(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.0.1)(PORT = 1521)))(CONNECT_DATA = (SERVICE_NAME = MYDB.MYDOMAIN.COM)))
  username: scott
  password: tiger

第三步:創建存儲過程(Oracle)

--Stored_proc.pks:
CREATE OR REPLACE PACKAGE stored_proc AS
  type row_type is record (
     name emp.ename%type,
     job emp.job%type
     );
TYPE table_type IS TABLE OF row_type;

procedure stored_proc(p_empno IN emp.empno%type, p_arr OUT table_type);
END stored_proc;
/

--Stored_proc.pkb:
CREATE OR REPLACE package body stored_proc as
procedure stored_proc(
          p_empno emp.empno%type
          , p_arr OUT table_type
          ) is
begin
     select 
     ename
     , job 
     BULK COLLECT 
      into p_arr
     from 
     emp 
     where emp.empno=p_empno; 
end;
end stored_proc;
/

 第四步:增加管道函數(Oracle)

create or replace function test_pipe(p_empno emp.empno%type default null) return stored_proc.table_type 
pipelined
is
v_arr stored_proc.table_type;
begin
    stored_proc.stored_proc(nvl(p_empno, 7369), v_arr);
         for i in v_arr.first..v_arr.last loop
              pipe row(v_arr(i));
         end loop;
         return;
end test_pipe;
/

 第五步:創建虛擬視圖(Oracle)

create or replace view samples(name, job)
as
select
    name
    , job 
    from
    table(test_pipe(null))
/

第六步:建構腳手架(ROR)

ruby script/generate controller sample
ruby script/generate model sample

 

第七步:修改控制器(ROR)

#/app/controllers/sample_controller 
class SampleController < ApplicationController
  scaffold :sample

  def sample
  sql="select name, job from table(test_pipe("+ params[:id] + "))" 
   unless params[:id].nil?
       samples=Sample.find_by_sql(sql)   
               @sample=samples[0]
   end
  end
end

第八步:創建模板(ROR)

app/views/sample/sample.rhtml

 

<h1> Name of party</h1>
<h2> <%= @sample.name+": "+ @sample.job %> </h2>

<FORM ACTION="" METHOD=GET>
<table>
    <tr><td>Party id:  </td><td><input type=text name=id></td></tr>
    <tr><td colspan=2><input type=submit value="go"></td></tr>
</table>
</form>

 

試一下:http://localhost:3000/sample/sample?id=7698

 

分享到:
评论

相关推荐

    使用ROR编写ORACLE WEB应用

    标题“使用ROR编写ORACLE WEB应用”表明我们要探讨的是如何使用Ruby on Rails(简称ROR)框架来构建与Oracle数据库交互的Web应用程序。Ruby on Rails是一个基于Ruby语言的开源Web开发框架,它遵循MVC(Model-View-...

    ROR绿色最新环境(2013/3/10)

    ROR环境 Ruby version 1.9.3 (java) RubyGems version 1.8.24 Rack version 1.4 Rails version 3.2.12 JavaScript Runtime therubyrhino (Rhino) Active Record version 3.2.12 Action Pack version 3.2.12 ...

    從 PL/SQL 中調用 ROR 创建的 Web 服务

    2. **创建 PL/SQL 包**:在 Oracle 数据库中,你可以创建一个包(package)来封装对 ROR API 的调用。包由包规范(specification)和包体(body)组成,其中包规范声明公共过程和函数,而包体则实现这些过程和函数的...

    在RHEL上安裝設置ROR(nginx+passenger+ruby+rails+oracle+netzke)

    在RHEL(Red Hat Enterprise Linux)系统上搭建Ruby on Rails(简称RoR)应用程序环境是一项技术性较强的任务,尤其当涉及到与其他服务如Nginx、Phusion Passenger、Ruby、Rails以及Oracle数据库集成时。以下是对这...

    Quest.Toad.for.Oracle.Xpert.v8.0-ROR

    Quest.Toad.for.Oracle.Xpert.v8.0-ROR 注册机,想必很多人想要吧

    RoR性能优化经验谈

    RoR(Ruby on Rails)是一种流行的开源Web开发框架,以其高效和简洁的代码著称。然而,随着网站规模的增长,性能优化成为必不可少的环节。在本文中,我们将探讨一些RoR性能优化的关键方面,主要基于JavaEye网站在...

    ror-api:ROR火

    单个组织记录由以下JSON结构表示: { "id":"https://ror.org/013cjyk83", "name":"PSL Research University", "email_address":null, "ip_addresses":[ ], "established":2010, "types":[ "Education" ], ...

    ror

    NULL 博文链接:https://xuxiangpan888.iteye.com/blog/266696

    RoR选题方向—源代码

    Ruby on Rails(RoR)是一种基于Ruby语言的开源Web应用程序框架,它遵循MVC(Model-View-Controller)架构模式,旨在简化Web开发过程。在这个选题方向中,我们主要探讨的是与RoR相关的源代码分析和学习。源代码是...

    ror中文资料

    **Ruby on Rails(简称RoR)中文资料** Ruby on Rails(RoR)是一个基于Ruby编程语言的开源Web应用框架,遵循MVC(Model-View-Controller)架构模式,旨在简化Web开发过程,提高开发效率。RoR强调“约定优于配置”...

    ror实例

    Ruby on Rails(简称RoR或Rails)是一种基于Ruby语言的开源Web应用框架,它遵循Model-View-Controller(MVC)架构模式,旨在提高开发效率并提供简洁、优雅的代码结构。"ror实例"可能指的是在学习或实践中,通过创建...

    神经网络ror resenet模型

    **神经网络Ror ResNet模型详解** 在深度学习领域,ResNet(残差网络)模型是具有里程碑意义的创新,由He et al.在2015年提出。该模型解决了深度神经网络训练中的梯度消失问题,允许构建非常深的网络结构。而“Ror”...

    Quest.Toad.for.Oracle.Suite.v8.0-ROR

    Quest.Toad.for.Oracle.Suite.v8.0-ROR 另外一个注册机,想必也有人想要把

    ROR安装必备所有架包

    在Ruby on Rails(ROR)开发环境中,安装和配置正确的依赖包是至关重要的。这个压缩包包含了一系列用于ROR框架的基础组件,但不包括Ruby本身。让我们深入了解一下这些包的作用和重要性。 首先,`actionpack`是Rails...

    初探ROR

    **初探ROR** Ruby on Rails(简称ROR)是一个基于Ruby编程语言的开源Web应用程序框架,它遵循MVC(模型-视图-控制器)架构模式,旨在促进开发过程的简洁性和效率。Ruby on Rails的核心理念是“Don't Repeat ...

    RoRBlog 基于RoR的博客系统

    基于RoR的博客系统,代码风格简单清晰,前后太完善,适合初学者。

    .net文件上传

    在.NET框架中,文件上传是Web应用程序中常见的功能,尤其是对于ASP.NET平台。"ASP.NET支持断点续传,大文件上传"这个标题揭示了两个关键知识点:断点续传和处理大文件上传。 首先,让我们来理解断点续传的概念。...

    结合使用 Oracle 和 Ruby on Rails 教程

    Oracle是一种流行的关系型数据库管理系统,而Ruby on Rails(简称RoR)则是一个基于Ruby语言的开源Web应用框架,它以其MVC(模型-视图-控制器)架构模式和“约定优于配置”的原则受到开发者们的青睐。本文将探讨如何...

    Windows 上搭建 ROR环境

    ### Windows上搭建Ruby on Rails(ROR)环境详解 #### 一、引言 随着Web开发技术的不断发展,Ruby on Rails(简称Rails或ROR)作为一种高效、简洁且优雅的Web开发框架,受到了广大开发者的青睐。然而,在Windows...

Global site tag (gtag.js) - Google Analytics