ruby-oci8 2.1.0-x86-mingw32 → 2.1.1-x86-mingw32

Sign up to get free protection for your applications and to get access to all the features.
Binary file
@@ -1,7 +1,7 @@
1
1
  rm_f "#{curr_objdir}/lib/oci8.rb"
2
+ rm_f "#{curr_objdir}/ext/oci8/oci8lib_18.map"
3
+ rm_f "#{curr_objdir}/ext/oci8/oci8lib_191.map"
2
4
  if RUBY_PLATFORM =~ /cygwin/
3
5
  rm_f "#{curr_objdir}/ext/oci8/OCI.def"
4
6
  rm_f "#{curr_objdir}/ext/oci8/libOCI.a"
5
- else
6
- rm_f "#{curr_objdir}/ext/oci8/oracle_objs.a"
7
7
  end
@@ -31,7 +31,7 @@ spec = Gem::Specification.new do |s|
31
31
  s.description = <<EOS
32
32
  ruby-oci8 is a ruby interface for Oracle using OCI8 API. It is available with Oracle8, Oracle8i, Oracle9i, Oracle10g and Oracle Instant Client.
33
33
  EOS
34
- s.has_rdoc = true
34
+ s.has_rdoc = 'yard'
35
35
  s.authors = ['KUBO Takehiro']
36
36
  s.platform = gem_platform
37
37
  files = File.read('dist-files').split("\n")
@@ -54,6 +54,10 @@ EOS
54
54
  else
55
55
  raise "No compiled binary are found. Run make in advance."
56
56
  end
57
+ # add map files to analyze a core (minidump) file.
58
+ so_files << 'ext/oci8/oci8lib_18.map' if has_1_8 and File.exists? 'ext/oci8/oci8lib_18.map'
59
+ so_files << 'ext/oci8/oci8lib_191.map' if has_1_9_1 and File.exists? 'ext/oci8/oci8lib_191.map'
60
+
57
61
  FileUtils.copy so_files, 'lib', :preserve => true
58
62
  files.reject! do |fname|
59
63
  fname =~ /^ext/
@@ -63,8 +67,8 @@ EOS
63
67
  end
64
68
  files << 'lib/oci8.rb'
65
69
  end
70
+ s.require_paths = ['lib', 'ext/oci8']
66
71
  s.files = files
67
72
  s.test_files = 'test/test_all.rb'
68
- s.rdoc_options = ['--main', 'README']
69
- s.extra_rdoc_files = ['README']
73
+ s.extra_rdoc_files = ['README.md']
70
74
  end
@@ -13,12 +13,7 @@ ENV['ORA_NCHAR_LITERAL_REPLACE'] = 'TRUE' if OCI8.client_charset_name.include? '
13
13
  nls_lang = ENV['NLS_LANG']
14
14
  nls_lang = nls_lang.split('.')[1] unless nls_lang.nil?
15
15
  nls_lang = nls_lang.upcase unless nls_lang.nil?
16
- case nls_lang
17
- when 'JA16EUC'
18
- $lobfile = File.dirname(__FILE__) + '/../doc/api.ja.rd' # EUC-JP file
19
- else
20
- $lobfile = File.dirname(__FILE__) + '/../doc/api.en.rd' # ASCII file
21
- end
16
+ $lobfile = File.dirname(__FILE__) + '/../setup.rb'
22
17
  $lobreadnum = 256 # counts in charactors
23
18
 
24
19
  # don't modify below.
@@ -13,15 +13,22 @@ class TestDateTime < Test::Unit::TestCase
13
13
  end
14
14
  end
15
15
 
16
+ @@time_new_accepts_timezone = begin
17
+ Time.new(2001, 1, 1, 0, 0, 0, '+00:00')
18
+ true
19
+ rescue
20
+ false
21
+ end
22
+
16
23
  def string_to_time(str)
17
- /(\d+)-(\d+)-(\d+) ?(?:(\d+):(\d+):(\d+))?(?:\.(\d+))? ?([+-]\d+:\d+)?/ =~ str
24
+ /(\d+)-(\d+)-(\d+) ?(?:(\d+):(\d+):(\d+))?(?:\.(\d+))? ?(([+-])(\d+):(\d+))?/ =~ str
18
25
  args = []
19
26
  args << $1.to_i # year
20
27
  args << $2.to_i # month
21
28
  args << $3.to_i # day
22
29
  args << $4.to_i if $4 # hour
23
30
  args << $5.to_i if $5 # minute
24
- if $8
31
+ if $8 and @@time_new_accepts_timezone
25
32
  args << $6.to_i + $7.to_i.to_r / ('1' + '0' * ($7.length)).to_i
26
33
  args << $8
27
34
  Time.new(*args)
@@ -32,15 +39,37 @@ class TestDateTime < Test::Unit::TestCase
32
39
  if $7
33
40
  args << $7.to_i.to_r * 1000000 / ('1' + '0' * ($7.length)).to_i
34
41
  end
35
- # no time zone
36
- Time.local(*args)
42
+ if $8
43
+ # with time zone
44
+ offset = ($9 + '1').to_i * ($10.to_i * 60 + $11.to_i)
45
+ if offset == 0
46
+ Time.utc(*args)
47
+ else
48
+ tm = Time.local(*args)
49
+ raise "Failed to convert #{str} to Time" if tm.utc_offset != offset * 60
50
+ tm
51
+ end
52
+ else
53
+ # without time zone
54
+ Time.local(*args)
55
+ end
37
56
  end
38
57
  #Time.local(*str.split(/[- :\.]/).collect do |n| n.to_i; end)
39
58
  end
40
59
 
60
+ def string_to_datetime(str)
61
+ /(\d+-\d+-\d+ ?(?:\d+:\d+:\d+)?(?:\.\d+)?) ?([+-]\d+:\d+)?/ =~ str
62
+ if $2
63
+ # with time zone
64
+ DateTime.parse(str)
65
+ else
66
+ tm = string_to_time(str)
67
+ DateTime.parse(str + timezone_string(*((tm.utc_offset / 60).divmod 60)))
68
+ end
69
+ end
70
+
41
71
  def setup
42
72
  @conn = get_oci8_connection
43
- @local_timezone = timezone_string(*((::Time.now.utc_offset / 60).divmod 60))
44
73
  end
45
74
 
46
75
  def teardown
@@ -48,7 +77,8 @@ class TestDateTime < Test::Unit::TestCase
48
77
  end
49
78
 
50
79
  def test_date_select
