ruby-oci8 2.1.5.1-x64-mingw32

Sign up to get free protection for your applications and to get access to all the features.
Files changed (64) hide show
  1. checksums.yaml +7 -0
  2. data/.yardopts +17 -0
  3. data/COPYING +30 -0
  4. data/COPYING_old +64 -0
  5. data/ChangeLog +2779 -0
  6. data/Makefile +92 -0
  7. data/NEWS +660 -0
  8. data/README.md +43 -0
  9. data/VERSION +1 -0
  10. data/dist-files +91 -0
  11. data/docs/install-binary-package.md +40 -0
  12. data/docs/install-full-client.md +116 -0
  13. data/docs/install-instant-client.md +167 -0
  14. data/docs/platform-specific-issues.md +197 -0
  15. data/docs/report-installation-issue.md +50 -0
  16. data/lib/.document +1 -0
  17. data/lib/dbd/OCI8.rb +591 -0
  18. data/lib/oci8.rb +147 -0
  19. data/lib/oci8.rb.in +147 -0
  20. data/lib/oci8/.document +8 -0
  21. data/lib/oci8/bindtype.rb +350 -0
  22. data/lib/oci8/compat.rb +113 -0
  23. data/lib/oci8/connection_pool.rb +108 -0
  24. data/lib/oci8/cursor.rb +564 -0
  25. data/lib/oci8/datetime.rb +605 -0
  26. data/lib/oci8/encoding-init.rb +79 -0
  27. data/lib/oci8/encoding.yml +537 -0
  28. data/lib/oci8/metadata.rb +2092 -0
  29. data/lib/oci8/object.rb +605 -0
  30. data/lib/oci8/oci8.rb +560 -0
  31. data/lib/oci8/ocihandle.rb +607 -0
  32. data/lib/oci8/oracle_version.rb +143 -0
  33. data/lib/oci8/properties.rb +134 -0
  34. data/lib/oci8lib_200.so +0 -0
  35. data/metaconfig +142 -0
  36. data/pre-distclean.rb +7 -0
  37. data/ruby-oci8.gemspec +80 -0
  38. data/setup.rb +1333 -0
  39. data/test/README +42 -0
  40. data/test/config.rb +184 -0
  41. data/test/setup_test_object.sql +171 -0
  42. data/test/test_all.rb +54 -0
  43. data/test/test_appinfo.rb +63 -0
  44. data/test/test_array_dml.rb +333 -0
  45. data/test/test_bind_raw.rb +46 -0
  46. data/test/test_bind_string.rb +106 -0
  47. data/test/test_bind_time.rb +178 -0
  48. data/test/test_break.rb +124 -0
  49. data/test/test_clob.rb +98 -0
  50. data/test/test_connection_pool.rb +125 -0
  51. data/test/test_connstr.rb +81 -0
  52. data/test/test_datetime.rb +581 -0
  53. data/test/test_dbi.rb +366 -0
  54. data/test/test_dbi_clob.rb +53 -0
  55. data/test/test_encoding.rb +104 -0
  56. data/test/test_error.rb +88 -0
  57. data/test/test_metadata.rb +1485 -0
  58. data/test/test_object.rb +462 -0
  59. data/test/test_oci8.rb +489 -0
  60. data/test/test_oracle_version.rb +70 -0
  61. data/test/test_oradate.rb +256 -0
  62. data/test/test_oranumber.rb +787 -0
  63. data/test/test_rowid.rb +33 -0
  64. metadata +109 -0
