2014-11-24 145 views
1

假設我有以下簽名的Oracle存儲過程:紅寶石OCI8 - 綁定可選參數Oracle存儲過程

CREATE OR REPLACE PROCEDURE "FOO" (p_1 VARCHAR(100), 
            p_2 VARCHAR(100), 
            p_opt_1 VARCHAR(100) default null, 
            p_opt_2 VARCHAR(100) default null) IS 
... 

我怎麼綁定僅第二個可選參數的Ruby腳本? 使用PL/SQL是這樣的:

BEGIN 
    FOO("p1 val", "p2 val", p_opt_2 => "p2 opt val"); 
END; 

,但我還沒有找到如何做到使用OCI8,所以現在我結合了零值到p_opt_1類似的事情的信息,但它的氣味不好:

begin 
     cursor = conn.parse('BEGIN foo(:p_1, :p_2, :p_opt1, p_opt2); END;') 
     cursor.bind_param(':p_1', 'some string', String) 
     cursor.bind_param(':p_2', 'some other string', String) 
     cursor.bind_param(':p_opt_1', nil, String) 
     cursor.bind_param(':p_opt2_2', 'some value', String) 
     cursor.exec 
    rescue Exception => e 
.... 

我很確定有一個更好的方法來做到這一點。有人能指點我嗎?

非常感謝, 米哈爾

回答

2
cursor = conn.parse('BEGIN foo(:p_1, :p_2, p_opt_2 => :p_opt_2); END;') 
cursor.bind_param(:p_1, 'some string', String) 
cursor.bind_param(:p_2, 'some other string', String) 
cursor.bind_param(:p_opt_2, 'some value', String) 
cursor.exec 

更簡單地說:

conn.exec('BEGIN foo(:p_1, :p_2, p_opt_2 => :p_opt_2); END;', 
      'some string', 'some other string', 'some value')