51
- ['2005-12-31 23:59:59',
80
+ ['2005-06-01 00:00:00',
81
+ '2005-12-31 23:59:59',
52
82
  '2006-01-01 00:00:00'].each do |date|
53
83
  @conn.exec(<<-EOS) do |row|
54
84
  SELECT TO_DATE('#{date}', 'YYYY-MM-DD HH24:MI:SS') FROM dual
@@ -66,11 +96,12 @@ END;
66
96
  EOS
67
97
  cursor.bind_param(:out, nil, DateTime)
68
98
  cursor.bind_param(:in, nil, String, 36)
69
- ['2005-12-31 23:59:59',
99
+ ['2005-06-01 00:00:00',
100
+ '2005-12-31 23:59:59',
70
101
  '2006-01-01 00:00:00'].each do |date|
71
102
  cursor[:in] = date
72
103
  cursor.exec
73
- assert_equal(DateTime.parse(date + @local_timezone), cursor[:out])
104
+ assert_equal(string_to_datetime(date), cursor[:out])
74
105
  end
75
106
  cursor.close
76
107
  end
@@ -86,9 +117,10 @@ END;
86
117
  EOS
87
118
  cursor.bind_param(:out, nil, String, 33)
88
119
  cursor.bind_param(:in, nil, DateTime)
89
- ['2005-12-31 23:59:59',
120
+ ['2005-06-01 00:00:00',
121
+ '2005-12-31 23:59:59',
90
122
  '2006-01-01 00:00:00'].each do |date|
91
- cursor[:in] = DateTime.parse(date + @local_timezone)
123
+ cursor[:in] = string_to_datetime(date)
92
124
  cursor.exec
93
125
  assert_equal(date, cursor[:out])
94
126
  end
@@ -96,7 +128,8 @@ EOS
96
128
  end
97
129
 
98
130
  def test_timestamp_select
99
- ['2005-12-31 23:59:59.999999000',
131
+ ['2005-06-01 00:00:00.999999000',
132
+ '2005-12-31 23:59:59.999999000',
100
133
  '2006-01-01 00:00:00.000000000'].each do |date|
101
134
  @conn.exec(<<-EOS) do |row|
102
135
  SELECT TO_TIMESTAMP('#{date}', 'YYYY-MM-DD HH24:MI:SS.FF') FROM dual
@@ -114,11 +147,12 @@ END;
114
147
  EOS
115
148
  cursor.bind_param(:out, nil, DateTime)
116
149
  cursor.bind_param(:in, nil, String, 36)
117
- ['2005-12-31 23:59:59.999999000',
150
+ ['2005-06-01 00:00:00.999999000',
151
+ '2005-12-31 23:59:59.999999000',
118
152
  '2006-01-01 00:00:00.000000000'].each do |date|
119
153
  cursor[:in] = date
120
154
  cursor.exec
121
- assert_equal(DateTime.parse(date + @local_timezone), cursor[:out])
155
+ assert_equal(string_to_datetime(date), cursor[:out])
122
156
  end
123
157
  cursor.close
124
158
  end
@@ -131,9 +165,10 @@ END;
131
165
  EOS
132
166
  cursor.bind_param(:out, nil, String, 33)
133
167
  cursor.bind_param(:in, nil, DateTime)
134
- ['2005-12-31 23:59:59.999999000',
168
+ ['2005-06-01 00:00:00.999999000',
169
+ '2005-12-31 23:59:59.999999000',
135
170
  '2006-01-01 00:00:00.000000000'].each do |date|
136
- cursor[:in] = DateTime.parse(date + @local_timezone)
171
+ cursor[:in] = string_to_datetime(date)
137
172
  cursor.exec
138
173
  assert_equal(date, cursor[:out])
139
174
  end
@@ -141,7 +176,8 @@ EOS
141
176
  end
142
177
 
143
178
  def test_timestamp_tz_select
144
- ['2005-12-31 23:59:59.999999000 +08:30',
179
+ ['2005-06-01 00:00:00.999999000 +00:00',
180
+ '2005-12-31 23:59:59.999999000 +08:30',
145
181
  '2006-01-01 00:00:00.000000000 -08:30'].each do |date|
146
182
  @conn.exec(<<-EOS) do |row|
147
183
  SELECT TO_TIMESTAMP_TZ('#{date}', 'YYYY-MM-DD HH24:MI:SS.FF TZH:TZM') FROM dual
@@ -149,7 +185,7 @@ EOS
149
185
  expected_val = begin
150
186
  string_to_time(date)
151
187
  rescue
152
- DateTime.parse(date)
188
+ string_to_datetime(date)
153
189
  end
154
190
  assert_equal(expected_val, row[0])
155
191
  end
@@ -164,11 +200,12 @@ END;
164
200
  EOS
165
201
  cursor.bind_param(:out, nil, DateTime)
166
202
  cursor.bind_param(:in, nil, String, 36)
167
- ['2005-12-31 23:59:59.999999000 +08:30',
168
- '2006-01-01 00:00:00.000000000 -08:30'].each do |date|
203
+ ['2005-06-01 00:00:00.999999000 -08:30',
204
+ '2005-12-31 23:59:59.999999000 +00:00',
205
+ '2006-01-01 00:00:00.000000000 +08:30'].each do |date|
169
206
  cursor[:in] = date
170
207
  cursor.exec
171
- assert_equal(DateTime.parse(date), cursor[:out])
208
+ assert_equal(string_to_datetime(date), cursor[:out])
172
209
  end
173
210
  cursor.close
174
211
  end
@@ -181,9 +218,10 @@ END;
181
218
  EOS
182
219
  cursor.bind_param(:out, nil, String, 36)
183
220
  cursor.bind_param(:in, nil, DateTime)
184
- ['2005-12-31 23:59:59.999999000 +08:30',
185
- '2006-01-01 00:00:00.000000000 -08:30'].each do |date|
186
- cursor[:in] = DateTime.parse(date)
221
+ ['2005-06-01 00:00:00.999999999 +08:30',
222
+ '2005-12-31 23:59:59.999999000 -08:30',
223
+ '2006-01-01 00:00:00.000000000 +00:00'].each do |date|
224
+ cursor[:in] = string_to_datetime(date)
187
225
  cursor.exec
188
226
  assert_equal(date, cursor[:out])
189
227
  end
@@ -201,48 +239,48 @@ EOS
201
239
  def obj.day; 31; end
202
240
  cursor[:in] = obj
203
241
  cursor.exec
204
- assert_equal(DateTime.parse('2006-12-31 00:00:00' + @local_timezone), cursor[:out])
242
+ assert_equal(string_to_datetime('2006-12-31 00:00:00'), cursor[:out])
205
243
  # test hour
206
244
  def obj.hour; 23; end
207
245
  cursor[:in] = obj
208
246
  cursor.exec
209
- assert_equal(DateTime.parse('2006-12-31 23:00:00' + @local_timezone), cursor[:out])
247
+ assert_equal(string_to_datetime('2006-12-31 23:00:00'), cursor[:out])
210
248
  # test min
211
249
  def obj.min; 59; end
212
250
  cursor[:in] = obj
213
251
  cursor.exec
214
- assert_equal(DateTime.parse('2006-12-31 23:59:00' + @local_timezone), cursor[:out])
252
+ assert_equal(string_to_datetime('2006-12-31 23:59:00'), cursor[:out])
215
253
  # test sec
216
254
  def obj.sec; 59; end
217
255
  cursor[:in] = obj
218
256
  cursor.exec
219
- assert_equal(DateTime.parse('2006-12-31 23:59:59' + @local_timezone), cursor[:out])
257
+ assert_equal(string_to_datetime('2006-12-31 23:59:59'), cursor[:out])
220
258
 
221
259
  # test sec_fraction
222
260
  def obj.sec_fraction; DateTime.parse('0001-01-01 00:00:00.000001').sec_fraction * 999999 ; end
223
261
  cursor[:in] = obj
224
262
  cursor.exec
225
- assert_equal(DateTime.parse('2006-12-31 23:59:59.999999' + @local_timezone), cursor[:out])
263
+ assert_equal(string_to_datetime('2006-12-31 23:59:59.999999'), cursor[:out])
226
264
  # test utc_offset (Time)
227
265
  def obj.utc_offset; @utc_offset; end
228
266
  obj.instance_variable_set(:@utc_offset, 9 * 60 * 60)
229
267
  cursor[:in] = obj
230
268
  cursor.exec
231
- assert_equal(DateTime.parse('2006-12-31 23:59:59.999999 +09:00'), cursor[:out])
269
+ assert_equal(string_to_datetime('2006-12-31 23:59:59.999999 +09:00'), cursor[:out])
232
270
  obj.instance_variable_set(:@utc_offset, -5 * 60 * 60)
233
271
  cursor[:in] = obj
234
272
  cursor.exec
235
- assert_equal(DateTime.parse('2006-12-31 23:59:59.999999 -05:00'), cursor[:out])
273
+ assert_equal(string_to_datetime('2006-12-31 23:59:59.999999 -05:00'), cursor[:out])
236
274
  # test offset (DateTime)
237
275
  def obj.offset; @offset; end
238
276
  obj.instance_variable_set(:@offset, 9.to_r / 24)
239
277
  cursor[:in] = obj
240
278
  cursor.exec
241
- assert_equal(DateTime.parse('2006-12-31 23:59:59.999999 +09:00'), cursor[:out])
279
+ assert_equal(string_to_datetime('2006-12-31 23:59:59.999999 +09:00'), cursor[:out])
242
280
  obj.instance_variable_set(:@offset, -5.to_r / 24)
243
281
  cursor[:in] = obj
244
282
  cursor.exec
245
- assert_equal(DateTime.parse('2006-12-31 23:59:59.999999 -05:00'), cursor[:out])
283
+ assert_equal(string_to_datetime('2006-12-31 23:59:59.999999 -05:00'), cursor[:out])
246
284
  end
247
285
 
248
286
  def test_timezone
@@ -322,14 +322,20 @@ EOS
322
322
  @conn.exec(sql)
323
323
  cursor = @conn.parse("INSERT INTO test_table VALUES (:1, :2, :3, :4)")
324
324
  0.upto(9) do |i|
325
- val = format('%d', i) * 4096
325
+ val = case i
326
+ when 5; '' # empty string
327
+ else format('%d', i) * 4096
328
+ end
326
329
  cursor.exec(i, OCI8::CLOB.new(@conn, val), OCI8::NCLOB.new(@conn, val), OCI8::BLOB.new(@conn, val))
327
330
  end
328
331
  cursor.close
329
332
  cursor = @conn.exec("select * from test_table order by id")
330
333
  0.upto(9) do |i|
331
334
  rv = cursor.fetch
332
- val = format('%d', i) * 4096
335
+ val = case i
336
+ when 5; '' # empty string
337
+ else format('%d', i) * 4096
338
+ end
333
339
  assert_equal(i, rv[0])
334
340
  assert_instance_of(OCI8::CLOB, rv[1])
335
341
  assert_instance_of(OCI8::NCLOB, rv[2])
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ruby-oci8
3
3
  version: !ruby/object:Gem::Version
4
- hash: 11
4
+ hash: 9
5
5
  prerelease: false
6
6
  segments:
7
7
  - 2
8
8
  - 1
9
- - 0
10
- version: 2.1.0
9
+ - 1
10
+ version: 2.1.1
11
11
  platform: x86-mingw32
12
12
  authors:
13
13
  - KUBO Takehiro
@@ -15,7 +15,7 @@ autorequire:
15
15
  bindir: bin
16
16
  cert_chain: []
17
17
 
18
- date: 2011-12-13 00:00:00 +09:00
18
+ date: 2012-04-22 00:00:00 +09:00
19
19
  default_executable:
20
20
  dependencies: []
21
21
 
@@ -28,23 +28,24 @@ executables: []
28
28
  extensions: []
29
29
 
30
30
  extra_rdoc_files:
31
- - README
31
+ - README.md
32
32
  files:
33
+ - .yardopts
33
34
  - ChangeLog
34
35
  - Makefile
35
36
  - NEWS
36
- - README
37
+ - README.md
37
38
  - VERSION
38
39
  - dist-files
39
40
  - metaconfig
40
41
  - pre-distclean.rb
41
42
  - ruby-oci8.gemspec
42
43
  - setup.rb
43
- - doc/api.en.html
44
- - doc/api.en.rd
45
- - doc/api.ja.html
46
- - doc/api.ja.rd
47
- - doc/manual.css
44
+ - docs/install-binary-package.md
45
+ - docs/install-full-client.md
46
+ - docs/install-instant-client.md
47
+ - docs/platform-specific-issues.md
48
+ - docs/report-installation-issue.md
48
49
  - lib/.document
49
50
  - lib/oci8.rb.in
50
51
  - lib/dbd/OCI8.rb
@@ -86,17 +87,19 @@ files:
86
87
  - test/test_rowid.rb
87
88
  - lib/oci8lib_191.so
88
89
  - lib/oci8lib_18.so
90
+ - lib/oci8lib_18.map
91
+ - lib/oci8lib_191.map
89
92
  - lib/oci8.rb
90
93
  has_rdoc: true
91
94
  homepage: http://ruby-oci8.rubyforge.org
92
95
  licenses: []
93
96
 
94
97
  post_install_message:
95
- rdoc_options:
96
- - --main
97
- - README
98
+ rdoc_options: []
99
+
98
100
  require_paths:
99
101
  - lib
102
+ - ext/oci8
100
103
  required_ruby_version: !ruby/object:Gem::Requirement
101
104
  none: false
102
105
  requirements:
data/README DELETED
@@ -1,5 +0,0 @@
1
- Ruby-oci8 is a ruby interface for Oracle using OCI8 API.
2
- The latest version (2.1.x) works with Oracle9i or later.
3
- Use ruby-oci8 2.0.6 or earlier for Oracle 8.
4
-
5
- See: http://ruby-oci8.rubyforge.org
@@ -1,527 +0,0 @@
1
- <?xml version="1.0" ?>
2
- <!DOCTYPE html
3
- PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
4
- "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
5
- <html xmlns="http://www.w3.org/1999/xhtml">
6
- <head>
7
- <title>Ruby/OCI8 High-level API</title>
8
- <link href="manual.css" type="text/css" rel="stylesheet" />
9
- </head>
10
- <body>
11
- <h1><a name="label-0" id="label-0">Ruby/OCI8 High-level API</a></h1><!-- RDLabel: "Ruby/OCI8 High-level API" -->
12
- <p>[ <a href="index.en.html">Home</a> ] [ English | <a href="api.ja.html">Japanese</a> ]</p>
13
- <p>Ruby/OCI8 is divided to two layer APIs. One is "Low-level
14
- API". The other is "High-level API". This document describes how to
15
- use the latter, but some of the former will be described as long as it
16
- is necessary to use the latter.</p>
17
- <p>"High-level API" is the library written by ruby, which based on
18
- "Low-level API". This API hides complicated structure of OCI and make
19
- it easy to issue SQL statements as possible. Please use this for general purpose.</p>
20
- <p>"Low-level API" is the library written by C language. OCI <a name="footmark-1" id="footmark-1" href="#foottext-1"><sup><small>*1</small></sup></a> handles and OCI functions become ruby's classes
21
- and methods respectively. The handles and functions are converted by
22
- straight mapping rule as long as ruby's syntax allows. </p>
23
- <p>In the version 0.2 I will rewrite High-level API by C language directly.
24
- Low-level API will be obsolete.</p>
25
- <h2><a name="label-1" id="label-1">Contents</a></h2><!-- RDLabel: "Contents" -->
26
- <ul>
27
- <li><a href="#label-2">Classes List</a>
28
- <ul>
29
- <li><a href="#label-3">OCI8</a></li>
30
- <li><a href="#label-4">OCI8::Cursor</a></li>
31
- <li><a href="#label-5">OCI8::BLOB</a></li>
32
- <li><a href="#label-6">OCI Exception Classes</a></li>
33
- </ul></li>
34
- <li><a href="#label-7">Methods List</a>
35
- <ul>
36
- <li>OCI8
37
- <ul>
38
- <li><a href="#label-9">new</a>(userid, password, dbname = nil, privilege = nil)</li>
39
- <li><a href="#label-10">logoff</a>()</li>
40
- <li><a href="#label-11">exec</a>(sql, *bindvars)</li>
41
- <li><a href="#label-12">parse</a>(sql)</li>
42
- <li><a href="#label-13">commit</a>()</li>
43
- <li><a href="#label-14">rollback</a>()</li>
44
- <li><a href="#label-15">autocommit?</a></li>
45
- <li><a href="#label-16">autocommit</a></li>
46
- <li><a href="#label-17">autocommit=</a></li>
47
- <li><a href="#label-18">non_blocking?</a></li>
48
- <li><a href="#label-19">non_blocking=</a></li>
49
- <li><a href="#label-20">break</a>()</li>
50
- </ul></li>
51
- <li>OCI8::Cursor
52
- <ul>
53
- <li><a href="#label-22">define</a>(pos, type, length = nil)</li>
54
- <li><a href="#label-23">bind_param</a>(key, val, type = nil, length = nil)</li>
55
- <li><a href="#label-24">[]</a>(key)</li>
56
- <li><a href="#label-25">[]=</a>(key, val)</li>
57
- <li><a href="#label-26">keys</a>()</li>
58
- <li><a href="#label-27">exec</a>(*bindvars)</li>
59
- <li><a href="#label-28">type</a></li>
60
- <li><a href="#label-29">row_count</a></li>
61
- <li><a href="#label-30">get_col_names</a></li>
62
- <li><a href="#label-31">getColNames</a></li>
63
- <li><a href="#label-32">fetch</a>()</li>
64
- <li><a href="#label-33">close</a>()</li>
65
- <li><a href="#label-34">rowid</a></li>
66
- </ul></li>
67
- <li>OCI8::BLOB
68
- <ul>
69
- <li><a href="#label-36">available?</a></li>
70
- <li><a href="#label-37">read</a>(size = nil)</li>
71
- <li><a href="#label-38">write</a>(data)</li>
72
- <li><a href="#label-39">size</a></li>
73
- <li><a href="#label-40">size=</a>(len)</li>
74
- <li><a href="#label-41">chunk_size</a></li>
75
- <li><a href="#label-42">truncate</a>(len)</li>
76
- <li><a href="#label-43">pos</a></li>
77
- <li><a href="#label-44">pos=</a>(pos)</li>
78
- <li><a href="#label-46">tell</a></li>
79
- <li><a href="#label-47">seek</a>(pos)</li>
80
- <li><a href="#label-48">rewind</a></li>
81
- <li><a href="#label-45">eof?</a></li>
82
- </ul></li>
83
- </ul></li>
84
- <li><a href="#label-49">Appendix</a>
85
- <ul>
86
- <li><a href="#label-50">Blocking/Non-Blocking Mode</a></li>
87
- </ul></li>
88
- </ul>
89
- <h2><a name="label-2" id="label-2">Classes List</a></h2><!-- RDLabel: "Classes List" -->
90
- <p>Indispensable Classes to use high-level API are <a href="#label-3">OCI8</a>,
91
- <a href="#label-4">OCI8::Cursor</a>, <a href="#label-5">OCI8::BLOB</a> and <a href="#label-6">OCI Exception Classes</a>.</p>
92
- <h3><a name="label-3" id="label-3">OCI8</a></h3><!-- RDLabel: "OCI8" -->
93
- <p>The instance of this class corresponds to the connection with
94
- database, which corresponds to java.sql.Connection of JDBC and
95
- database handle $dbh of Perl/DBI.</p>
96
- <p>To execute simple SQL, it can perform by this class only.</p>
97
- <h3><a name="label-4" id="label-4">OCI8::Cursor</a></h3><!-- RDLabel: "OCI8::Cursor" -->
98
- <p>The instance of this class corresponds to cursor in the term of
99
- Oracle, which corresponds to java.sql.Statement of JDBC and statement
100
- handle $sth of Perl/DBI.</p>
101
- <p>Don't create the instance by calling 'new' method. Please create it by
102
- calling <a href="#label-11">OCI8#exec</a> or <a href="#label-12">OCI8#parse</a>.</p>
103
- <h3><a name="label-5" id="label-5">OCI8::BLOB</a></h3><!-- RDLabel: "OCI8::BLOB" -->
104
- <p>This is a lob locator to read/write binary data to/from BLOB column.
105
- This instance is automatically generated by select statement.</p>
106
- <h3><a name="label-6" id="label-6">OCI Exception Classes</a></h3><!-- RDLabel: "OCI Exception Classes" -->
107
- <p>The class hierarchy of OCI exception class used in high-level API is
108
- as follows.</p>
109
- <ul>
110
- <li><var>OCIException</var>
111
- <ul>
112
- <li><var>OCIError</var></li>
113
- <li><var>OCIInvalidHandle</var></li>
114
- <li><var>OCIBreak</var></li>
115
- </ul></li>
116
- </ul>
117
- <p><var>OCIException</var> is the abstract class for all OCI exceptions. To
118
- rescue all OCI exceptions, please use this class.</p>
119
- <p><var>OCIError</var> is the exception class with Oracle's error code. You
120
- get the error message by OCIError#message. The error code by
121
- OCIError#code.</p>
122
- <p><var>OCIInvalidHandle</var> is raised when OCI call is performed to
123
- the invalid handle.</p>
124
- <p><var>OCIBreak</var> is raised when the OCI call is canceled by other thread.
125
- See also <a href="#label-50">Blocking/Non-Blocking Mode</a>.</p>
126
- <h2><a name="label-7" id="label-7">Methods List</a></h2><!-- RDLabel: "Methods List" -->
127
- <h3><a name="label-8" id="label-8">OCI8</a></h3><!-- RDLabel: "OCI8" -->
128
- <dl>
129
- <dt><a name="label-9" id="label-9"><code>OCI8.new(<var>userid</var>, <var>password</var>, <var>dbname</var> = <var>nil</var>, <var>privilege</var> = <var>nil</var>)</code></a></dt><!-- RDLabel: "OCI8.new" -->
130
- <dd>
131
- <p>Connects to Oracle by userid and password. dbname is the connect
132
- string of Net8. If you need DBA privilege, please set privilege
133
- as :SYSDBA or :SYSOPER.</p>
134
- <p>example:</p>
135
- <pre># sqlplus scott/tiger@orcl.world
136
- conn = OCI8.new("scott", "tiger", "orcl.world")</pre>
137
- <p>example:</p>
138
- <pre># sqlplus 'sys/change_on_install as sysdba'
139
- conn = OCI8.new("sys", "change_on_install", nil, :SYSDBA)</pre></dd>
140
- <dt><a name="label-10" id="label-10"><code>OCI8#logoff()</code></a></dt><!-- RDLabel: "OCI8#logoff" -->
141
- <dd>
142
- <p>Disconnects from Oracle. Uncommitted transaction will be
143
- rollbacked.</p>
144
- <p>example:</p>
145
- <pre>conn = OCI8.new("scott", "tiger")
146
- ... do something ...
147
- conn.logoff</pre></dd>
148
- <dt><a name="label-11" id="label-11"><code>OCI8#exec(<var>sql</var>, *<var>bindvars</var>)</code></a></dt><!-- RDLabel: "OCI8#exec" -->
149
- <dd>
150
- <p>Executes the sql statement. The type of return value depends on
151
- the type of sql statement: select; insert, update and delete;
152
- create, alter and drop; and PL/SQL.</p>
153
- <p>When bindvars are specified, they are bound as bind variables
154
- before execution.</p>
155
- <p>In case of select statement with no block, it returns the
156
- instance of OCI8::Cursor.</p>
157
- <p>example:</p>
158
- <pre>conn = OCI8.new('scott', 'tiger')
159
- cursor = conn.exec('SELECT * FROM emp')
160
- while r = cursor.fetch()
161
- puts r.join(',')
162
- end
163
- cursor.close
164
- conn.logoff</pre>
165
- <p>In case of select statement with a block, it acts as iterator and
166
- returns the processed row counts. Fetched data is passed to the
167
- block as array. NULL value becomes nil in ruby.</p>
168
- <p>example:</p>
169
- <pre>conn = OCI8.new('scott', 'tiger')
170
- num_rows = conn.exec('SELECT * FROM emp') do |r|
171
- puts r.join(',')
172
- end
173
- puts num_rows.to_s + ' rows were processed.'
174
- conn.logoff</pre>
175
- <p>In case of insert, update or delete statement, it returns the
176
- number of processed rows.</p>
177
- <p>example:</p>
178
- <pre>conn = OCI8.new('scott', 'tiger')
179
- num_rows = conn.exec('UPDATE emp SET sal = sal * 1.1')
180
- puts num_rows.to_s + ' rows were updated.'
181
- conn.logoff</pre>
182
- <p>In case of create, alter or drop statement, it returns true.</p>
183
- <p>example:</p>
184
- <pre>conn = OCI8.new('scott', 'tiger')
185
- conn.exec('CREATE TABLE test (col1 CHAR(6))')
186
- conn.logoff</pre>
187
- <p>In case of PL/SQL statement, it returns the array of bind
188
- variables.</p>
189
- <p>example:</p>
190
- <pre>conn = OCI8.new('scott', 'tiger')
191
- conn.exec("BEGIN :str := TO_CHAR(:num, 'FM0999'); END;", 'ABCD', 123)
192
- # =&gt; ["0123", 123]
193
- conn.logoff</pre>
194
- <p>Above example uses two bind variables which names are <var>:str</var>
195
- and <var>:num</var>. These initial values are "the string whose width
196
- is 4 and whose value is 'ABCD'" and "the number whose value is
197
- 123". This method returns the array of these bind variables,
198
- which may modified by PL/SQL statement. The order of array is
199
- same with that of bind variables.</p></dd>
200
- <dt><a name="label-12" id="label-12"><code>OCI8#parse(<var>sql</var>)</code></a></dt><!-- RDLabel: "OCI8#parse" -->
201
- <dd>
202
- Creates cursor, prepare to execute SQL statement and return the
203
- instance of OCI8::Cursor.</dd>
204
- <dt><a name="label-13" id="label-13"><code>OCI8#commit()</code></a></dt><!-- RDLabel: "OCI8#commit" -->
205
- <dd>
206
- <p>Commits the transaction.</p>
207
- <p>example:</p>
208
- <pre>conn = OCI8.new("scott", "tiger")
209
- conn.exec("UPDATE emp SET sal = sal * 1.1") # yahoo
210
- conn.commit
211
- conn.logoff</pre></dd>
212
- <dt><a name="label-14" id="label-14"><code>OCI8#rollback()</code></a></dt><!-- RDLabel: "OCI8#rollback" -->
213
- <dd>
214
- <p>Rollbacks the transaction.</p>
215
- <p>example:</p>
216
- <pre>conn = OCI8.new("scott", "tiger")
217
- conn.exec("UPDATE emp SET sal = sal * 0.9") # boos
218
- conn.rollback
219
- conn.logoff</pre></dd>
220
- <dt><a name="label-15" id="label-15"><code>OCI8#autocommit?</code></a></dt><!-- RDLabel: "OCI8#autocommit?" -->
221
- <dd>
222
- Returns the state of the autocommit mode. The default value is
223
- false. If true, the transaction is committed automatically
224
- whenever executing insert/update/delete statements.</dd>
225
- <dt><a name="label-16" id="label-16"><code>OCI8#autocommit</code></a></dt><!-- RDLabel: "OCI8#autocommit" -->
226
- <dd>
227
- Alias of <a href="#label-15">OCI8#autocommit?</a>.</dd>
228
- <dt><a name="label-17" id="label-17"><code>OCI8#autocommit=</code></a></dt><!-- RDLabel: "OCI8#autocommit=" -->
229
- <dd>
230
- <p>Changes the status of the autocommit mode. Acceptable values are
231
- true and false.</p>
232
- <p>example:</p>
233
- <pre>conn = OCI8.new("scott", "tiger")
234
- conn.autocommit = true
235
- ... do something ...
236
- conn.logoff</pre></dd>
237
- <dt><a name="label-18" id="label-18"><code>OCI8#non_blocking?</code></a></dt><!-- RDLabel: "OCI8#non_blocking?" -->
238
- <dd>
239
- Returns the status of blocking/non-blocking mode. The default
240
- value is false, that is blocking mode. See
241
- <a href="#label-50">Blocking/Non-Blocking Mode</a>.</dd>
242
- <dt><a name="label-19" id="label-19"><code>OCI8#non_blocking=</code></a></dt><!-- RDLabel: "OCI8#non_blocking=" -->
243
- <dd>
244
- Changes the status of blocking/non-blocking mode. Acceptable
245
- values are true and false. See
246
- <a href="#label-50">Blocking/Non-Blocking Mode</a>.</dd>
247
- <dt><a name="label-20" id="label-20"><code>OCI8#break()</code></a></dt><!-- RDLabel: "OCI8#break" -->
248
- <dd>
249
- Cancels the OCI call performing in other thread. To use this, the
250
- connection status must be non-blocking mode. See
251
- <a href="#label-50">Blocking/Non-Blocking Mode</a>.</dd>
252
- </dl>
253
- <h2><a name="label-21" id="label-21">OCI8::Cursor</a></h2><!-- RDLabel: "OCI8::Cursor" -->
254
- <dl>
255
- <dt><a name="label-22" id="label-22"><code>OCI8::Cursor#define(<var>pos</var>, <var>type</var>, <var>length</var> = <var>nil</var>)</code></a></dt><!-- RDLabel: "OCI8::Cursor#define" -->
256
- <dd>
257
- <p>explicitly indicate the date type of fetched value. run this
258
- method within parse and exec. pos starts from 1. lentgh is used
259
- when type is String.</p>
260
- <p>example:</p>
261
- <pre>cursor = conn.parse("SELECT ename, hiredate FROM emp")
262
- cursor.define(1, String, 20) # fetch the first column as String.
263
- cursor.define(2, Time) # fetch the second column as Time.
264
- cursor.exec()</pre></dd>
265
- <dt><a name="label-23" id="label-23"><code>OCI8::Cursor#bind_param(<var>key</var>, <var>val</var>, <var>type</var> = <var>nil</var>, <var>length</var> = <var>nil</var>)</code></a></dt><!-- RDLabel: "OCI8::Cursor#bind_param" -->
266
- <dd>
267
- <p>Binds variables explicitly.</p>
268
- <p>When key is number, it binds by position, which starts from 1.
269
- When key is string, it binds by the name of placeholder.</p>
270
- <p>example:</p>
271
- <pre>cursor = conn.parse("SELECT * FROM emp WHERE ename = :ename")
272
- cursor.bind_param(1, 'SMITH') # bind by position
273
- ...or...
274
- cursor.bind_param(':ename', 'SMITH') # bind by name</pre>
275
- <p>To bind as number, Fixnum and Float are available, but Bignum is
276
- not supported. If its initial value is NULL, please set nil to
277
- <var>type</var> and Fixnum or Float to <var>val</var>.</p>
278
- <p>example:</p>
279
- <pre>cursor.bind_param(1, 1234) # bind as Fixnum, Initial value is 1234.
280
- cursor.bind_param(1, 1234.0) # bind as Float, Initial value is 1234.0.
281
- cursor.bind_param(1, nil, Fixnum) # bind as Fixnum, Initial value is NULL.
282
- cursor.bind_param(1, nil, Float) # bind as Float, Initial value is NULL.</pre>
283
- <p>In case of binding a string, set the string itself to
284
- <var>val</var>. When the bind variable is used as output, set the
285
- string whose length is enough to store or set the length.</p>
286
- <p>example:</p>
287
- <pre>cursor = conn.parse("BEGIN :out := :in || '_OUT'; END;")
288
- cursor.bind_param(':in', 'DATA') # bind as String with width 4.
289
- cursor.bind_param(':out', nil, String, 7) # bind as String with width 7.
290
- cursor.exec()
291
- p cursor[':out'] # =&gt; 'DATA_OU'
292
- # Though the length of :out is 8 bytes in PL/SQL block, it is
293
- # bound as 7 bytes. So result is cut off at 7 byte.</pre>
294
- <p>In case of binding a string as RAW, set OCI::RAW to <var>type</var>.</p>
295
- <p>example:</p>
296
- <pre>cursor = conn.parse("INSERT INTO raw_table(raw_column) VALUE (:1)")
297
- cursor.bind_param(1, 'RAW_STRING', OCI8::RAW)
298
- cursor.exec()
299
- cursor.close()</pre></dd>
300
- <dt><a name="label-24" id="label-24"><code>OCI8::Cursor#[<var>key</var>]</code></a></dt><!-- RDLabel: "OCI8::Cursor#[]" -->
301
- <dd>
302
- <p>Gets the value of the bind variable.</p>
303
- <p>In case of binding explicitly, use same key with that of
304
- <a href="#label-23">OCI8::Cursor#bind_param</a>. A placeholder can be bound by
305
- name or position. If you bind by name, use that name. If you bind
306
- by position, use the position.</p>
307
- <p>example:</p>
308
- <pre>cursor = conn.parse("BEGIN :out := 'BAR'; END;")
309
- cursor.bind_param(':out', 'FOO') # bind by name
310
- p cursor[':out'] # =&gt; 'FOO'
311
- p cursor[1] # =&gt; nil
312
- cursor.exec()
313
- p cursor[':out'] # =&gt; 'BAR'
314
- p cursor[1] # =&gt; nil</pre>
315
- <p>example:</p>
316
- <pre>cursor = conn.parse("BEGIN :out := 'BAR'; END;")
317
- cursor.bind_param(1, 'FOO') # bind by position
318
- p cursor[':out'] # =&gt; nil
319
- p cursor[1] # =&gt; 'FOO'
320
- cursor.exec()
321
- p cursor[':out'] # =&gt; nil
322
- p cursor[1] # =&gt; 'BAR'</pre>
323
- <p>In case of binding by <a href="#label-11">OCI8#exec</a> or <a href="#label-27">OCI8::Cursor#exec</a>,
324
- get the value by position, which starts from 1.</p>
325
- <p>example:</p>
326
- <pre>cursor = conn.exec("BEGIN :out := 'BAR'; END;", 'FOO')
327
- # 1st bind variable is bound as String with width 3. Its initial value is 'FOO'
328
- # After execute, the value become 'BAR'.
329
- p cursor[1] # =&gt; 'BAR'</pre></dd>
330
- <dt><a name="label-25" id="label-25"><code>OCI8::Cursor#[<var>key</var>] = <var>val</var></code></a></dt><!-- RDLabel: "OCI8::Cursor#[]=" -->
331
- <dd>
332
- <p>Sets the value to the bind variable. The way to specify the
333
- <var>key</var> is same with <a href="#label-24">OCI8::Cursor#[]</a>. This is available
334
- to replace the value and execute many times.</p>
335
- <p>example1:</p>
336
- <pre>cursor = conn.parse("INSERT INTO test(col1) VALUES(:1)")
337
- cursor.bind_params(1, nil, String, 3)
338
- ['FOO', 'BAR', 'BAZ'].each do |key|
339
- cursor[1] = key
340
- cursor.exec
341
- end
342
- cursor.close()</pre>
343
- <p>example2:</p>
344
- <pre>['FOO', 'BAR', 'BAZ'].each do |key|
345
- conn.exec("INSERT INTO test(col1) VALUES(:1)", key)
346
- end</pre>
347
- <p>Both example's results are same. But the former will use less resources.</p></dd>
348
- <dt><a name="label-26" id="label-26"><code>OCI8::Cursor#keys()</code></a></dt><!-- RDLabel: "OCI8::Cursor#keys" -->
349
- <dd>
350
- Returns the keys of bind variables as array.</dd>
351
- <dt><a name="label-27" id="label-27"><code>OCI8::Cursor#exec(*<var>bindvars</var>)</code></a></dt><!-- RDLabel: "OCI8::Cursor#exec" -->
352
- <dd>
353
- <p>Executes the SQL statement assigned the cursor. The type of
354
- return value depends on the type of sql statement: select;
355
- insert, update and delete; create, alter, drop and PL/SQL.</p>
356
- <p>In case of select statement, it returns the number of the
357
- select-list.</p>
358
- <p>In case of insert, update or delete statement, it returns the
359
- number of processed rows.</p>
360
- <p>In case of create, alter, drop and PL/SQL statement, it returns
361
- true. In contrast with <a href="#label-11">OCI8#exec</a>, it returns true even
362
- though PL/SQL. Use <a href="#label-24">OCI8::Cursor#[]</a> explicitly to get bind
363
- variables.</p></dd>
364
- <dt><a name="label-28" id="label-28"><code>OCI8::Cursor#type</code></a></dt><!-- RDLabel: "OCI8::Cursor#type" -->
365
- <dd>
366
- <p>gets the type of SQL statement. Its value is one of the follows.</p>
367
- <ul>
368
- <li>OCI8::STMT_SELECT</li>
369
- <li>OCI8::STMT_UPDATE</li>
370
- <li>OCI8::STMT_DELETE</li>
371
- <li>OCI8::STMT_INSERT</li>
372
- <li>OCI8::STMT_CREATE</li>
373
- <li>OCI8::STMT_DROP</li>
374
- <li>OCI8::STMT_ALTER</li>
375
- <li>OCI8::STMT_BEGIN</li>
376
- <li>OCI8::STMT_DECLARE</li>
377
- </ul>
378
- <p>For PL/SQL statement, it returns OCI8::STMT_BEGIN or
379
- OCI8::STMT_DECLARE.</p></dd>
380
- <dt><a name="label-29" id="label-29"><code>OCI8::Cursor#row_count</code></a></dt><!-- RDLabel: "OCI8::Cursor#row_count" -->
381
- <dd>
382
- Returns the number of processed rows.</dd>
383
- <dt><a name="label-30" id="label-30"><code>OCI8::Cursor#get_col_names</code></a></dt><!-- RDLabel: "OCI8::Cursor#get_col_names" -->
384
- <dd>
385
- Gets the names of select-list as array. Please use this
386
- method after exec.</dd>
387
- <dt><a name="label-31" id="label-31"><code>OCI8::Cursor#getColNames</code></a></dt><!-- RDLabel: "OCI8::Cursor#getColNames" -->
388
- <dd>
389
- Alias of <a href="#label-30">OCI8::Cursor#get_col_names</a>.</dd>
390
- <dt><a name="label-32" id="label-32"><code>OCI8::Cursor#fetch()</code></a></dt><!-- RDLabel: "OCI8::Cursor#fetch" -->
391
- <dd>
392
- <p>Gets fetched data as array. This is available for select
393
- statement only.</p>
394
- <p>example:</p>
395
- <pre>conn = OCI8.new('scott', 'tiger')
396
- cursor = conn.exec('SELECT * FROM emp')
397
- while r = cursor.fetch()
398
- puts r.join(',')
399
- end
400
- cursor.close
401
- conn.logoff</pre></dd>
402
- <dt><a name="label-33" id="label-33"><code>OCI8::Cursor#close()</code></a></dt><!-- RDLabel: "OCI8::Cursor#close" -->
403
- <dd>
404
- close the cursor.</dd>
405
- <dt><a name="label-34" id="label-34"><code>OCI8::Cursor#rowid()</code></a></dt><!-- RDLabel: "OCI8::Cursor#rowid" -->
406
- <dd>
407
- get the rowid of the last processed row.
408
- This value is available as bind data.
409
- On the other hand it isn't available for other purpose.</dd>
410
- </dl>
411
- <h2><a name="label-35" id="label-35">OCI8::BLOB</a></h2><!-- RDLabel: "OCI8::BLOB" -->
412
- <dl>
413
- <dt><a name="label-36" id="label-36"><code>OCI8::BLOB#available?</code></a></dt><!-- RDLabel: "OCI8::BLOB#available?" -->
414
- <dd>
415
- <p>check whether BLOB is available or not.
416
- To use BLOB you need to insert EMPTY_BLOB() at first.</p>
417
- <p>example:</p>
418
- <pre>conn.exec("CREATE TABLE photo (name VARCHAR2(50), image BLOB)")
419
- conn.exec("INSERT INTO photo VALUES ('null-data', NULL)")
420
- conn.exec("INSERT INTO photo VALUES ('empty-data', EMPTY_BLOB())")
421
- conn.exec("SELECT name, image FROM photo") do |name, image|
422
- case name
423
- when 'null-data'
424
- puts "#{name} =&gt; #{image.available?.to_s}"
425
- # =&gt; false
426
- when 'empty-data'
427
- puts "#{name} =&gt; #{image.available?.to_s}"
428
- # =&gt; true
429
- end
430
- end</pre></dd>
431
- <dt><a name="label-37" id="label-37"><code>OCI8::BLOB#read(<var>size</var> = <var>nil</var>)</code></a></dt><!-- RDLabel: "OCI8::BLOB#read" -->
432
- <dd>
433
- <p>read at most size bytes from BLOB, or to the end of file if size is omitted.</p>
434
- <p>example: read chunks of chunk size.</p>
435
- <pre>conn.exec("SELECT name, image FROM photo") do |name, image|
436
- chunk_size = image.chunk_size
437
- File.open(name, 'w') do |f|
438
- until image.eof?
439
- f.write(image.read(chunk_size))
440
- end
441
- end
442
- end</pre>
443
- <p>example: read at once.</p>
444
- <pre>conn.exec("SELECT name, image FROM photo") do |name, image|
445
- File.open(name, 'w') do |f|
446
- f.write(image.read)
447
- end
448
- end</pre></dd>
449
- <dt><a name="label-38" id="label-38"><code>OCI8::BLOB#write(<var>string</var>)</code></a></dt><!-- RDLabel: "OCI8::BLOB#write" -->
450
- <dd>
451
- <p>write the given string to BLOB.
452
- If old data is longer than new data, resize by <a href="#label-40">OCI8::BLOB#size=</a>.</p>
453
- <p>example: write chunks of chunk size.</p>
454
- <pre>cursor = conn.parse("INSERT INTO photo VALUES(:name, EMPTY_BLOB())")
455
- Dir["*.png"].each do |fname|
456
- cursor.exec(fname)
457
- end
458
- conn.exec("SELECT name, image FROM photo") do |name, image|
459
- chunk_size = image.chunk_size
460
- File.open(name, 'r') do |f|
461
- until f.eof?
462
- image.write(f.read(chunk_size))
463
- end
464
- image.size = f.pos
465
- end
466
- end
467
- conn.commit</pre>
468
- <p>example: write at once.</p>
469
- <pre>conn.exec("SELECT name, image FROM photo") do |name, image|
470
- File.open(name, 'r') do |f|
471
- image.write(f.read)
472
- image.size = f.pos
473
- end
474
- end</pre></dd>
475
- <dt><a name="label-39" id="label-39"><code>OCI8::BLOB#size</code></a></dt><!-- RDLabel: "OCI8::BLOB#size" -->
476
- <dd>
477
- return the size of BLOB.</dd>
478
- <dt><a name="label-40" id="label-40"><code>OCI8::BLOB#size=(<var>len</var>)</code></a></dt><!-- RDLabel: "OCI8::BLOB#size=" -->
479
- <dd>
480
- set the size of BLOB.</dd>
481
- <dt><a name="label-41" id="label-41"><code>OCI8::BLOB#chunk_size</code></a></dt><!-- RDLabel: "OCI8::BLOB#chunk_size" -->
482
- <dd>
483
- return the chunk size of BLOB.</dd>
484
- <dt><a name="label-42" id="label-42"><code>OCI8::BLOB#truncate(<var>len</var>)</code></a></dt><!-- RDLabel: "OCI8::BLOB#truncate" -->
485
- <dd>
486
- set the size of BLOB.</dd>
487
- <dt><a name="label-43" id="label-43"><code>OCI8::BLOB#pos</code></a></dt><!-- RDLabel: "OCI8::BLOB#pos" -->
488
- <dd>
489
- return the current offset of BLOB.</dd>
490
- <dt><a name="label-44" id="label-44"><code>OCI8::BLOB#pos=(<var>pos</var>)</code></a></dt><!-- RDLabel: "OCI8::BLOB#pos=" -->
491
- <dd>
492
- set the current offset of BLOB.</dd>
493
- <dt><a name="label-45" id="label-45"><code>OCI8::BLOB#eof?</code></a></dt><!-- RDLabel: "OCI8::BLOB#eof?" -->
494
- <dd>
495
- return true if BLOB is at end of file</dd>
496
- <dt><a name="label-46" id="label-46"><code>OCI8::BLOB#tell</code></a></dt><!-- RDLabel: "OCI8::BLOB#tell" -->
497
- <dd>
498
- Synonym for <a href="#label-43">OCI8::BLOB#pos</a>.</dd>
499
- <dt><a name="label-47" id="label-47"><code>OCI8::BLOB#seek(<var>pos</var>)</code></a></dt><!-- RDLabel: "OCI8::BLOB#seek" -->
500
- <dd>
501
- Synonym for <a href="#label-44">OCI8::BLOB#pos=</a>.</dd>
502
- <dt><a name="label-48" id="label-48"><code>OCI8::BLOB#rewind</code></a></dt><!-- RDLabel: "OCI8::BLOB#rewind" -->
503
- <dd>
504
- set the current offset to zero.</dd>
505
- </dl>
506
- <h2><a name="label-49" id="label-49">Appendix</a></h2><!-- RDLabel: "Appendix" -->
507
- <h3><a name="label-50" id="label-50">Blocking/Non-Blocking Mode</a></h3><!-- RDLabel: "Blocking/Non-Blocking Mode" -->
508
- <p>The default mode is blocking mode. You can change the mode by
509
- <a href="#label-19">OCI8#non_blocking=</a>.</p>
510
- <p>When the mode is blocking, heavy OCI calls will block the process
511
- itself even though multithread application because ruby's thread is
512
- not native one.</p>
513
- <p>when the mode is non-blocking, heavy OCI calls will not block the
514
- process, but block the thread only. Instead of the merit, each OCI
515
- call become a bit slower because it polls many times whether the OCI
516
- call is finished or not.</p>
517
- <p>You can cancel a OCI call by using <a href="#label-20">OCI8#break</a> from other thread.
518
- The canceled OCI call raises <var>OCIBreak</var> exception.</p>
519
- <p>Restriction of non-blocking mode: Don't do OCI calls at the same time
520
- for a same connection.</p>
521
- <hr />
522
- <p class="foottext">
523
- <a name="foottext-1" id="foottext-1" href="#footmark-1"><sup><small>*1</small></sup></a><small>Oracle
524
- Call Interface</small><br />
525
- </p>
526
- </body>
527
- </html>