@@ -0,0 +1,63 @@
1
+ require 'oci8'
2
+ require 'test/unit'
3
+ require File.dirname(__FILE__) + '/config'
4
+
5
+ class TestAppInfo < Test::Unit::TestCase
6
+
7
+ def setup
8
+ @conn = get_oci8_connection
9
+ end
10
+
11
+ def test_set_client_identifier
12
+ # set client_id
13
+ client_id = "ruby-oci8:#{Process.pid()}"
14
+ @conn.client_identifier = client_id
15
+ assert_equal(client_id, @conn.select_one("SELECT SYS_CONTEXT('USERENV', 'CLIENT_IDENTIFIER') FROM DUAL")[0]);
16
+ # check the first character
17
+ assert_raise ArgumentError do
18
+ @conn.client_identifier = ':bad_identifier'
19
+ end
20
+
21
+ # clear client_id
22
+ @conn.client_identifier = nil
23
+ assert_nil(@conn.select_one("SELECT SYS_CONTEXT('USERENV', 'CLIENT_IDENTIFIER') FROM DUAL")[0]);
24
+ end
25
+
26
+ def test_set_module
27
+ # FIXME: check again after upgrading Oracle 9.2 to 9.2.0.4.
28
+ return if @conn.oracle_server_version < OCI8::ORAVER_10_1
29
+
30
+ # set module
31
+ @conn.module = 'ruby-oci8'
32
+ assert_equal('ruby-oci8', @conn.select_one("SELECT SYS_CONTEXT('USERENV', 'MODULE') FROM DUAL")[0]);
33
+ # clear module
34
+ @conn.module = nil
35
+ assert_nil(@conn.select_one("SELECT SYS_CONTEXT('USERENV', 'MODULE') FROM DUAL")[0]);
36
+ end
37
+
38
+ def test_set_action
39
+ # FIXME: check again after upgrading Oracle 9.2 to 9.2.0.4.
40
+ return if @conn.oracle_server_version < OCI8::ORAVER_10_1
41
+
42
+ # set action
43
+ @conn.action = 'test_set_action'
44
+ assert_equal('test_set_action', @conn.select_one("SELECT SYS_CONTEXT('USERENV', 'ACTION') FROM DUAL")[0]);
45
+ # clear action
46
+ @conn.action = nil
47
+ assert_nil(@conn.select_one("SELECT SYS_CONTEXT('USERENV', 'ACTION') FROM DUAL")[0]);
48
+ end
49
+
50
+ def test_set_client_info
51
+ # set client_info
52
+ client_info = "ruby-oci8:#{Process.pid()}"
53
+ @conn.client_info = client_info
54
+ assert_equal(client_info, @conn.select_one("SELECT SYS_CONTEXT('USERENV', 'CLIENT_INFO') FROM DUAL")[0]);
55
+ # clear client_info
56
+ @conn.client_info = nil
57
+ assert_nil(@conn.select_one("SELECT SYS_CONTEXT('USERENV', 'CLIENT_INFO') FROM DUAL")[0]);
58
+ end
59
+
60
+ def teardown
61
+ @conn.logoff
62
+ end
63
+ end
@@ -0,0 +1,333 @@
1
+ require 'oci8'
2
+ require 'test/unit'
3
+ require File.dirname(__FILE__) + '/config'
4
+
5
+ class TestArrayDML < Test::Unit::TestCase
6
+ def setup
7
+ @conn = get_oci8_connection
8
+ end
9
+
10
+ def teardown
11
+ @conn.logoff
12
+ end
13
+
14
+ # test inserting arrays with different data types
15
+ # including char, varchar2, number, date and so on
16
+ def test_array_insert1
17
+ drop_table('test_table')
18
+ sql = <<-EOS
19
+ CREATE TABLE test_table
20
+ (C CHAR(10) NOT NULL,
21
+ V VARCHAR2(20),
22
+ N NUMBER(10, 2),
23
+ D DATE,
24
+ INT NUMBER(30),
25
+ BIGNUM NUMBER(30),
26
+ T TIMESTAMP)
27
+ STORAGE (
28
+ INITIAL 4k
29
+ NEXT 4k
30
+ MINEXTENTS 1
31
+ MAXEXTENTS UNLIMITED
32
+ PCTINCREASE 0)
33
+ EOS
34
+ @conn.exec(sql)
35
+ cursor = @conn.parse("INSERT INTO test_table VALUES (:C, :V, :N, :D, :INT, :BIGNUM, :T)")
36
+ max_array_size = 3
37
+ cursor.max_array_size= max_array_size
38
+
39
+ cursor.bind_param_array(1, nil, String)
40
+ cursor.bind_param_array(2, nil ,String)
41
+ cursor.bind_param_array(3, nil, Fixnum)
42
+ cursor.bind_param_array(4, nil, OraDate)
43
+ cursor.bind_param_array(5, nil, Integer)
44
+ cursor.bind_param_array(6, nil, Bignum)
45
+ cursor.bind_param_array(7, nil, DateTime)
46
+
47
+ c_arr = Array.new
48
+ v_arr = Array.new
49
+ n_arr = Array.new
50
+ d_arr = Array.new
51
+ int_arr = Array.new
52
+ bignum_arr = Array.new
53
+ t_arr = Array.new
54
+
55
+ 1.upto(30) do |i|
56
+ c_arr << format("%10d", i * 10)
57
+ v_arr << i.to_s
58
+ n_arr << i
59
+ d_arr << OraDate.new(2000 + i, 12, 24, 23, 59, 59)
60
+ int_arr << i * 11111111111
61
+ bignum_arr << i * 10000000000
62
+ t_arr << DateTime.new(2000 + i, 12, 24, 23, 59, 59)
63
+
64
+ if i%max_array_size == 0
65
+ cursor[1] = c_arr
66
+ cursor[2] = v_arr
67
+ cursor[3] = n_arr
68
+ cursor[4] = d_arr
69
+ cursor[5] = int_arr
70
+ cursor[6] = bignum_arr
71
+ cursor[7] = t_arr
72
+
73
+ r = cursor.exec_array
74
+ assert_equal(max_array_size, r)
75
+ assert_equal(c_arr, cursor[1])
76
+ assert_equal(v_arr, cursor[2])
77
+ assert_equal(n_arr, cursor[3])
78
+ assert_equal(d_arr, cursor[4])
79
+ assert_equal(int_arr, cursor[5])
80
+ assert_equal(bignum_arr, cursor[6])
81
+ assert_equal(t_arr, cursor[7])
82
+ c_arr.clear
83
+ v_arr.clear
84
+ n_arr.clear
85
+ d_arr.clear
86
+ int_arr.clear
87
+ bignum_arr.clear
88
+ t_arr.clear
89
+ end
90
+ end
91
+ cursor.close
92
+
93
+ cursor = @conn.parse("SELECT * FROM test_table ORDER BY c")
94
+ cursor.define(5, Integer)
95
+ cursor.define(6, Bignum)
96
+ cursor.exec
97
+ assert_equal(["C","V","N","D","INT","BIGNUM","T"], cursor.get_col_names)
98
+ 1.upto(30) do |i|
99
+ rv = cursor.fetch
100
+ assert_equal(format("%10d", i * 10), rv[0])
101
+ assert_equal(i.to_s, rv[1])
102
+ assert_equal(i, rv[2])
103
+ tm = Time.local(2000 + i, 12, 24, 23, 59, 59)
104
+ assert_equal(tm, rv[3])
105
+ assert_equal(i * 11111111111, rv[4])
106
+ assert_equal(i * 10000000000, rv[5])
107
+ assert_equal(tm, rv[6])
108
+ end
109
+ assert_nil(cursor.fetch)
110
+ drop_table('test_table')
111
+ end
112
+
113
+ # Raise error when binding arrays are not the same size
114
+ def test_array_insert2
115
+ drop_table('test_table')
116
+ sql = <<-EOS
117
+ CREATE TABLE test_table
118
+ (N NUMBER(10, 2) NOT NULL,
119
+ V VARCHAR(20))
120
+ EOS
121
+ @conn.exec(sql)
122
+ cursor = @conn.parse("INSERT INTO test_table VALUES (:N, :V)")
123
+ max_array_size = 10
124
+ cursor.max_array_size = max_array_size
125
+ cursor.bind_param_array(1, nil, Fixnum)
126
+ cursor.bind_param_array(2, nil, String)
127
+ n_arr = Array.new
128
+ v_arr = Array.new
129
+ 1.upto(max_array_size) do |i|
130
+ n_arr << i
131
+ v_arr << i.to_s if i != max_array_size
132
+ end
133
+ cursor[1] = n_arr
134
+ assert_raise(RuntimeError) { cursor[2] = v_arr }
135
+ cursor.close
136
+
137
+ drop_table('test_table')
138
+ end
139
+
140
+ # All binds are clear from cursor after calling "max_array_size=",
141
+ # in that case, you have to re-bind the array parameters
142
+ # otherwise, an error will be raised.
143
+ def test_array_insert3
144
+ drop_table('test_table')
145
+ sql = <<-EOS
146
+ CREATE TABLE test_table
147
+ (N NUMBER(10, 2) NOT NULL,
148
+ V VARCHAR(20),
149
+ T TIMESTAMP)
150
+ EOS
151
+ @conn.exec(sql)
152
+ cursor = @conn.parse("INSERT INTO test_table VALUES (:N, :V, :T)")
153
+ cursor.max_array_size = 3
154
+ cursor.bind_param_array(1, [1, 2, 3])
155
+ cursor.bind_param_array(2, ['happy', 'new', 'year'])
156
+ cursor.bind_param_array(3, [Time.gm(1990,1,1), Time.gm(2000,1,1), Time.gm(2010,1,1)])
157
+ assert_nothing_raised() { cursor.exec_array }
158
+ cursor.max_array_size = 2
159
+ assert_raise(RuntimeError) { cursor.exec_array }
160
+ drop_table('test_table')
161
+ end
162
+
163
+ # The size of binding arrays are not required to be same as max_array_size. The
164
+ # only requirement is that they should be the same size, and the size will be
165
+ # used as execution count for OCIStmtExecute.
166
+ def test_array_insert4
167
+ drop_table('test_table')
168
+ sql = <<-EOS
169
+ CREATE TABLE test_table
170
+ (N NUMBER(10, 2) NOT NULL,
171
+ V VARCHAR(20))
172
+ EOS
173
+ @conn.exec(sql)
174
+ cursor = @conn.parse("INSERT INTO test_table VALUES (:N, :V)")
175
+ max_array_size = 4
176
+ cursor.max_array_size = max_array_size
177
+ cursor.bind_param_array(1, nil, Fixnum)
178
+ cursor.bind_param_array(2, nil, String)
179
+ n_arr = Array.new
180
+ v_arr = Array.new
181
+ 1.upto( max_array_size - 1 ) do |i|
182
+ n_arr << i
183
+ v_arr << i.to_s
184
+ end
185
+ cursor[1] = n_arr
186
+ cursor[2] = v_arr
187
+ assert_nothing_raised() { cursor.exec_array }
188
+ cursor.close
189
+
190
+ cursor = @conn.parse("SELECT * FROM test_table ORDER BY N")
191
+ cursor.exec
192
+ 1.upto( max_array_size - 1 ) do |i|
193
+ rv = cursor.fetch
194
+ assert_equal(i, rv[0])
195
+ assert_equal(i.to_s, rv[1])
196
+ end
197
+ assert_nil(cursor.fetch)
198
+ cursor.close
199
+ drop_table('test_table')
200
+ end
201
+
202
+ # Inserting "nil" elements with array dml raises an error
203
+ def test_array_insert5
204
+ drop_table('test_table')
205
+ sql = <<-EOS
206
+ CREATE TABLE test_table
207
+ (N NUMBER(10, 2),
208
+ V VARCHAR(20))
209
+ EOS
210
+ @conn.exec(sql)
211
+ cursor = @conn.parse("INSERT INTO test_table VALUES (:N, :V)")
212
+ max_array_size = 3
213
+ cursor.max_array_size = max_array_size
214
+ cursor.bind_param_array(1, nil, Fixnum)
215
+ cursor.bind_param_array(2, nil, String)
216
+ assert_raise(RuntimeError) { cursor.exec_array }
217
+ cursor.close
218
+ drop_table('test_table')
219
+ end
220
+
221
+ # delete with array bindings
222
+ def test_array_delete
223
+ drop_table('test_table')
224
+ sql = <<-EOS
225
+ CREATE TABLE test_table
226
+ (N NUMBER(10, 2),
227
+ V VARCHAR(20))
228
+ EOS
229
+ @conn.exec(sql)
230
+ cursor = @conn.parse("INSERT INTO test_table VALUES (:N, :V)")
231
+ max_array_size = 10
232
+ cursor.max_array_size = max_array_size
233
+ n_arr = Array.new
234
+ v_arr = Array.new
235
+ 1.upto( max_array_size) do |i|
236
+ n_arr << i
237
+ v_arr << i.to_s
238
+ end
239
+ cursor.bind_param_array(1, nil, Fixnum)
240
+ cursor.bind_param_array(2, nil, String)
241
+ cursor[1] = n_arr
242
+ cursor[2] = v_arr
243
+ cursor.exec_array
244
+ cursor.close
245
+
246
+ cursor = @conn.parse("DELETE FROM test_table WHERE N=:1")
247
+ cursor.max_array_size = max_array_size
248
+ delete_arr = Array.new
249
+ 1.upto(max_array_size) do |i|
250
+ if i%2 == 0
251
+ delete_arr << i
252
+ end
253
+ end
254
+ cursor.bind_param_array(1, nil, Fixnum)
255
+ cursor[1] = delete_arr
256
+ cursor.exec_array
257
+ cursor.close
258
+
259
+ cursor = @conn.parse("SELECT * FROM test_table ORDER BY N")
260
+ cursor.exec
261
+ 1.upto( max_array_size ) do |i|
262
+ if i%2 != 0
263
+ rv = cursor.fetch
264
+ assert_equal(rv[0], i)
265
+ assert_equal(rv[1], i.to_s)
266
+ end
267
+ end
268
+ assert_nil(cursor.fetch)
269
+ cursor.close
270
+
271
+ drop_table('test_table')
272
+ end
273
+
274
+ # update with array bindings
275
+ def test_array_update
276
+ drop_table('test_table')
277
+ sql = <<-EOS
278
+ CREATE TABLE test_table
279
+ (N NUMBER(10, 2),
280
+ V VARCHAR(20))
281
+ EOS
282
+ @conn.exec(sql)
283
+ cursor = @conn.parse("INSERT INTO test_table VALUES (:N, :V)")
284
+ max_array_size = 10
285
+ cursor.max_array_size = max_array_size
286
+ n_arr = Array.new
287
+ v_arr = Array.new
288
+ 1.upto( max_array_size) do |i|
289
+ n_arr << i
290
+ v_arr << i.to_s
291
+ end
292
+ cursor.bind_param_array(1, nil, Fixnum)
293
+ cursor.bind_param_array(2, nil, String)
294
+ cursor[1] = n_arr
295
+ cursor[2] = v_arr
296
+ cursor.exec_array
297
+ cursor.close
298
+
299
+ cursor = @conn.parse("UPDATE test_table SET V=:1 WHERE N=:2")
300
+ cursor.max_array_size = max_array_size
301
+ update_arr = Array.new
302
+ update_v_arr = Array.new
303
+ 1.upto(max_array_size) do |i|
304
+ if i%2 == 0
305
+ update_arr << i
306
+ update_v_arr << (i * 10).to_s
307
+ end
308
+ end
309
+ cursor.bind_param_array(1, nil, String)
310
+ cursor.bind_param_array(2, nil, Fixnum)
311
+ cursor[1] = update_v_arr
312
+ cursor[2] = update_arr
313
+ cursor.exec_array
314
+ cursor.close
315
+
316
+ cursor = @conn.parse("SELECT * FROM test_table ORDER BY N")
317
+ cursor.exec
318
+ 1.upto( max_array_size ) do |i|
319
+ rv = cursor.fetch
320
+ if i%2 != 0
321
+ assert_equal(rv[0], i)
322
+ assert_equal(rv[1], i.to_s)
323
+ else
324
+ assert_equal(rv[0], i)
325
+ assert_equal(rv[1], (i * 10).to_s)
326
+ end
327
+ end
328
+ assert_nil(cursor.fetch)
329
+
330
+ cursor.close
331
+ drop_table('test_table')
332
+ end
333
+ end
@@ -0,0 +1,46 @@
1
+ # Low-level API
2
+ require 'oci8'
3
+ require 'test/unit'
4
+ require File.dirname(__FILE__) + '/config'
5
+
6
+ class TestBindRaw < Test::Unit::TestCase
7
+ CHECK_TARGET = [
8
+ ["0123456789:;<=>?", "303132333435363738393A3B3C3D3E3F"],
9
+ ["@ABCDEFGHIJKLMNO", "404142434445464748494A4B4C4D4E4F"],
10
+ ["PQRSTUVWXYZ[\\]^_", "505152535455565758595A5B5C5D5E5F"],
11
+ ["`abcdefghijklmno", "606162636465666768696A6B6C6D6E6F"],
12
+ ["pqrstuvwxyz{|}~", "707172737475767778797A7B7C7D7E"],
13
+ ]
14
+
15
+ def setup
16
+ @conn = get_oci8_connection()
17
+ end
18
+
19
+ def test_set_raw
20
+ cursor = @conn.parse("BEGIN :hex := RAWTOHEX(:raw); END;")
21
+ cursor.bind_param(:raw, nil, OCI8::RAW, 16)
22
+ cursor.bind_param(:hex, nil, String, 32)
23
+
24
+ CHECK_TARGET.each do |raw, hex|
25
+ cursor[:raw] = raw
26
+ cursor.exec
27
+ assert_equal(hex, cursor[:hex])
28
+ end
29
+ end
30
+
31
+ def test_get_raw
32
+ cursor = @conn.parse("BEGIN :raw := HEXTORAW(:hex); END;")
33
+ cursor.bind_param(:hex, nil, String, 32)
34
+ cursor.bind_param(:raw, nil, OCI8::RAW, 16)
35
+
36
+ CHECK_TARGET.each do |raw, hex|
37
+ cursor[:hex] = hex
38
+ cursor.exec
39
+ assert_equal(raw, cursor[:raw])
40
+ end
41
+ end
42
+
43
+ def teardown
44
+ @conn.logoff
45
+ end
46
+ end
@@ -0,0 +1,106 @@
1
+ # -*- coding: utf-8 -*-
2
+ require 'oci8'
3
+ require 'test/unit'
4
+ require File.dirname(__FILE__) + '/config'
5
+
6
+ class TestBindString < Test::Unit::TestCase
7
+ def setup
8
+ @conn = get_oci8_connection
9
+ end
10
+
11
+ def teardown
12
+ @conn.logoff
13
+ end
14
+
15
+ if OCI8.client_charset_name.include? 'UTF8'
16
+
17
+ def test_bind_string_as_nchar
18
+ if ['AL32UTF8', 'UTF8', 'ZHS32GB18030'].include? @conn.database_charset_name
19
+ warn "Skip test_bind_string_as_nchar. It needs Oracle server whose database chracter set is incompatible with unicode."
20
+ else
21
+ drop_table('test_table')
22
+ @conn.exec("CREATE TABLE test_table (ID NUMBER(5), V VARCHAR2(10), NV1 NVARCHAR2(10), NV2 NVARCHAR2(10))")
23
+
24
+ orig_prop = OCI8.properties[:bind_string_as_nchar]
25
+ begin
26
+ utf8_string = "a¡あ"
27
+
28
+ OCI8.properties[:bind_string_as_nchar] = false
29
+ @conn.exec("INSERT INTO test_table VALUES (1, N'#{utf8_string}', N'#{utf8_string}', :1)", utf8_string)
30
+ v, nv1, nv2 = @conn.select_one('select V, NV1, NV2 from test_table where ID = 1')
31
+ assert_not_equal(utf8_string, v) # Some UTF-8 chracters should be garbled.
32
+ assert_equal(utf8_string, nv1) # No garbled characters
33
+ assert_equal(v, nv2) # Garbled as VARCHAR2 column.
34
+
35
+ OCI8.properties[:bind_string_as_nchar] = true
36
+ @conn.exec("INSERT INTO test_table VALUES (2, N'#{utf8_string}', N'#{utf8_string}', :1)", utf8_string)
37
+ v, nv1, nv2 = @conn.select_one('select V, NV1, NV2 from test_table where ID = 2')
38
+ assert_not_equal(utf8_string, v) # Some UTF-8 chracters should be garbled.
39
+ assert_equal(utf8_string, nv1) # No garbled characters
40
+ assert_equal(nv1, nv2) # Same as NVARCHAR2.
41
+
42
+ @conn.commit
43
+ ensure
44
+ OCI8.properties[:bind_string_as_nchar] = orig_prop
45
+ end
46
+ end
47
+ end
48
+
49
+ def test_length_semantics # This test needs to be revised.
50
+ orig_prop = OCI8.properties[:length_semantics]
51
+ begin
52
+ utf8_string = "a¡あ"
53
+
54
+ OCI8.properties[:length_semantics] = :byte
55
+ assert_equal(:byte, OCI8.properties[:length_semantics])
56
+ cursor = @conn.parse <<EOS
57
+ DECLARE
58
+ TMP VARCHAR2(6);
59
+ BEGIN
60
+ TMP := :in;
61
+ :out := TMP;
62
+ END;
63
+ EOS
64
+ cursor.bind_param(:in, utf8_string)
65
+ cursor.bind_param(:out, nil, String, 5)
66
+ begin
67
+ cursor.exec
68
+ rescue OCIError
69
+ assert_equal(6502, $!.code)
70
+ end
71
+ cursor.bind_param(:out, nil, String, 6)
72
+ cursor.exec
73
+ assert_equal(utf8_string, cursor[:out])
74
+
75
+ OCI8.properties[:length_semantics] = :char
76
+ assert_equal(:char, OCI8.properties[:length_semantics])
77
+ cursor = @conn.parse <<EOS
78
+ DECLARE
79
+ TMP VARCHAR2(6);
80
+ BEGIN
81
+ TMP := :in;
82
+ :out := TMP;
83
+ END;
84
+ EOS
85
+ cursor.bind_param(:in, utf8_string, String, 3)
86
+ cursor.bind_param(:out, nil, String, 2)
87
+ begin
88
+ cursor.exec
89
+ rescue OCIError
90
+ assert_equal(6502, $!.code)
91
+ end
92
+ cursor.bind_param(:out, nil, String, 3)
93
+ cursor.exec
94
+ assert_equal(utf8_string, cursor[:out])
95
+ ensure
96
+ OCI8.properties[:length_semantics] = orig_prop
97
+ end
98
+ end
99
+
100
+ else
101
+
102
+ def test_dummy
103
+ # to suppress "No tests were specified."
104
+ end
105
+ end
106
+ end