ruby-oci8 2.1.5.1-x64-mingw32
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/.yardopts +17 -0
- data/COPYING +30 -0
- data/COPYING_old +64 -0
- data/ChangeLog +2779 -0
- data/Makefile +92 -0
- data/NEWS +660 -0
- data/README.md +43 -0
- data/VERSION +1 -0
- data/dist-files +91 -0
- data/docs/install-binary-package.md +40 -0
- data/docs/install-full-client.md +116 -0
- data/docs/install-instant-client.md +167 -0
- data/docs/platform-specific-issues.md +197 -0
- data/docs/report-installation-issue.md +50 -0
- data/lib/.document +1 -0
- data/lib/dbd/OCI8.rb +591 -0
- data/lib/oci8.rb +147 -0
- data/lib/oci8.rb.in +147 -0
- data/lib/oci8/.document +8 -0
- data/lib/oci8/bindtype.rb +350 -0
- data/lib/oci8/compat.rb +113 -0
- data/lib/oci8/connection_pool.rb +108 -0
- data/lib/oci8/cursor.rb +564 -0
- data/lib/oci8/datetime.rb +605 -0
- data/lib/oci8/encoding-init.rb +79 -0
- data/lib/oci8/encoding.yml +537 -0
- data/lib/oci8/metadata.rb +2092 -0
- data/lib/oci8/object.rb +605 -0
- data/lib/oci8/oci8.rb +560 -0
- data/lib/oci8/ocihandle.rb +607 -0
- data/lib/oci8/oracle_version.rb +143 -0
- data/lib/oci8/properties.rb +134 -0
- data/lib/oci8lib_200.so +0 -0
- data/metaconfig +142 -0
- data/pre-distclean.rb +7 -0
- data/ruby-oci8.gemspec +80 -0
- data/setup.rb +1333 -0
- data/test/README +42 -0
- data/test/config.rb +184 -0
- data/test/setup_test_object.sql +171 -0
- data/test/test_all.rb +54 -0
- data/test/test_appinfo.rb +63 -0
- data/test/test_array_dml.rb +333 -0
- data/test/test_bind_raw.rb +46 -0
- data/test/test_bind_string.rb +106 -0
- data/test/test_bind_time.rb +178 -0
- data/test/test_break.rb +124 -0
- data/test/test_clob.rb +98 -0
- data/test/test_connection_pool.rb +125 -0
- data/test/test_connstr.rb +81 -0
- data/test/test_datetime.rb +581 -0
- data/test/test_dbi.rb +366 -0
- data/test/test_dbi_clob.rb +53 -0
- data/test/test_encoding.rb +104 -0
- data/test/test_error.rb +88 -0
- data/test/test_metadata.rb +1485 -0
- data/test/test_object.rb +462 -0
- data/test/test_oci8.rb +489 -0
- data/test/test_oracle_version.rb +70 -0
- data/test/test_oradate.rb +256 -0
- data/test/test_oranumber.rb +787 -0
- data/test/test_rowid.rb +33 -0
- metadata +109 -0
@@ -0,0 +1,2092 @@
|
|
1
|
+
# oci8.rb -- implements OCI8::Metadata.
|
2
|
+
#
|
3
|
+
# Copyright (C) 2006-2013 Kubo Takehiro <kubo@jiubao.org>
|
4
|
+
#
|
5
|
+
# See {'Describing Schema Metadata' in Oracle Call Interface Programmer's Guide}
|
6
|
+
# [http://download-west.oracle.com/docs/cd/B19306_01/appdev.102/b14250/oci06des.htm]
|
7
|
+
|
8
|
+
#
|
9
|
+
class OCI8
|
10
|
+
|
11
|
+
# OCI8 has methods to obtain information about database objects such
|
12
|
+
# as tables, views, procedures, functions ans so on. The obtained
|
13
|
+
# data are called metadata and retrived as an instance of
|
14
|
+
# OCI8::Metadata::Base's subclass.
|
15
|
+
#
|
16
|
+
# List of methods which return OCI8::Metadata::Base.
|
17
|
+
# * {OCI8#describe_any OCI8#describe_any(object_name)}
|
18
|
+
# * {OCI8#describe_table OCI8#describe_table(table_name, table_only = false)}
|
19
|
+
# * {OCI8#describe_view OCI8#describe_view(view_name)}
|
20
|
+
# * {OCI8#describe_procedure OCI8#describe_procedure(procedure_name)}
|
21
|
+
# * {OCI8#describe_function OCI8#describe_function(function_name)}
|
22
|
+
# * {OCI8#describe_package OCI8#describe_package(package_name)}
|
23
|
+
# * {OCI8#describe_type OCI8#describe_type(type_name)}
|
24
|
+
# * {OCI8#describe_synonym OCI8#describe_synonym(synonym_name, check_public_also = true)}
|
25
|
+
# * {OCI8#describe_sequence OCI8#describe_sequence(sequence_name)}
|
26
|
+
# * {OCI8#describe_schema OCI8#describe_schema(schema_name)}
|
27
|
+
# * {OCI8#describe_database OCI8#describe_database(database_name)}
|
28
|
+
# * {OCI8::Metadata::Type#map_method OCI8::Metadata::Type#map_method}
|
29
|
+
# * {OCI8::Metadata::Type#order_method OCI8::Metadata::Type#order_method}
|
30
|
+
# * {OCI8::Metadata::Type#collection_element OCI8::Metadata::Type#collection_element}
|
31
|
+
#
|
32
|
+
# List of methods which return an array of OCI8::Metadata::Base.
|
33
|
+
# * {OCI8::Cursor#column_metadata OCI8::Cursor#column_metadata}
|
34
|
+
# * {OCI8::Metadata::Database#schemas OCI8::Metadata::Database#schemas}
|
35
|
+
# * {OCI8::Metadata::Schema#all_objects OCI8::Metadata::Schema#all_objects}
|
36
|
+
# * {OCI8::Metadata::Schema#objects OCI8::Metadata::Schema#objects}
|
37
|
+
# * {OCI8::Metadata::Table#columns OCI8::Metadata::Table#columns}
|
38
|
+
# * {OCI8::Metadata::Package#subprograms OCI8::Metadata::Package#subprograms}
|
39
|
+
# * {OCI8::Metadata::Subprogram#arguments OCI8::Metadata::Procedure#arguments}
|
40
|
+
# * {OCI8::Metadata::Subprogram#arguments OCI8::Metadata::Function#arguments}
|
41
|
+
# * {OCI8::Metadata::Type#type_attrs OCI8::Metadata::Type#type_attrs}
|
42
|
+
# * {OCI8::Metadata::Type#type_methods OCI8::Metadata::Type#type_methods}
|
43
|
+
# * {OCI8::Metadata::TypeMethod#arguments OCI8::Metadata::TypeMethod#arguments}
|
44
|
+
#
|
45
|
+
# Example:
|
46
|
+
# conn = OCI8.new('username/passord')
|
47
|
+
# table = conn.describe_table('scott.emp')
|
48
|
+
# table.columns.each do |col|
|
49
|
+
# puts "#{col.name} #{col.data_type_string}"
|
50
|
+
# end
|
51
|
+
module Metadata
|
52
|
+
# Abstract super class of Metadata classes.
|
53
|
+
class Base
|
54
|
+
# Table 6-1 Attributes Belonging to All Parameters
|
55
|
+
|
56
|
+
# Returns the number of parameters.
|
57
|
+
def num_params
|
58
|
+
attr_get_ub2(OCI_ATTR_NUM_PARAMS)
|
59
|
+
end
|
60
|
+
private :num_params
|
61
|
+
|
62
|
+
# Returns the object ID which corresponds to the data dictionary
|
63
|
+
# view column ALL_OBJECTS.OBJECT_ID.
|
64
|
+
#
|
65
|
+
# @return [Integer or nil]
|
66
|
+
def obj_id
|
67
|
+
attr_get_ub4(OCI_ATTR_OBJ_ID, false)
|
68
|
+
end
|
69
|
+
|
70
|
+
# Returns the object name which corresponds to the data dictionary view column ALL_OBJECTS.OBJECT_NAME.
|
71
|
+
#
|
72
|
+
# @return [String or nil] object name
|
73
|
+
def obj_name
|
74
|
+
attr_get_string(OCI_ATTR_OBJ_NAME, false)
|
75
|
+
end
|
76
|
+
|
77
|
+
# Returns the schema name which corresponds to the data dictionary view column ALL_OBJECTS.OWNER.
|
78
|
+
#
|
79
|
+
# @return [String or nil] schema name
|
80
|
+
def obj_schema
|
81
|
+
attr_get_string(OCI_ATTR_OBJ_SCHEMA, false)
|
82
|
+
end
|
83
|
+
|
84
|
+
# The timestamp of the object
|
85
|
+
#-
|
86
|
+
# As far as I checked, it is current timestamp, not the object's timestamp. Why?
|
87
|
+
#+
|
88
|
+
#def timestamp
|
89
|
+
# attr_get_oradate(OCI_ATTR_TIMESTAMP)
|
90
|
+
#end
|
91
|
+
|
92
|
+
# @private
|
93
|
+
def inspect
|
94
|
+
"#<#{self.class.name}:(#{obj_id}) #{obj_schema}.#{obj_name}>"
|
95
|
+
end
|
96
|
+
private
|
97
|
+
|
98
|
+
def __boolean(idx)
|
99
|
+
attr_get_ub1(idx) == 0 ? false : true
|
100
|
+
end
|
101
|
+
alias __word attr_get_sb4
|
102
|
+
def __anydata(idx); raise NotImplementedError; end
|
103
|
+
|
104
|
+
# Mapping from SQLT values to names
|
105
|
+
# @private
|
106
|
+
DATA_TYPE_MAP = {}
|
107
|
+
|
108
|
+
# SQLT_CHR
|
109
|
+
DATA_TYPE_MAP[1] = [:varchar2,
|
110
|
+
Proc.new do |p|
|
111
|
+
if p.charset_form == :nchar
|
112
|
+
"NVARCHAR2(#{p.char_size})"
|
113
|
+
elsif p.char_used?
|
114
|
+
"VARCHAR2(#{p.char_size} CHAR)"
|
115
|
+
else
|
116
|
+
"VARCHAR2(#{p.data_size})"
|
117
|
+
end
|
118
|
+
end]
|
119
|
+
# SQLT_NUM
|
120
|
+
DATA_TYPE_MAP[2] = [:number,
|
121
|
+
Proc.new do |p|
|
122
|
+
begin
|
123
|
+
case p.scale
|
124
|
+
when -127
|
125
|
+
case p.precision
|
126
|
+
when 0
|
127
|
+
"NUMBER"
|
128
|
+
when 126
|
129
|
+
"FLOAT"
|
130
|
+
else
|
131
|
+
"FLOAT(#{p.precision})"
|
132
|
+
end
|
133
|
+
when 0
|
134
|
+
case p.precision
|
135
|
+
when 0
|
136
|
+
"NUMBER"
|
137
|
+
else
|
138
|
+
"NUMBER(#{p.precision})"
|
139
|
+
end
|
140
|
+
else
|
141
|
+
"NUMBER(#{p.precision},#{p.scale})"
|
142
|
+
end
|
143
|
+
rescue OCIError
|
144
|
+
"NUMBER"
|
145
|
+
end
|
146
|
+
end]
|
147
|
+
# SQLT_LNG
|
148
|
+
DATA_TYPE_MAP[8] = [:long, "LONG"]
|
149
|
+
# SQLT_DAT
|
150
|
+
DATA_TYPE_MAP[12] = [:date, "DATE"]
|
151
|
+
# SQLT_BIN
|
152
|
+
DATA_TYPE_MAP[23] = [:raw,
|
153
|
+
Proc.new do |p|
|
154
|
+
"RAW(#{p.data_size})"
|
155
|
+
end]
|
156
|
+
# SQLT_LBI
|
157
|
+
DATA_TYPE_MAP[24] = [:long_raw, "LONG RAW"]
|
158
|
+
# SQLT_AFC
|
159
|
+
DATA_TYPE_MAP[96] = [:char,
|
160
|
+
Proc.new do |p|
|
161
|
+
if p.charset_form == :nchar
|
162
|
+
"NCHAR(#{p.char_size})"
|
163
|
+
elsif p.char_used?
|
164
|
+
"CHAR(#{p.char_size} CHAR)"
|
165
|
+
else
|
166
|
+
"CHAR(#{p.data_size})"
|
167
|
+
end
|
168
|
+
end]
|
169
|
+
# SQLT_IBFLOAT
|
170
|
+
DATA_TYPE_MAP[100] = [:binary_float, "BINARY_FLOAT"]
|
171
|
+
# SQLT_IBDOUBLE
|
172
|
+
DATA_TYPE_MAP[101] = [:binary_double, "BINARY_DOUBLE"]
|
173
|
+
# SQLT_RDD
|
174
|
+
DATA_TYPE_MAP[104] = [:rowid, "ROWID"]
|
175
|
+
# SQLT_NTY
|
176
|
+
DATA_TYPE_MAP[108] = [:named_type,
|
177
|
+
Proc.new do |p|
|
178
|
+
"#{p.schema_name}.#{p.type_name}"
|
179
|
+
end]
|
180
|
+
# SQLT_REF
|
181
|
+
DATA_TYPE_MAP[110] = [:ref,
|
182
|
+
Proc.new do |p|
|
183
|
+
"REF #{p.schema_name}.#{p.type_name}"
|
184
|
+
end]
|
185
|
+
# SQLT_CLOB
|
186
|
+
DATA_TYPE_MAP[112] = [:clob,
|
187
|
+
Proc.new do |p|
|
188
|
+
if p.charset_form == :nchar
|
189
|
+
"NCLOB"
|
190
|
+
else
|
191
|
+
"CLOB"
|
192
|
+
end
|
193
|
+
end]
|
194
|
+
# SQLT_BLOB
|
195
|
+
DATA_TYPE_MAP[113] = [:blob, "BLOB"]
|
196
|
+
# SQLT_BFILE
|
197
|
+
DATA_TYPE_MAP[114] = [:bfile, "BFILE"]
|
198
|
+
# SQLT_RSET
|
199
|
+
DATA_TYPE_MAP[116] = [:cursor, "CURSOR"]
|
200
|
+
# SQLT_TIMESTAMP
|
201
|
+
DATA_TYPE_MAP[187] = [:timestamp,
|
202
|
+
Proc.new do |p|
|
203
|
+
fsprecision = p.fsprecision
|
204
|
+
if fsprecision == 6
|
205
|
+
"TIMESTAMP"
|
206
|
+
else
|
207
|
+
"TIMESTAMP(#{fsprecision})"
|
208
|
+
end
|
209
|
+
end]
|
210
|
+
# SQLT_TIMESTAMP_TZ
|
211
|
+
DATA_TYPE_MAP[188] = [:timestamp_tz,
|
212
|
+
Proc.new do |p|
|
213
|
+
fsprecision = p.fsprecision
|
214
|
+
if fsprecision == 6
|
215
|
+
"TIMESTAMP WITH TIME ZONE"
|
216
|
+
else
|
217
|
+
"TIMESTAMP(#{fsprecision}) WITH TIME ZONE"
|
218
|
+
end
|
219
|
+
end]
|
220
|
+
# SQLT_INTERVAL_YM
|
221
|
+
DATA_TYPE_MAP[189] = [:interval_ym,
|
222
|
+
Proc.new do |p|
|
223
|
+
lfprecision = p.lfprecision
|
224
|
+
if lfprecision == 2
|
225
|
+
"INTERVAL YEAR TO MONTH"
|
226
|
+
else
|
227
|
+
"INTERVAL YEAR(#{lfprecision}) TO MONTH"
|
228
|
+
end
|
229
|
+
end]
|
230
|
+
# SQLT_INTERVAL_DS
|
231
|
+
DATA_TYPE_MAP[190] = [:interval_ds,
|
232
|
+
Proc.new do |p|
|
233
|
+
lfprecision = p.lfprecision
|
234
|
+
fsprecision = p.fsprecision
|
235
|
+
if lfprecision == 2 && fsprecision == 6
|
236
|
+
"INTERVAL DAY TO SECOND"
|
237
|
+
else
|
238
|
+
"INTERVAL DAY(#{lfprecision}) TO SECOND(#{fsprecision})"
|
239
|
+
end
|
240
|
+
end]
|
241
|
+
# SQLT_TIMESTAMP_LTZ
|
242
|
+
DATA_TYPE_MAP[232] = [:timestamp_ltz,
|
243
|
+
Proc.new do |p|
|
244
|
+
fsprecision = p.fsprecision
|
245
|
+
if fsprecision == 6
|
246
|
+
"TIMESTAMP WITH LOCAL TIME ZONE"
|
247
|
+
else
|
248
|
+
"TIMESTAMP(#{fsprecision}) WITH LOCAL TIME ZONE"
|
249
|
+
end
|
250
|
+
end]
|
251
|
+
|
252
|
+
def __data_type # :nodoc:
|
253
|
+
return @data_type if defined? @data_type
|
254
|
+
entry = DATA_TYPE_MAP[attr_get_ub2(OCI_ATTR_DATA_TYPE)]
|
255
|
+
type = entry.nil? ? attr_get_ub2(OCI_ATTR_DATA_TYPE) : entry[0]
|
256
|
+
type = type.call(self) if type.is_a? Proc
|
257
|
+
@data_type = type
|
258
|
+
end
|
259
|
+
|
260
|
+
def __duration # :nodoc:
|
261
|
+
case attr_get_ub2(OCI_ATTR_DURATION)
|
262
|
+
when OCI_DURATION_SESSION
|
263
|
+
:session
|
264
|
+
when OCI_DURATION_TRANS
|
265
|
+
:transaction
|
266
|
+
when OCI_DURATION_NULL
|
267
|
+
nil
|
268
|
+
end
|
269
|
+
end
|
270
|
+
|
271
|
+
def __charset_form # :nodoc:
|
272
|
+
case attr_get_ub1(OCI_ATTR_CHARSET_FORM)
|
273
|
+
when 1; :implicit # for CHAR, VARCHAR2, CLOB w/o a specified set
|
274
|
+
when 2; :nchar # for NCHAR, NCHAR VARYING, NCLOB
|
275
|
+
when 3; :explicit # for CHAR, etc, with "CHARACTER SET ..." syntax
|
276
|
+
when 4; :flexible # for PL/SQL "flexible" parameters
|
277
|
+
when 5; :lit_null # for typecheck of NULL and empty_clob() lits
|
278
|
+
end
|
279
|
+
end
|
280
|
+
|
281
|
+
def __data_type_string # :nodoc:
|
282
|
+
entry = DATA_TYPE_MAP[attr_get_ub2(OCI_ATTR_DATA_TYPE)]
|
283
|
+
type = entry.nil? ? "unknown(#{attr_get_ub2(OCI_ATTR_DATA_TYPE)})" : entry[1]
|
284
|
+
type = type.call(self) if type.is_a? Proc
|
285
|
+
if respond_to?(:nullable?) && !nullable?
|
286
|
+
type + " NOT NULL"
|
287
|
+
else
|
288
|
+
type
|
289
|
+
end
|
290
|
+
end
|
291
|
+
|
292
|
+
def __typecode(idx) # :nodoc:
|
293
|
+
case attr_get_ub2(idx)
|
294
|
+
when 110; :ref # OCI_TYPECODE_REF
|
295
|
+
when 12; :date # OCI_TYPECODE_DATE
|
296
|
+
when 27; :signed8 # OCI_TYPECODE_SIGNED8
|
297
|
+
when 28; :signed16 # OCI_TYPECODE_SIGNED16
|
298
|
+
when 29; :signed32 # OCI_TYPECODE_SIGNED32
|
299
|
+
when 21; :real # OCI_TYPECODE_REAL
|
300
|
+
when 22; :double # OCI_TYPECODE_DOUBLE
|
301
|
+
when 100; :binary_float # OCI_TYPECODE_BFLOAT
|
302
|
+
when 101; :binary_double # OCI_TYPECODE_BDOUBLE
|
303
|
+
when 4; :float # OCI_TYPECODE_FLOAT
|
304
|
+
when 2; :number # OCI_TYPECODE_NUMBER
|
305
|
+
when 7; :decimal # OCI_TYPECODE_DECIMAL
|
306
|
+
when 23; :unsigned8 # OCI_TYPECODE_UNSIGNED8
|
307
|
+
when 25; :unsigned16 # OCI_TYPECODE_UNSIGNED16
|
308
|
+
when 26; :unsigned32 # OCI_TYPECODE_UNSIGNED32
|
309
|
+
when 245; :octet # OCI_TYPECODE_OCTET
|
310
|
+
when 246; :smallint # OCI_TYPECODE_SMALLINT
|
311
|
+
when 3; :integer # OCI_TYPECODE_INTEGER
|
312
|
+
when 95; :raw # OCI_TYPECODE_RAW
|
313
|
+
when 32; :ptr # OCI_TYPECODE_PTR
|
314
|
+
when 9; :varchar2 # OCI_TYPECODE_VARCHAR2
|
315
|
+
when 96; :char # OCI_TYPECODE_CHAR
|
316
|
+
when 1; :varchar # OCI_TYPECODE_VARCHAR
|
317
|
+
when 105; :mlslabel # OCI_TYPECODE_MLSLABEL
|
318
|
+
when 247; :varray # OCI_TYPECODE_VARRAY
|
319
|
+
when 248; :table # OCI_TYPECODE_TABLE
|
320
|
+
when 108; :named_type # OCI_TYPECODE_OBJECT
|
321
|
+
when 58; :opaque # OCI_TYPECODE_OPAQUE
|
322
|
+
when 122; :named_collection # OCI_TYPECODE_NAMEDCOLLECTION
|
323
|
+
when 113; :blob # OCI_TYPECODE_BLOB
|
324
|
+
when 114; :bfile # OCI_TYPECODE_BFILE
|
325
|
+
when 112; :clob # OCI_TYPECODE_CLOB
|
326
|
+
when 115; :cfile # OCI_TYPECODE_CFILE
|
327
|
+
when 185; :time # OCI_TYPECODE_TIME
|
328
|
+
when 186; :time_tz # OCI_TYPECODE_TIME_TZ
|
329
|
+
when 187; :timestamp # OCI_TYPECODE_TIMESTAMP
|
330
|
+
when 188; :timestamp_tz # OCI_TYPECODE_TIMESTAMP_TZ
|
331
|
+
when 232; :timestamp_ltz # OCI_TYPECODE_TIMESTAMP_LTZ
|
332
|
+
when 189; :interval_ym # OCI_TYPECODE_INTERVAL_YM
|
333
|
+
when 190; :interval_ds # OCI_TYPECODE_INTERVAL_DS
|
334
|
+
when 104; :urowid # OCI_TYPECODE_UROWID
|
335
|
+
#when 228; :otmfirst # OCI_TYPECODE_OTMFIRST
|
336
|
+
#when 320; :otmlast # OCI_TYPECODE_OTMLAST
|
337
|
+
#when 228; :sysfirst # OCI_TYPECODE_SYSFIRST
|
338
|
+
#when 235; :syslast # OCI_TYPECODE_SYSLAST
|
339
|
+
when 266; :pls_integer # OCI_TYPECODE_PLS_INTEGER
|
340
|
+
end
|
341
|
+
end
|
342
|
+
end
|
343
|
+
|
344
|
+
# Information about database objects which cannot be classified
|
345
|
+
# into other metadata classes.
|
346
|
+
#
|
347
|
+
# An instance of this class is returned by:
|
348
|
+
# * {OCI8::Metadata::Schema#all_objects OCI8::Metadata::Schema#all_objects}
|
349
|
+
class Unknown < Base
|
350
|
+
register_ptype OCI_PTYPE_UNK
|
351
|
+
end
|
352
|
+
|
353
|
+
# Information about tables
|
354
|
+
#
|
355
|
+
# An instance of this class is returned by:
|
356
|
+
# * {OCI8#describe_any OCI8#describe_any(name)}
|
357
|
+
# * {OCI8#describe_table OCI8#describe_table(name)}
|
358
|
+
# * {OCI8::Metadata::Schema#all_objects OCI8::Metadata::Schema#all_objects}
|
359
|
+
# * {OCI8::Metadata::Schema#objects OCI8::Metadata::Schema#objects}
|
360
|
+
class Table < Base
|
361
|
+
register_ptype OCI_PTYPE_TABLE
|
362
|
+
|
363
|
+
## Table 6-2 Attributes Belonging to Tables or Views
|
364
|
+
|
365
|
+
# Returns number of columns
|
366
|
+
#
|
367
|
+
# @return [Integer]
|
368
|
+
def num_cols
|
369
|
+
attr_get_ub2(OCI_ATTR_NUM_COLS)
|
370
|
+
end
|
371
|
+
|
372
|
+
# column list
|
373
|
+
def list_columns # :nodoc:
|
374
|
+
__param(OCI_ATTR_LIST_COLUMNS)
|
375
|
+
end
|
376
|
+
private :list_columns
|
377
|
+
|
378
|
+
# Retruns an instance of OCI8::Metadata::Type if the table is an
|
379
|
+
# {object table}[http://download.oracle.com/docs/cd/B28359_01/appdev.111/b28371/adobjint.htm#sthref61].
|
380
|
+
# Otherwise, +nil+.
|
381
|
+
#
|
382
|
+
# @return [OCI8::Metadata::Type or nil]
|
383
|
+
def type_metadata
|
384
|
+
__type_metadata(OCI8::Metadata::Type) if is_typed?
|
385
|
+
end
|
386
|
+
|
387
|
+
# Returns +true+ if the table is a
|
388
|
+
# {temporary table}[http://download.oracle.com/docs/cd/B28359_01/server.111/b28318/schema.htm#i16096].
|
389
|
+
# Otherwise, +false+.
|
390
|
+
def is_temporary?
|
391
|
+
attr_get_ub1(OCI_ATTR_IS_TEMPORARY) != 0
|
392
|
+
end
|
393
|
+
|
394
|
+
# Returns +true+ if the table is a object table. Otherwise, +false+.
|
395
|
+
def is_typed?
|
396
|
+
attr_get_ub1(OCI_ATTR_IS_TYPED) != 0
|
397
|
+
end
|
398
|
+
|
399
|
+
# Retruns +:transaction+ if the table is a
|
400
|
+
# {transaction-specific temporary table}[http://download.oracle.com/docs/cd/B28359_01/server.111/b28286/statements_7002.htm#i2189569].
|
401
|
+
# +:session+ if it is a
|
402
|
+
# {session-specific temporary table}[http://download.oracle.com/docs/cd/B28359_01/server.111/b28286/statements_7002.htm#i2189569].
|
403
|
+
# Otherwise, +nil+.
|
404
|
+
#
|
405
|
+
# @return [:transaction, :session or nil]
|
406
|
+
def duration
|
407
|
+
__duration
|
408
|
+
end
|
409
|
+
|
410
|
+
## Table 6-3 Attributes Specific to Tables
|
411
|
+
|
412
|
+
# Returns a Data Block Address(DBA) of the segment header.
|
413
|
+
#
|
414
|
+
# The dba is converted to the file number and the block number
|
415
|
+
# by DBMS_UTILITY.DATA_BLOCK_ADDRESS_FILE and
|
416
|
+
# DBMS_UTILITY.DATA_BLOCK_ADDRESS_BLOCK respectively.
|
417
|
+
#
|
418
|
+
# @return [Integer]
|
419
|
+
def dba
|
420
|
+
attr_get_ub4(OCI_ATTR_RDBA)
|
421
|
+
end
|
422
|
+
|
423
|
+
# Returns a tablespace number the table resides in.
|
424
|
+
#
|
425
|
+
# @return [Integer]
|
426
|
+
def tablespace
|
427
|
+
__word(OCI_ATTR_TABLESPACE)
|
428
|
+
end
|
429
|
+
|
430
|
+
# Returns +true+ if the table is part of a
|
431
|
+
# cluster[http://download.oracle.com/docs/cd/B28359_01/server.111/b28318/schema.htm#CNCPT608].
|
432
|
+
# Otherwise, +false+.
|
433
|
+
def clustered?
|
434
|
+
attr_get_ub1(OCI_ATTR_CLUSTERED) != 0
|
435
|
+
end
|
436
|
+
|
437
|
+
# Returns +true+ if the table is a
|
438
|
+
# {partitioned table}[http://download.oracle.com/docs/cd/B28359_01/server.111/b28318/partconc.htm#i449863].
|
439
|
+
# Otherwise, +false+.
|
440
|
+
def partitioned?
|
441
|
+
attr_get_ub1(OCI_ATTR_PARTITIONED) != 0
|
442
|
+
end
|
443
|
+
|
444
|
+
# Returns +true+ if the table is an
|
445
|
+
# {index-organized table}[http://download.oracle.com/docs/cd/B28359_01/server.111/b28318/schema.htm#i23877]
|
446
|
+
# Otherwise, +false+.
|
447
|
+
def index_only?
|
448
|
+
attr_get_ub1(OCI_ATTR_INDEX_ONLY) != 0
|
449
|
+
end
|
450
|
+
|
451
|
+
# Returns column information of the table.
|
452
|
+
#
|
453
|
+
# @return [array of OCI8::Metadata::Column]
|
454
|
+
def columns
|
455
|
+
@columns ||= list_columns.to_a
|
456
|
+
end
|
457
|
+
end
|
458
|
+
|
459
|
+
# Information about views
|
460
|
+
#
|
461
|
+
# An instance of this class is returned by:
|
462
|
+
# * {OCI8#describe_any OCI8#describe_any(name)}
|
463
|
+
# * {OCI8#describe_table OCI8#describe_table(name, false)}
|
464
|
+
# * {OCI8#describe_view OCI8#describe_view(name)}
|
465
|
+
# * {OCI8::Metadata::Schema#all_objects OCI8::Metadata::Schema#all_objects}
|
466
|
+
# * {OCI8::Metadata::Schema#objects OCI8::Metadata::Schema#objects}
|
467
|
+
class View < Base
|
468
|
+
register_ptype OCI_PTYPE_VIEW
|
469
|
+
|
470
|
+
## Table 6-2 Attributes Belonging to Tables or Views
|
471
|
+
|
472
|
+
# Returns number of columns
|
473
|
+
#
|
474
|
+
# @return [Integer]
|
475
|
+
def num_cols
|
476
|
+
attr_get_ub2(OCI_ATTR_NUM_COLS)
|
477
|
+
end
|
478
|
+
|
479
|
+
# column list
|
480
|
+
def list_columns # :nodoc:
|
481
|
+
__param(OCI_ATTR_LIST_COLUMNS)
|
482
|
+
end
|
483
|
+
private :list_columns
|
484
|
+
|
485
|
+
# This does't work for view.
|
486
|
+
#def type_metadata
|
487
|
+
# __type_metadata(OCI8::Metadata::Type)
|
488
|
+
#end
|
489
|
+
|
490
|
+
# This does't work for view.
|
491
|
+
#def is_temporary?
|
492
|
+
# attr_get_ub1(OCI_ATTR_IS_TEMPORARY) != 0
|
493
|
+
#end
|
494
|
+
|
495
|
+
# This does't work for view.
|
496
|
+
#def is_typed?
|
497
|
+
# attr_get_ub1(OCI_ATTR_IS_TYPED) != 0
|
498
|
+
#end
|
499
|
+
|
500
|
+
# This does't work for view.
|
501
|
+
#def duration
|
502
|
+
# __duration
|
503
|
+
#end
|
504
|
+
|
505
|
+
# Returns column information of the view.
|
506
|
+
#
|
507
|
+
# @return [array of OCI8::Metadata::Column]
|
508
|
+
def columns
|
509
|
+
@columns ||= list_columns.to_a
|
510
|
+
end
|
511
|
+
end
|
512
|
+
|
513
|
+
# Information about PL/SQL subprograms
|
514
|
+
#
|
515
|
+
# A PL/SQL subprogram is a named PL/SQL block that can be invoked
|
516
|
+
# with a set of parameters. A subprogram can be either a procedure
|
517
|
+
# or a function.
|
518
|
+
#
|
519
|
+
# This is the abstract base class of {OCI8::Metadata::Procedure OCI8::Metadata::Procedure} and
|
520
|
+
# {OCI8::Metadata::Function OCI8::Metadata::Function}.
|
521
|
+
class Subprogram < Base
|
522
|
+
## Table 6-4 Attribute Belonging to Procedures or Functions
|
523
|
+
|
524
|
+
# Argument list
|
525
|
+
def list_arguments # :nodoc:
|
526
|
+
__param(OCI_ATTR_LIST_ARGUMENTS)
|
527
|
+
end
|
528
|
+
private :list_arguments
|
529
|
+
|
530
|
+
def obj_id # :nodoc:
|
531
|
+
super if is_standalone?
|
532
|
+
end
|
533
|
+
|
534
|
+
def obj_name # :nodoc:
|
535
|
+
is_standalone? ? super : attr_get_string(OCI_ATTR_NAME)
|
536
|
+
end
|
537
|
+
|
538
|
+
def obj_schema # :nodoc:
|
539
|
+
super if is_standalone?
|
540
|
+
end
|
541
|
+
|
542
|
+
# Returns +true+ if the subprogram has
|
543
|
+
# {invoker's rights}[http://download.oracle.com/docs/cd/B28359_01/appdev.111/b28370/subprograms.htm#i18574].
|
544
|
+
# Otherwise, +false+.
|
545
|
+
def is_invoker_rights?
|
546
|
+
attr_get_ub1(OCI_ATTR_IS_INVOKER_RIGHTS) != 0
|
547
|
+
end
|
548
|
+
|
549
|
+
## Table 6-5 Attributes Specific to Package Subprograms
|
550
|
+
|
551
|
+
# name of the subprogram
|
552
|
+
#
|
553
|
+
#def name
|
554
|
+
# attr_get_string(OCI_ATTR_NAME)
|
555
|
+
#end
|
556
|
+
alias name obj_name # :nodoc: for backward compatibility
|
557
|
+
|
558
|
+
# Returns +nil+ for a standalone stored subprogram,
|
559
|
+
# positive integer for an
|
560
|
+
# {overloaded packaged subprogram}[http://download.oracle.com/docs/cd/B28359_01/appdev.111/b28370/subprograms.htm#i12352],
|
561
|
+
# otherwise zero.
|
562
|
+
#
|
563
|
+
# @return [Integer or nil]
|
564
|
+
def overload_id
|
565
|
+
attr_get_ub2(OCI_ATTR_OVERLOAD_ID) unless is_standalone?
|
566
|
+
end
|
567
|
+
|
568
|
+
# Returns argument information of the subprogram.
|
569
|
+
# If it is a function, the first array element is information of its return type.
|
570
|
+
#
|
571
|
+
# @return [array of OCI8::Metadata::Argument]
|
572
|
+
def arguments
|
573
|
+
@arguments ||= list_arguments.to_a
|
574
|
+
end
|
575
|
+
|
576
|
+
# Returns +true+ if the subprogram is standalone, +false+
|
577
|
+
# if packaged.
|
578
|
+
def is_standalone?
|
579
|
+
@is_standalone = true unless defined? @is_standalone
|
580
|
+
@is_standalone
|
581
|
+
end
|
582
|
+
|
583
|
+
# @private
|
584
|
+
def inspect
|
585
|
+
"#<#{self.class.name}: #{name}>"
|
586
|
+
end
|
587
|
+
end
|
588
|
+
|
589
|
+
# Information about procedures
|
590
|
+
#
|
591
|
+
# An instance of this class is returned by:
|
592
|
+
# * OCI8#describe_any(name)
|
593
|
+
# * OCI8#describe_procedure(name)
|
594
|
+
# * OCI8::Metadata::Schema#all_objects
|
595
|
+
# * OCI8::Metadata::Schema#objects
|
596
|
+
# * OCI8::Metadata::Package#subprograms
|
597
|
+
#
|
598
|
+
# See OCI8::Metadata::Subprogram.
|
599
|
+
class Procedure < Subprogram
|
600
|
+
register_ptype OCI_PTYPE_PROC
|
601
|
+
end
|
602
|
+
|
603
|
+
# Information about functions
|
604
|
+
#
|
605
|
+
# An instance of this class is returned by:
|
606
|
+
# * OCI8#describe_any(name)
|
607
|
+
# * OCI8#describe_function(name)
|
608
|
+
# * OCI8::Metadata::Schema#all_objects
|
609
|
+
# * OCI8::Metadata::Schema#objects
|
610
|
+
# * OCI8::Metadata::Package#subprograms
|
611
|
+
#
|
612
|
+
# See OCI8::Metadata::Subprogram.
|
613
|
+
class Function < Subprogram
|
614
|
+
register_ptype OCI_PTYPE_FUNC
|
615
|
+
end
|
616
|
+
|
617
|
+
# Information about packages.
|
618
|
+
#
|
619
|
+
# An instance of this class is returned by:
|
620
|
+
# * OCI8#describe_any(name)
|
621
|
+
# * OCI8#describe_package(name)
|
622
|
+
# * OCI8::Metadata::Schema#all_objects
|
623
|
+
# * OCI8::Metadata::Schema#objects
|
624
|
+
class Package < Base
|
625
|
+
register_ptype OCI_PTYPE_PKG
|
626
|
+
|
627
|
+
## Table 6-6 Attributes Belonging to Packages
|
628
|
+
|
629
|
+
# subprogram list
|
630
|
+
def list_subprograms # :nodoc:
|
631
|
+
__param(OCI_ATTR_LIST_SUBPROGRAMS)
|
632
|
+
end
|
633
|
+
private :list_subprograms
|
634
|
+
|
635
|
+
# Returns +true+ if the package subprograms have
|
636
|
+
# {invoker's rights}[http://download.oracle.com/docs/cd/B28359_01/appdev.111/b28370/subprograms.htm#i18574].
|
637
|
+
# Otherwise, +false+.
|
638
|
+
def is_invoker_rights?
|
639
|
+
attr_get_ub1(OCI_ATTR_IS_INVOKER_RIGHTS) != 0
|
640
|
+
end
|
641
|
+
|
642
|
+
# Returns an array of Function and Procedure defined within the Package.
|
643
|
+
#
|
644
|
+
# @return [array of OCI8::Metadata::Function and OCI8::Metadata::Procedure]
|
645
|
+
def subprograms
|
646
|
+
@subprograms ||= list_subprograms.to_a.each do |prog|
|
647
|
+
prog.instance_variable_set(:@is_standalone, false)
|
648
|
+
end
|
649
|
+
end
|
650
|
+
end
|
651
|
+
|
652
|
+
# Information about types
|
653
|
+
#
|
654
|
+
# An instance of this class is returned by:
|
655
|
+
# * OCI8#describe_any(name)
|
656
|
+
# * OCI8#describe_type(name)
|
657
|
+
# * OCI8::Metadata::Schema#all_objects
|
658
|
+
# * OCI8::Metadata::Schema#objects
|
659
|
+
class Type < Base
|
660
|
+
register_ptype OCI_PTYPE_TYPE
|
661
|
+
|
662
|
+
## Table 6-7 Attributes Belonging to Types
|
663
|
+
|
664
|
+
# to type metadata if possible
|
665
|
+
def type_metadata
|
666
|
+
self
|
667
|
+
end
|
668
|
+
|
669
|
+
# Returns +:named_type+ if the type is an object type,
|
670
|
+
# +:named_collection+ if it is a nested table or a varray.
|
671
|
+
#
|
672
|
+
# @return [:named_type or :named_collection]
|
673
|
+
def typecode
|
674
|
+
__typecode(OCI_ATTR_TYPECODE)
|
675
|
+
end
|
676
|
+
|
677
|
+
# Returns +:table+ if the type is a nested table,
|
678
|
+
# +:varray+ if it is a varray. Otherwise, +nil+.
|
679
|
+
#
|
680
|
+
# @return [:table, :varray or nil]
|
681
|
+
def collection_typecode
|
682
|
+
__typecode(OCI_ATTR_COLLECTION_TYPECODE) if typecode == :named_collection
|
683
|
+
end
|
684
|
+
|
685
|
+
# Returns +true+ if the type is an
|
686
|
+
# {incomplete type}[http://download.oracle.com/docs/cd/B28359_01/appdev.111/b28371/adobjmng.htm#i1003083],
|
687
|
+
# which is used for {forward declaration}[http://en.wikipedia.org/wiki/Forward_declaration].
|
688
|
+
# Otherwise, +false+.
|
689
|
+
def is_incomplete_type?
|
690
|
+
attr_get_ub1(OCI_ATTR_IS_INCOMPLETE_TYPE) != 0
|
691
|
+
end
|
692
|
+
|
693
|
+
# Always returns +false+ because there is no way to create
|
694
|
+
# a type metadata object for a system type such as +NUMBER+,
|
695
|
+
# +CHAR+ and +VARCHAR+.
|
696
|
+
def is_system_type? # :nodoc:
|
697
|
+
attr_get_ub1(OCI_ATTR_IS_SYSTEM_TYPE) != 0
|
698
|
+
end
|
699
|
+
|
700
|
+
# Always returns +false+.
|
701
|
+
#--
|
702
|
+
# I don't know the definition of predefined type...
|
703
|
+
def is_predefined_type? # :nodoc:
|
704
|
+
attr_get_ub1(OCI_ATTR_IS_PREDEFINED_TYPE) != 0
|
705
|
+
end
|
706
|
+
|
707
|
+
# Always returns +false+ because there is no way to create
|
708
|
+
# a type metadata object for a transient type, which is a type
|
709
|
+
# dynamically created by C API.
|
710
|
+
def is_transient_type? # :nodoc:
|
711
|
+
attr_get_ub1(OCI_ATTR_IS_TRANSIENT_TYPE) != 0
|
712
|
+
end
|
713
|
+
|
714
|
+
# Always returns +false+.
|
715
|
+
#--
|
716
|
+
# I don't know the definition of system generated type.
|
717
|
+
# What is different with system type and predefined type.
|
718
|
+
def is_system_generated_type? # :nodoc:
|
719
|
+
attr_get_ub1(OCI_ATTR_IS_SYSTEM_GENERATED_TYPE) != 0
|
720
|
+
end
|
721
|
+
|
722
|
+
# Returns +true+ if the type is a nested table or
|
723
|
+
# has a nested table attribute.
|
724
|
+
# Otherwise, +false+.
|
725
|
+
def has_nested_table?
|
726
|
+
attr_get_ub1(OCI_ATTR_HAS_NESTED_TABLE) != 0
|
727
|
+
end
|
728
|
+
|
729
|
+
# Returns +true+ if the type has a CLOB, NCLOB or BLOB
|
730
|
+
# attribute.
|
731
|
+
# Otherwise, +false+.
|
732
|
+
def has_lob?
|
733
|
+
attr_get_ub1(OCI_ATTR_HAS_LOB) != 0
|
734
|
+
end
|
735
|
+
|
736
|
+
# Returns +true+ if the type has a BFILE attribute.
|
737
|
+
# Otherwise, +false+.
|
738
|
+
def has_file?
|
739
|
+
attr_get_ub1(OCI_ATTR_HAS_FILE) != 0
|
740
|
+
end
|
741
|
+
|
742
|
+
# Returns element information of the collection type if the type is a nested
|
743
|
+
# table or a varray.
|
744
|
+
# Otherwise, +nil+.
|
745
|
+
#
|
746
|
+
# @return [OCI8::Metadata::Collection or nil]
|
747
|
+
def collection_element
|
748
|
+
__param(OCI_ATTR_COLLECTION_ELEMENT) if typecode == :named_collection
|
749
|
+
end
|
750
|
+
|
751
|
+
# Returns number of type attributes.
|
752
|
+
#
|
753
|
+
# @return [Integer]
|
754
|
+
def num_type_attrs
|
755
|
+
attr_get_ub2(OCI_ATTR_NUM_TYPE_ATTRS)
|
756
|
+
end
|
757
|
+
|
758
|
+
# list of type attributes
|
759
|
+
def list_type_attrs # :nodoc:
|
760
|
+
__param(OCI_ATTR_LIST_TYPE_ATTRS)
|
761
|
+
end
|
762
|
+
private :list_type_attrs
|
763
|
+
|
764
|
+
# Returns number of type methods.
|
765
|
+
#
|
766
|
+
# @return [Integer]
|
767
|
+
def num_type_methods
|
768
|
+
attr_get_ub2(OCI_ATTR_NUM_TYPE_METHODS)
|
769
|
+
end
|
770
|
+
|
771
|
+
# list of type methods
|
772
|
+
def list_type_methods # :nodoc:
|
773
|
+
__param(OCI_ATTR_LIST_TYPE_METHODS)
|
774
|
+
end
|
775
|
+
private :list_type_methods
|
776
|
+
|
777
|
+
# Returns information of the
|
778
|
+
# {map method}[http://download.oracle.com/docs/cd/B28359_01/appdev.111/b28371/adobjbas.htm#sthref180]
|
779
|
+
# if it is defined in the type. Otherwise, +nil+.
|
780
|
+
#
|
781
|
+
# @return [OCI8::Metadata::TypeMethod or nil]
|
782
|
+
def map_method
|
783
|
+
__param(OCI_ATTR_MAP_METHOD)
|
784
|
+
end
|
785
|
+
|
786
|
+
# Returns information of the
|
787
|
+
# {order method}[http://download.oracle.com/docs/cd/B28359_01/appdev.111/b28371/adobjbas.htm#sthref185]
|
788
|
+
# if it is defined in the type. Otherwise, +nil+.
|
789
|
+
#
|
790
|
+
# @return [OCI8::Metadata::TypeMethod or nil]
|
791
|
+
def order_method
|
792
|
+
__param(OCI_ATTR_ORDER_METHOD)
|
793
|
+
end
|
794
|
+
|
795
|
+
# Returns +true+ if the type has
|
796
|
+
# {invoker's rights}[http://download.oracle.com/docs/cd/B28359_01/appdev.111/appdev.111/b28371/adobjdes.htm#ADOBJ00810].
|
797
|
+
# Otherwise, +false+.
|
798
|
+
def is_invoker_rights?
|
799
|
+
attr_get_ub1(OCI_ATTR_IS_INVOKER_RIGHTS) != 0
|
800
|
+
end
|
801
|
+
|
802
|
+
# Returns the type name.
|
803
|
+
#
|
804
|
+
# @return [String]
|
805
|
+
def name
|
806
|
+
attr_get_string(OCI_ATTR_NAME)
|
807
|
+
end
|
808
|
+
|
809
|
+
# Returns the schema name where the type has been created.
|
810
|
+
#
|
811
|
+
# @return [String]
|
812
|
+
def schema_name
|
813
|
+
attr_get_string(OCI_ATTR_SCHEMA_NAME)
|
814
|
+
end
|
815
|
+
|
816
|
+
# Returns +true+ if the type is a
|
817
|
+
# {final type}[http://download.oracle.com/docs/cd/B28359_01/appdev.111/b28371/adobjbas.htm#CIHFBHFC];
|
818
|
+
# in other words, subtypes cannot be derived from the type.
|
819
|
+
# Otherwise, +false+.
|
820
|
+
def is_final_type?
|
821
|
+
attr_get_ub1(OCI_ATTR_IS_FINAL_TYPE) != 0
|
822
|
+
end
|
823
|
+
|
824
|
+
# Returns +true+ if the type is not declared without
|
825
|
+
# {<tt>NOT INSTANTIABLE</tt>}[http://download.oracle.com/docs/cd/B28359_01/appdev.111/b28371/adobjbas.htm#i456586].
|
826
|
+
# Otherwise, +false+.
|
827
|
+
def is_instantiable_type?
|
828
|
+
attr_get_ub1(OCI_ATTR_IS_INSTANTIABLE_TYPE) != 0
|
829
|
+
end
|
830
|
+
|
831
|
+
# Returns +true+ if the type is a
|
832
|
+
# {subtype}[http://download.oracle.com/docs/cd/B28359_01/appdev.111/b28371/adobjbas.htm#BCFJJADG].
|
833
|
+
# Otherwise, +false+.
|
834
|
+
def is_subtype?
|
835
|
+
attr_get_ub1(OCI_ATTR_IS_SUBTYPE) != 0
|
836
|
+
end
|
837
|
+
|
838
|
+
# Returns the supertype's schema name if the type is a subtype.
|
839
|
+
# Otherwise, +nil+.
|
840
|
+
#
|
841
|
+
# @return [String or nil]
|
842
|
+
def supertype_schema_name
|
843
|
+
attr_get_string(OCI_ATTR_SUPERTYPE_SCHEMA_NAME) if is_subtype?
|
844
|
+
end
|
845
|
+
|
846
|
+
# Returns the supertype's name if the type is a subtype.
|
847
|
+
# Otherwise, +nil+.
|
848
|
+
#
|
849
|
+
# @return [String or nil]
|
850
|
+
def supertype_name
|
851
|
+
attr_get_string(OCI_ATTR_SUPERTYPE_NAME) if is_subtype?
|
852
|
+
end
|
853
|
+
|
854
|
+
# Returns attribute information of the type.
|
855
|
+
#
|
856
|
+
# @return [array of OCI8::Metadata::TypeAttr]
|
857
|
+
def type_attrs
|
858
|
+
@type_attrs ||= list_type_attrs.to_a
|
859
|
+
end
|
860
|
+
|
861
|
+
# Returns method information of the type.
|
862
|
+
#
|
863
|
+
# @return [array of OCI8::Metadata::TypeMethod]
|
864
|
+
def type_methods
|
865
|
+
@type_methods ||= list_type_methods.to_a
|
866
|
+
end
|
867
|
+
|
868
|
+
def inspect # :nodoc:
|
869
|
+
"#<#{self.class.name}:(#{obj_id}) #{schema_name}.#{name}>"
|
870
|
+
end
|
871
|
+
end
|
872
|
+
|
873
|
+
# Metadata for a type attribute.
|
874
|
+
#
|
875
|
+
# This is returned by:
|
876
|
+
# * OCI8::Metadata::Type#type_attrs
|
877
|
+
class TypeAttr < Base
|
878
|
+
register_ptype OCI_PTYPE_TYPE_ATTR
|
879
|
+
|
880
|
+
## Table 6-8 Attributes Belonging to Type Attributes
|
881
|
+
|
882
|
+
# The maximum size of the type attribute. This length is
|
883
|
+
# returned in bytes and not characters for strings and raws. It
|
884
|
+
# returns 22 for NUMBERs.
|
885
|
+
def data_size
|
886
|
+
attr_get_ub2(OCI_ATTR_DATA_SIZE)
|
887
|
+
end
|
888
|
+
|
889
|
+
# typecode
|
890
|
+
def typecode
|
891
|
+
__typecode(OCI_ATTR_TYPECODE)
|
892
|
+
end
|
893
|
+
|
894
|
+
# the datatype of the type
|
895
|
+
def data_type
|
896
|
+
__data_type
|
897
|
+
end
|
898
|
+
|
899
|
+
# the type attribute name
|
900
|
+
def name
|
901
|
+
attr_get_string(OCI_ATTR_NAME)
|
902
|
+
end
|
903
|
+
|
904
|
+
# The precision of numeric type attributes. If the precision is
|
905
|
+
# nonzero and scale is -127, then it is a FLOAT, else it is a
|
906
|
+
# NUMBER(precision, scale). For the case when precision is 0,
|
907
|
+
# NUMBER(precision, scale) can be represented simply as NUMBER.
|
908
|
+
def precision
|
909
|
+
__is_implicit? ? attr_get_sb2(OCI_ATTR_PRECISION) : attr_get_ub1(OCI_ATTR_PRECISION)
|
910
|
+
end
|
911
|
+
|
912
|
+
# The scale of numeric type attributes. If the precision is
|
913
|
+
# nonzero and scale is -127, then it is a FLOAT, else it is a
|
914
|
+
# NUMBER(precision, scale). For the case when precision is 0,
|
915
|
+
# NUMBER(precision, scale) can be represented simply as NUMBER.
|
916
|
+
def scale
|
917
|
+
attr_get_sb1(OCI_ATTR_SCALE)
|
918
|
+
end
|
919
|
+
|
920
|
+
# A string which is the type name. The returned value will
|
921
|
+
# contain the type name if the datatype is <tt>:named_type</tt>
|
922
|
+
# or <tt>:ref</tt>. If the datatype is <tt>:named_type</tt>, the
|
923
|
+
# name of the named datatype's type is returned. If the datatype
|
924
|
+
# is <tt>:ref</tt>, the type name of the named datatype pointed
|
925
|
+
# to by the REF is returned.
|
926
|
+
def type_name
|
927
|
+
attr_get_string(OCI_ATTR_TYPE_NAME)
|
928
|
+
end
|
929
|
+
|
930
|
+
# schema name where the type has been created.
|
931
|
+
def schema_name
|
932
|
+
attr_get_string(OCI_ATTR_SCHEMA_NAME)
|
933
|
+
end
|
934
|
+
|
935
|
+
# to type metadata if possible
|
936
|
+
def type_metadata
|
937
|
+
__type_metadata(OCI8::Metadata::Type)
|
938
|
+
end
|
939
|
+
|
940
|
+
# character set id if the type attribute is of a string/character type.
|
941
|
+
def charset_id
|
942
|
+
attr_get_ub2(OCI_ATTR_CHARSET_ID)
|
943
|
+
end
|
944
|
+
|
945
|
+
# character set form, if the type attribute is of a string/character type.
|
946
|
+
def charset_form
|
947
|
+
__charset_form
|
948
|
+
end
|
949
|
+
|
950
|
+
if OCI8.oracle_client_version >= ORAVER_9_0
|
951
|
+
# The fractional seconds precision of a datetime or interval.
|
952
|
+
#
|
953
|
+
# (unavailable on Oracle 8.1 or lower)
|
954
|
+
def fsprecision
|
955
|
+
attr_get_ub1(OCI_ATTR_FSPRECISION)
|
956
|
+
end
|
957
|
+
|
958
|
+
# The leading field precision of an interval
|
959
|
+
#
|
960
|
+
# (unavailable on Oracle 8.1 or lower)
|
961
|
+
def lfprecision
|
962
|
+
attr_get_ub1(OCI_ATTR_LFPRECISION)
|
963
|
+
end
|
964
|
+
end
|
965
|
+
|
966
|
+
# character set name if the type attribute is of a string/character type.
|
967
|
+
def charset_name
|
968
|
+
__con.charset_id2name(charset_id)
|
969
|
+
end
|
970
|
+
|
971
|
+
def inspect # :nodoc:
|
972
|
+
"#<#{self.class.name}: #{name} #{__data_type_string}>"
|
973
|
+
end
|
974
|
+
end
|
975
|
+
|
976
|
+
# Metadata for a type method.
|
977
|
+
#
|
978
|
+
# This is returned by:
|
979
|
+
# * OCI8::Metadata::Type#type_methods
|
980
|
+
# * OCI8::Metadata::Type#map_method
|
981
|
+
# * OCI8::Metadata::Type#order_method
|
982
|
+
#
|
983
|
+
#--
|
984
|
+
# How can I know whether FUNCTION or PROCEDURE?
|
985
|
+
#++
|
986
|
+
class TypeMethod < Base
|
987
|
+
register_ptype OCI_PTYPE_TYPE_METHOD
|
988
|
+
|
989
|
+
## Table 6-9 Attributes Belonging to Type Methods
|
990
|
+
|
991
|
+
# Name of method (procedure or function)
|
992
|
+
def name
|
993
|
+
attr_get_string(OCI_ATTR_NAME)
|
994
|
+
end
|
995
|
+
|
996
|
+
# encapsulation level of the method. Values are <tt>:public</tt>
|
997
|
+
# or <tt>:private</tt>.
|
998
|
+
def encapsulation
|
999
|
+
case attr_get_ub4(OCI_ATTR_ENCAPSULATION)
|
1000
|
+
when 0; :private
|
1001
|
+
when 1; :public
|
1002
|
+
end
|
1003
|
+
end
|
1004
|
+
|
1005
|
+
# argument list
|
1006
|
+
def list_arguments
|
1007
|
+
__param(OCI_ATTR_LIST_ARGUMENTS)
|
1008
|
+
end
|
1009
|
+
private :list_arguments
|
1010
|
+
|
1011
|
+
# indicates method is has rsult
|
1012
|
+
def has_result?
|
1013
|
+
__boolean(OCI_ATTR_HAS_RESULT)
|
1014
|
+
end
|
1015
|
+
|
1016
|
+
# indicates method is a constructor
|
1017
|
+
def is_constructor?
|
1018
|
+
__boolean(OCI_ATTR_IS_CONSTRUCTOR)
|
1019
|
+
end
|
1020
|
+
|
1021
|
+
# indicates method is a destructor
|
1022
|
+
def is_destructor?
|
1023
|
+
__boolean(OCI_ATTR_IS_DESTRUCTOR)
|
1024
|
+
end
|
1025
|
+
|
1026
|
+
# indicates method is an operator
|
1027
|
+
def is_operator?
|
1028
|
+
__boolean(OCI_ATTR_IS_OPERATOR)
|
1029
|
+
end
|
1030
|
+
|
1031
|
+
# indicates method is selfish
|
1032
|
+
def is_selfish?
|
1033
|
+
__boolean(OCI_ATTR_IS_SELFISH)
|
1034
|
+
end
|
1035
|
+
|
1036
|
+
# indicates method is a map method
|
1037
|
+
def is_map?
|
1038
|
+
__boolean(OCI_ATTR_IS_MAP)
|
1039
|
+
end
|
1040
|
+
|
1041
|
+
# Indicates method is an order method
|
1042
|
+
def is_order?
|
1043
|
+
__boolean(OCI_ATTR_IS_ORDER)
|
1044
|
+
end
|
1045
|
+
|
1046
|
+
# indicates "Read No Data State"(does not query database tables) is set.
|
1047
|
+
def is_rnds?
|
1048
|
+
__boolean(OCI_ATTR_IS_RNDS)
|
1049
|
+
end
|
1050
|
+
|
1051
|
+
# Indicates "Read No Package State"(does not reference the values of packaged variables) is set.
|
1052
|
+
def is_rnps?
|
1053
|
+
__boolean(OCI_ATTR_IS_RNPS)
|
1054
|
+
end
|
1055
|
+
|
1056
|
+
# indicates "Write No Data State"(does not modify tables) is set.
|
1057
|
+
def is_wnds?
|
1058
|
+
__boolean(OCI_ATTR_IS_WNDS)
|
1059
|
+
end
|
1060
|
+
|
1061
|
+
# indicates "Write No Package State"(does not change the values of packaged variables) is set.
|
1062
|
+
def is_wnps?
|
1063
|
+
__boolean(OCI_ATTR_IS_WNPS)
|
1064
|
+
end
|
1065
|
+
|
1066
|
+
# indicates this is a final method
|
1067
|
+
def is_final_method?
|
1068
|
+
__boolean(OCI_ATTR_IS_FINAL_METHOD)
|
1069
|
+
end
|
1070
|
+
|
1071
|
+
# indicates this is an instantiable method
|
1072
|
+
def is_instantiable_method?
|
1073
|
+
__boolean(OCI_ATTR_IS_INSTANTIABLE_METHOD)
|
1074
|
+
end
|
1075
|
+
|
1076
|
+
# indicates this is an overriding method
|
1077
|
+
def is_overriding_method?
|
1078
|
+
__boolean(OCI_ATTR_IS_OVERRIDING_METHOD)
|
1079
|
+
end
|
1080
|
+
|
1081
|
+
# Returns argument information of the type method.
|
1082
|
+
#
|
1083
|
+
# The first element is the return type in case of Function.
|
1084
|
+
#
|
1085
|
+
# @return [array of OCI8::Metadata::Argument]
|
1086
|
+
def arguments
|
1087
|
+
@arguments ||= list_arguments.to_a
|
1088
|
+
end
|
1089
|
+
|
1090
|
+
def inspect # :nodoc:
|
1091
|
+
"#<#{self.class.name}: #{name}>"
|
1092
|
+
end
|
1093
|
+
end
|
1094
|
+
|
1095
|
+
# Metadata for a collection.
|
1096
|
+
#
|
1097
|
+
# This is returned by:
|
1098
|
+
# * OCI8::Metadata::Type.collection_element
|
1099
|
+
class Collection < Base
|
1100
|
+
register_ptype OCI_PTYPE_TYPE_COLL
|
1101
|
+
|
1102
|
+
## Table 6-10 Attributes Belonging to Collection Types
|
1103
|
+
|
1104
|
+
# The maximum size of the type attribute. This length is
|
1105
|
+
# returned in bytes and not characters for strings and raws. It
|
1106
|
+
# returns 22 for NUMBERs.
|
1107
|
+
def data_size
|
1108
|
+
attr_get_ub2(OCI_ATTR_DATA_SIZE)
|
1109
|
+
end
|
1110
|
+
|
1111
|
+
# typecode
|
1112
|
+
def typecode
|
1113
|
+
__typecode(OCI_ATTR_TYPECODE)
|
1114
|
+
end
|
1115
|
+
|
1116
|
+
# the datatype of the type
|
1117
|
+
def data_type
|
1118
|
+
__data_type
|
1119
|
+
end
|
1120
|
+
|
1121
|
+
# the number of elements in an array. It is only valid for
|
1122
|
+
# collections that are arrays.
|
1123
|
+
def num_elems
|
1124
|
+
attr_get_ub4(OCI_ATTR_NUM_ELEMS)
|
1125
|
+
end
|
1126
|
+
|
1127
|
+
# The precision of numeric type attributes. If the precision is
|
1128
|
+
# nonzero and scale is -127, then it is a FLOAT, else it is a
|
1129
|
+
# NUMBER(precision, scale). For the case when precision is 0,
|
1130
|
+
# NUMBER(precision, scale) can be represented simply as NUMBER.
|
1131
|
+
def precision
|
1132
|
+
__is_implicit? ? attr_get_sb2(OCI_ATTR_PRECISION) : attr_get_ub1(OCI_ATTR_PRECISION)
|
1133
|
+
end
|
1134
|
+
|
1135
|
+
# The scale of numeric type attributes. If the precision is
|
1136
|
+
# nonzero and scale is -127, then it is a FLOAT, else it is a
|
1137
|
+
# NUMBER(precision, scale). For the case when precision is 0,
|
1138
|
+
# NUMBER(precision, scale) can be represented simply as NUMBER.
|
1139
|
+
def scale
|
1140
|
+
attr_get_sb1(OCI_ATTR_SCALE)
|
1141
|
+
end
|
1142
|
+
|
1143
|
+
# A string which is the type name. The returned value will
|
1144
|
+
# contain the type name if the datatype is <tt>:named_type</tt> or <tt>:ref</tt>.
|
1145
|
+
# If the datatype is <tt>:named_type</tt>, the name of the named datatype's
|
1146
|
+
# type is returned. If the datatype is <tt>:ref</tt>, the type name
|
1147
|
+
# of the named datatype pointed to by the REF is returned.
|
1148
|
+
def type_name
|
1149
|
+
attr_get_string(OCI_ATTR_TYPE_NAME)
|
1150
|
+
end
|
1151
|
+
|
1152
|
+
# schema name where the type has been created.
|
1153
|
+
def schema_name
|
1154
|
+
attr_get_string(OCI_ATTR_SCHEMA_NAME)
|
1155
|
+
end
|
1156
|
+
|
1157
|
+
# to type metadata if possible
|
1158
|
+
def type_metadata
|
1159
|
+
__type_metadata(OCI8::Metadata::Type)
|
1160
|
+
end
|
1161
|
+
|
1162
|
+
# character set id if the type attribute is of a string/character type.
|
1163
|
+
def charset_id
|
1164
|
+
attr_get_ub2(OCI_ATTR_CHARSET_ID)
|
1165
|
+
end
|
1166
|
+
|
1167
|
+
# character set form, if the type attribute is of a string/character type.
|
1168
|
+
def charset_form
|
1169
|
+
__charset_form
|
1170
|
+
end
|
1171
|
+
|
1172
|
+
# character set name if the type attribute is of a string/character type.
|
1173
|
+
def charset_name
|
1174
|
+
__charset_name(charset_id)
|
1175
|
+
end
|
1176
|
+
|
1177
|
+
def inspect # :nodoc:
|
1178
|
+
"#<#{self.class.name}: #{__data_type_string}>"
|
1179
|
+
end
|
1180
|
+
end
|
1181
|
+
|
1182
|
+
# Metadata for a synonym.
|
1183
|
+
#
|
1184
|
+
# This is returned by:
|
1185
|
+
# * OCI8#describe_any(name)
|
1186
|
+
# * OCI8#describe_synonym(name)
|
1187
|
+
# * OCI8::Metadata::Schema#all_objects
|
1188
|
+
# * OCI8::Metadata::Schema#objects
|
1189
|
+
class Synonym < Base
|
1190
|
+
register_ptype OCI_PTYPE_SYN
|
1191
|
+
|
1192
|
+
## Table 6-11 Attributes Belonging to Synonyms
|
1193
|
+
|
1194
|
+
# object id
|
1195
|
+
def objid
|
1196
|
+
@objid ||= attr_get_ub4(OCI_ATTR_OBJID)
|
1197
|
+
end
|
1198
|
+
|
1199
|
+
# schema name of the synonym translation
|
1200
|
+
def schema_name
|
1201
|
+
@schema_name ||= attr_get_string(OCI_ATTR_SCHEMA_NAME)
|
1202
|
+
end
|
1203
|
+
|
1204
|
+
# object name of the synonym translation
|
1205
|
+
def name
|
1206
|
+
@name ||= attr_get_string(OCI_ATTR_NAME)
|
1207
|
+
end
|
1208
|
+
|
1209
|
+
# database link name of the synonym translation or nil
|
1210
|
+
def link
|
1211
|
+
@link ||= attr_get_string(OCI_ATTR_LINK)
|
1212
|
+
@link.size == 0 ? nil : @link
|
1213
|
+
end
|
1214
|
+
|
1215
|
+
# full-qualified synonym translation name with schema, object and database link name.
|
1216
|
+
def translated_name
|
1217
|
+
if link.nil?
|
1218
|
+
schema_name + '.' + name
|
1219
|
+
else
|
1220
|
+
schema_name + '.' + name + '@' + link
|
1221
|
+
end
|
1222
|
+
end
|
1223
|
+
|
1224
|
+
def inspect # :nodoc:
|
1225
|
+
"#<#{self.class.name}:(#{obj_id}) #{obj_schema}.#{obj_name} FOR #{translated_name}>"
|
1226
|
+
end
|
1227
|
+
end
|
1228
|
+
|
1229
|
+
# Metadata for a sequence.
|
1230
|
+
#
|
1231
|
+
# This is returned by:
|
1232
|
+
# * OCI8#describe_any(name)
|
1233
|
+
# * OCI8#describe_sequence(name)
|
1234
|
+
# * OCI8::Metadata::Schema#all_objects
|
1235
|
+
# * OCI8::Metadata::Schema#objects
|
1236
|
+
class Sequence < Base
|
1237
|
+
register_ptype OCI_PTYPE_SEQ
|
1238
|
+
|
1239
|
+
## Table 6-12 Attributes Belonging to Sequences
|
1240
|
+
|
1241
|
+
# object id
|
1242
|
+
def objid
|
1243
|
+
attr_get_ub4(OCI_ATTR_OBJID)
|
1244
|
+
end
|
1245
|
+
|
1246
|
+
# minimum value
|
1247
|
+
#
|
1248
|
+
# @return [Integer]
|
1249
|
+
def min
|
1250
|
+
attr_get_integer(OCI_ATTR_MIN)
|
1251
|
+
end
|
1252
|
+
|
1253
|
+
# maximum value
|
1254
|
+
#
|
1255
|
+
# @return [Integer]
|
1256
|
+
def max
|
1257
|
+
attr_get_integer(OCI_ATTR_MAX)
|
1258
|
+
end
|
1259
|
+
|
1260
|
+
# increment
|
1261
|
+
#
|
1262
|
+
# @return [Integer]
|
1263
|
+
def incr
|
1264
|
+
attr_get_integer(OCI_ATTR_INCR)
|
1265
|
+
end
|
1266
|
+
|
1267
|
+
# number of sequence numbers cached; zero if the sequence is not a cached sequence.
|
1268
|
+
#
|
1269
|
+
# @return [Integer]
|
1270
|
+
def cache
|
1271
|
+
attr_get_integer(OCI_ATTR_CACHE)
|
1272
|
+
end
|
1273
|
+
|
1274
|
+
# whether the sequence is ordered
|
1275
|
+
def order?
|
1276
|
+
__boolean(OCI_ATTR_ORDER)
|
1277
|
+
end
|
1278
|
+
|
1279
|
+
# high-water mark
|
1280
|
+
#
|
1281
|
+
# @return [Integer]
|
1282
|
+
def hw_mark
|
1283
|
+
attr_get_integer(OCI_ATTR_HW_MARK)
|
1284
|
+
end
|
1285
|
+
end
|
1286
|
+
|
1287
|
+
# Metadata for a sequence.
|
1288
|
+
#
|
1289
|
+
# This is returned by:
|
1290
|
+
# * OCI8::Metadata::Table#columns
|
1291
|
+
class Column < Base
|
1292
|
+
register_ptype OCI_PTYPE_COL
|
1293
|
+
|
1294
|
+
## Table 6-13 Attributes Belonging to Columns of Tables or Views
|
1295
|
+
|
1296
|
+
if OCI8.oracle_client_version >= ORAVER_9_0
|
1297
|
+
# returns the type of length semantics of the column.
|
1298
|
+
# [<tt>:byte</tt>] byte-length semantics
|
1299
|
+
# [<tt>:char</tt>] character-length semantics.
|
1300
|
+
#
|
1301
|
+
# (unavailable on Oracle 8.1 or lower)
|
1302
|
+
def char_used?
|
1303
|
+
attr_get_ub1(OCI_ATTR_CHAR_USED) != 0
|
1304
|
+
end
|
1305
|
+
|
1306
|
+
# returns the column character length which is the number of
|
1307
|
+
# characters allowed in the column. It is the counterpart of
|
1308
|
+
# OCI8::Metadata::Column#data_size which gets the byte length.
|
1309
|
+
def char_size
|
1310
|
+
attr_get_ub2(OCI_ATTR_CHAR_SIZE)
|
1311
|
+
end
|
1312
|
+
else
|
1313
|
+
def char_used?
|
1314
|
+
false
|
1315
|
+
end
|
1316
|
+
|
1317
|
+
def char_size
|
1318
|
+
data_size
|
1319
|
+
end
|
1320
|
+
end
|
1321
|
+
|
1322
|
+
# The maximum size of the column. This length is
|
1323
|
+
# returned in bytes and not characters for strings and raws.
|
1324
|
+
# This returns character length multiplied by NLS ratio for
|
1325
|
+
# character-length semantics columns when using Oracle 9i
|
1326
|
+
# or upper.
|
1327
|
+
def data_size
|
1328
|
+
attr_get_ub2(OCI_ATTR_DATA_SIZE)
|
1329
|
+
end
|
1330
|
+
|
1331
|
+
# the datatype of the column.
|
1332
|
+
def data_type
|
1333
|
+
__data_type
|
1334
|
+
end
|
1335
|
+
|
1336
|
+
# column name
|
1337
|
+
def name
|
1338
|
+
attr_get_string(OCI_ATTR_NAME)
|
1339
|
+
end
|
1340
|
+
|
1341
|
+
# The precision of numeric columns. If the precision is nonzero
|
1342
|
+
# and scale is -127, then it is a FLOAT, else it is a
|
1343
|
+
# NUMBER(precision, scale). For the case when precision is 0,
|
1344
|
+
# NUMBER(precision, scale) can be represented simply as NUMBER.
|
1345
|
+
def precision
|
1346
|
+
__is_implicit? ? attr_get_sb2(OCI_ATTR_PRECISION) : attr_get_ub1(OCI_ATTR_PRECISION)
|
1347
|
+
end
|
1348
|
+
|
1349
|
+
# The scale of numeric columns. If the precision is nonzero and
|
1350
|
+
# scale is -127, then it is a FLOAT, else it is a
|
1351
|
+
# NUMBER(precision, scale). For the case when precision is 0,
|
1352
|
+
# NUMBER(precision, scale) can be represented simply as NUMBER.
|
1353
|
+
def scale
|
1354
|
+
attr_get_sb1(OCI_ATTR_SCALE)
|
1355
|
+
end
|
1356
|
+
|
1357
|
+
# Returns 0 if null values are not permitted for the column
|
1358
|
+
def nullable?
|
1359
|
+
__boolean(OCI_ATTR_IS_NULL)
|
1360
|
+
end
|
1361
|
+
|
1362
|
+
# Returns a string which is the type name. The returned value
|
1363
|
+
# will contain the type name if the datatype is <tt>:named_type</tt> or
|
1364
|
+
# <tt>:ref</tt>. If the datatype is <tt>:named_type</tt>, the name of the named
|
1365
|
+
# datatype's type is returned. If the datatype is <tt>:ref</tt>, the
|
1366
|
+
# type name of the named datatype pointed to by the REF is
|
1367
|
+
# returned
|
1368
|
+
def type_name
|
1369
|
+
rv = attr_get_string(OCI_ATTR_TYPE_NAME)
|
1370
|
+
rv.length == 0 ? nil : rv
|
1371
|
+
end
|
1372
|
+
|
1373
|
+
# Returns a string with the schema name under which the type has been created
|
1374
|
+
def schema_name
|
1375
|
+
rv = attr_get_string(OCI_ATTR_SCHEMA_NAME)
|
1376
|
+
rv.length == 0 ? nil : rv
|
1377
|
+
end
|
1378
|
+
|
1379
|
+
# to type metadata if possible
|
1380
|
+
def type_metadata
|
1381
|
+
case attr_get_ub2(OCI_ATTR_DATA_TYPE)
|
1382
|
+
when 108, 110 # named_type or ref
|
1383
|
+
__type_metadata(OCI8::Metadata::Type)
|
1384
|
+
else
|
1385
|
+
nil
|
1386
|
+
end
|
1387
|
+
end
|
1388
|
+
|
1389
|
+
# The character set id, if the column is of a string/character type
|
1390
|
+
def charset_id
|
1391
|
+
attr_get_ub2(OCI_ATTR_CHARSET_ID)
|
1392
|
+
end
|
1393
|
+
|
1394
|
+
# The character set form, if the column is of a string/character type
|
1395
|
+
def charset_form
|
1396
|
+
__charset_form
|
1397
|
+
end
|
1398
|
+
|
1399
|
+
## Table 6-8 Attributes Belonging to Type Attributes
|
1400
|
+
## But Column also have these.
|
1401
|
+
|
1402
|
+
if OCI8.oracle_client_version >= ORAVER_9_0
|
1403
|
+
# The fractional seconds precision of a datetime or interval.
|
1404
|
+
#
|
1405
|
+
# (unavailable on Oracle 8.1 or lower)
|
1406
|
+
def fsprecision
|
1407
|
+
attr_get_ub1(OCI_ATTR_FSPRECISION)
|
1408
|
+
end
|
1409
|
+
|
1410
|
+
# The leading field precision of an interval
|
1411
|
+
#
|
1412
|
+
# (unavailable on Oracle 8.1 or lower)
|
1413
|
+
def lfprecision
|
1414
|
+
attr_get_ub1(OCI_ATTR_LFPRECISION)
|
1415
|
+
end
|
1416
|
+
end
|
1417
|
+
|
1418
|
+
# The character set name, if the column is of a string/character type
|
1419
|
+
def charset_name
|
1420
|
+
__charset_name(charset_id)
|
1421
|
+
end
|
1422
|
+
|
1423
|
+
def data_type_string
|
1424
|
+
__data_type_string
|
1425
|
+
end
|
1426
|
+
alias :type_string :data_type_string # :nodoc: old name of data_type_string
|
1427
|
+
|
1428
|
+
def to_s
|
1429
|
+
%Q{"#{name}" #{__data_type_string}}
|
1430
|
+
end
|
1431
|
+
|
1432
|
+
def inspect # :nodoc:
|
1433
|
+
"#<#{self.class.name}: #{name} #{__data_type_string}>"
|
1434
|
+
end
|
1435
|
+
end
|
1436
|
+
|
1437
|
+
# Abstract super class of Argument, TypeArgument and TypeResult.
|
1438
|
+
class ArgBase < Base
|
1439
|
+
## Table 6-14 Attributes Belonging to Arguments/Results
|
1440
|
+
|
1441
|
+
# the argument name
|
1442
|
+
def name
|
1443
|
+
attr_get_string(OCI_ATTR_NAME)
|
1444
|
+
end
|
1445
|
+
|
1446
|
+
# the position of the argument in the argument list.
|
1447
|
+
def position
|
1448
|
+
attr_get_ub2(OCI_ATTR_POSITION)
|
1449
|
+
end
|
1450
|
+
|
1451
|
+
# typecode
|
1452
|
+
def typecode
|
1453
|
+
__typecode(OCI_ATTR_TYPECODE)
|
1454
|
+
end
|
1455
|
+
|
1456
|
+
# the datatype of the argument
|
1457
|
+
def data_type
|
1458
|
+
__data_type
|
1459
|
+
end
|
1460
|
+
|
1461
|
+
# The size of the datatype of the argument. This length is
|
1462
|
+
# returned in bytes and not characters for strings and raws. It
|
1463
|
+
# returns 22 for NUMBERs.
|
1464
|
+
def data_size
|
1465
|
+
attr_get_ub2(OCI_ATTR_DATA_SIZE)
|
1466
|
+
end
|
1467
|
+
|
1468
|
+
# The precision of numeric arguments. If the precision is
|
1469
|
+
# nonzero and scale is -127, then it is a FLOAT, else it is a
|
1470
|
+
# NUMBER(precision, scale). For the case when precision is 0,
|
1471
|
+
# NUMBER(precision, scale) can be represented simply as NUMBER.
|
1472
|
+
def precision
|
1473
|
+
__is_implicit? ? attr_get_sb2(OCI_ATTR_PRECISION) : attr_get_ub1(OCI_ATTR_PRECISION)
|
1474
|
+
end
|
1475
|
+
|
1476
|
+
# The scale of numeric arguments. If the precision is nonzero
|
1477
|
+
# and scale is -127, then it is a FLOAT, else it is a
|
1478
|
+
# NUMBER(precision, scale). For the case when precision is 0,
|
1479
|
+
# NUMBER(precision, scale) can be represented simply as NUMBER.
|
1480
|
+
def scale
|
1481
|
+
attr_get_sb1(OCI_ATTR_SCALE)
|
1482
|
+
end
|
1483
|
+
|
1484
|
+
# The datatype levels. This attribute always returns zero.
|
1485
|
+
def level
|
1486
|
+
attr_get_ub2(OCI_ATTR_LEVEL)
|
1487
|
+
end
|
1488
|
+
|
1489
|
+
# Indicates whether an argument has a default
|
1490
|
+
def has_default
|
1491
|
+
attr_get_ub1(OCI_ATTR_HAS_DEFAULT)
|
1492
|
+
end
|
1493
|
+
|
1494
|
+
# The list of arguments at the next level (when the argument is
|
1495
|
+
# of a record or table type).
|
1496
|
+
def list_arguments
|
1497
|
+
__param(OCI_ATTR_LIST_ARGUMENTS)
|
1498
|
+
end
|
1499
|
+
private :list_arguments
|
1500
|
+
|
1501
|
+
# Indicates the argument mode. Values are <tt>:in</tt>,
|
1502
|
+
# <tt>:out</tt> or <tt>:inout</tt>
|
1503
|
+
def iomode
|
1504
|
+
case attr_get_ub4(OCI_ATTR_IOMODE)
|
1505
|
+
when 0; :in
|
1506
|
+
when 1; :out
|
1507
|
+
when 2; :inout
|
1508
|
+
end
|
1509
|
+
end
|
1510
|
+
|
1511
|
+
# Returns a radix (if number type)
|
1512
|
+
def radix
|
1513
|
+
attr_get_ub1(OCI_ATTR_RADIX)
|
1514
|
+
end
|
1515
|
+
|
1516
|
+
# doesn't work.
|
1517
|
+
# def nullable?
|
1518
|
+
# __boolean(OCI_ATTR_IS_NULL)
|
1519
|
+
# end
|
1520
|
+
|
1521
|
+
# Returns a string which is the type name, or the package name
|
1522
|
+
# in the case of package local types. The returned value will
|
1523
|
+
# contain the type name if the datatype is <tt>:named_type</tt> or
|
1524
|
+
# <tt>:ref</tt>. If the datatype is <tt>:named_type</tt>, the name of the named
|
1525
|
+
# datatype's type is returned. If the datatype is <tt>:ref</tt>, the type
|
1526
|
+
# name of the named datatype pointed to by the REF is returned.
|
1527
|
+
def type_name
|
1528
|
+
attr_get_string(OCI_ATTR_TYPE_NAME)
|
1529
|
+
end
|
1530
|
+
|
1531
|
+
# For <tt>:named_type</tt> or <tt>:ref</tt>, returns a string with the schema name
|
1532
|
+
# under which the type was created, or under which the package
|
1533
|
+
# was created in the case of package local types
|
1534
|
+
def schema_name
|
1535
|
+
attr_get_string(OCI_ATTR_SCHEMA_NAME)
|
1536
|
+
end
|
1537
|
+
|
1538
|
+
# For <tt>:named_type</tt> or <tt>:ref</tt>, returns a string with the type name,
|
1539
|
+
# in the case of package local types
|
1540
|
+
def sub_name
|
1541
|
+
attr_get_string(OCI_ATTR_SUB_NAME)
|
1542
|
+
end
|
1543
|
+
|
1544
|
+
# For <tt>:named_type</tt> or <tt>:ref</tt>, returns a string with the database
|
1545
|
+
# link name of the database on which the type exists. This can
|
1546
|
+
# happen only in the case of package local types, when the
|
1547
|
+
# package is remote.
|
1548
|
+
def link
|
1549
|
+
attr_get_string(OCI_ATTR_LINK)
|
1550
|
+
end
|
1551
|
+
|
1552
|
+
# to type metadata if possible
|
1553
|
+
def type_metadata
|
1554
|
+
__type_metadata(OCI8::Metadata::Type)
|
1555
|
+
end
|
1556
|
+
|
1557
|
+
# Returns the character set ID if the argument is of a
|
1558
|
+
# string/character type
|
1559
|
+
def charset_id
|
1560
|
+
attr_get_ub2(OCI_ATTR_CHARSET_ID)
|
1561
|
+
end
|
1562
|
+
|
1563
|
+
# Returns the character set form if the argument is of a
|
1564
|
+
# string/character type
|
1565
|
+
def charset_form
|
1566
|
+
__charset_form
|
1567
|
+
end
|
1568
|
+
|
1569
|
+
# Returns the character set name if the argument is of a
|
1570
|
+
# string/character type
|
1571
|
+
def charset_name
|
1572
|
+
__charset_name(charset_id)
|
1573
|
+
end
|
1574
|
+
|
1575
|
+
# The list of arguments at the next level (when the argument is
|
1576
|
+
# of a record or table type).
|
1577
|
+
def arguments
|
1578
|
+
@arguments ||= list_arguments.to_a
|
1579
|
+
end
|
1580
|
+
|
1581
|
+
def inspect # :nodoc:
|
1582
|
+
"#<#{self.class.name}: #{name} #{__data_type_string}>"
|
1583
|
+
end
|
1584
|
+
end
|
1585
|
+
|
1586
|
+
# Metadata for a argument.
|
1587
|
+
#
|
1588
|
+
# This is returned by:
|
1589
|
+
# * OCI8::Metadata::Procedure#arguments
|
1590
|
+
# * OCI8::Metadata::Function#arguments
|
1591
|
+
#
|
1592
|
+
# See ArgBase's methods.
|
1593
|
+
class Argument < ArgBase
|
1594
|
+
register_ptype OCI_PTYPE_ARG
|
1595
|
+
end
|
1596
|
+
|
1597
|
+
# Metadata for a argument.
|
1598
|
+
#
|
1599
|
+
# This is returned by:
|
1600
|
+
# * OCI8::Metadata::TypeMethod#arguments
|
1601
|
+
#
|
1602
|
+
# See ArgBase's methods.
|
1603
|
+
class TypeArgument < ArgBase
|
1604
|
+
register_ptype OCI_PTYPE_TYPE_ARG
|
1605
|
+
end
|
1606
|
+
|
1607
|
+
# Metadata for a argument.
|
1608
|
+
#
|
1609
|
+
# This is returned by: .... unknown.
|
1610
|
+
# What's method returns this value?
|
1611
|
+
#
|
1612
|
+
# See ArgBase's methods.
|
1613
|
+
class TypeResult < ArgBase
|
1614
|
+
register_ptype OCI_PTYPE_TYPE_RESULT
|
1615
|
+
end
|
1616
|
+
|
1617
|
+
# internal use only.
|
1618
|
+
class List < Base # :nodoc:
|
1619
|
+
register_ptype OCI_PTYPE_LIST
|
1620
|
+
|
1621
|
+
## Table 6-15 List Attributes
|
1622
|
+
|
1623
|
+
if OCI8::oracle_client_version < OCI8::ORAVER_8_1
|
1624
|
+
def ltype
|
1625
|
+
raise "This feature is unavailable on Oracle 8.0"
|
1626
|
+
end
|
1627
|
+
else
|
1628
|
+
def ltype
|
1629
|
+
attr_get_ub2(OCI_ATTR_LTYPE)
|
1630
|
+
end
|
1631
|
+
end
|
1632
|
+
|
1633
|
+
# convert to array
|
1634
|
+
def to_a
|
1635
|
+
# Table 6-15 List Attributes
|
1636
|
+
case ltype
|
1637
|
+
when OCI_LTYPE_COLUMN; offset = 1
|
1638
|
+
when OCI_LTYPE_ARG_PROC; offset = 1
|
1639
|
+
when OCI_LTYPE_ARG_FUNC; offset = 0
|
1640
|
+
when OCI_LTYPE_SUBPRG; offset = 0
|
1641
|
+
when OCI_LTYPE_TYPE_ATTR; offset = 1
|
1642
|
+
when OCI_LTYPE_TYPE_METHOD; offset = 1
|
1643
|
+
when OCI_LTYPE_TYPE_ARG_PROC; offset = 0
|
1644
|
+
when OCI_LTYPE_TYPE_ARG_FUNC; offset = 1
|
1645
|
+
when OCI_LTYPE_SCH_OBJ; offset = 0
|
1646
|
+
when OCI_LTYPE_DB_SCH; offset = 0
|
1647
|
+
#when OCI_LTYPE_TYPE_SUBTYPE; offset = ?
|
1648
|
+
#when OCI_LTYPE_TABLE_ALIAS; offset = ?
|
1649
|
+
#when OCI_LTYPE_VARIABLE_TYPE; offset = ?
|
1650
|
+
#when OCI_LTYPE_NAME_VALUE; offset = ?
|
1651
|
+
else
|
1652
|
+
raise NotImplementedError, "unsupported list type #{list.ltype}"
|
1653
|
+
end
|
1654
|
+
ary = []
|
1655
|
+
0.upto(num_params - 1) do |i|
|
1656
|
+
ary << __param_at(i + offset)
|
1657
|
+
end
|
1658
|
+
ary
|
1659
|
+
end
|
1660
|
+
end
|
1661
|
+
|
1662
|
+
# Metadata for a schema.
|
1663
|
+
#
|
1664
|
+
# This is returned by:
|
1665
|
+
# * OCI8#describe_schema(schema_name)
|
1666
|
+
# * OCI8::Metadata::Database#schemas
|
1667
|
+
class Schema < Base
|
1668
|
+
register_ptype OCI_PTYPE_SCHEMA
|
1669
|
+
|
1670
|
+
## Table 6-16 Attributes Specific to Schemas
|
1671
|
+
|
1672
|
+
def list_objects
|
1673
|
+
__param(OCI_ATTR_LIST_OBJECTS)
|
1674
|
+
end
|
1675
|
+
private :list_objects
|
1676
|
+
|
1677
|
+
# array of objects in the schema.
|
1678
|
+
# This includes unusable objects.
|
1679
|
+
def all_objects
|
1680
|
+
@all_objects ||=
|
1681
|
+
begin
|
1682
|
+
begin
|
1683
|
+
objs = list_objects
|
1684
|
+
rescue OCIError => exc
|
1685
|
+
if exc.code != -1
|
1686
|
+
raise
|
1687
|
+
end
|
1688
|
+
# describe again.
|
1689
|
+
objs = __con.describe_schema(obj_schema).list_objects
|
1690
|
+
end
|
1691
|
+
objs.to_a.collect! do |elem|
|
1692
|
+
case elem
|
1693
|
+
when OCI8::Metadata::Type
|
1694
|
+
# to avoid a segmentation fault
|
1695
|
+
begin
|
1696
|
+
__con.describe_type(elem.obj_schema + '.' + elem.obj_name)
|
1697
|
+
rescue OCIError
|
1698
|
+
# ignore ORA-24372: invalid object for describe
|
1699
|
+
raise if $!.code != 24372
|
1700
|
+
end
|
1701
|
+
else
|
1702
|
+
elem
|
1703
|
+
end
|
1704
|
+
end.compact
|
1705
|
+
end
|
1706
|
+
end
|
1707
|
+
|
1708
|
+
# array of objects in the schema.
|
1709
|
+
def objects
|
1710
|
+
@objects ||= all_objects.reject do |obj|
|
1711
|
+
case obj
|
1712
|
+
when Unknown
|
1713
|
+
true
|
1714
|
+
when Synonym
|
1715
|
+
begin
|
1716
|
+
obj.objid
|
1717
|
+
false
|
1718
|
+
rescue OCIError
|
1719
|
+
true
|
1720
|
+
end
|
1721
|
+
else
|
1722
|
+
false
|
1723
|
+
end
|
1724
|
+
end
|
1725
|
+
end
|
1726
|
+
|
1727
|
+
def inspect # :nodoc:
|
1728
|
+
"#<#{self.class.name}:(#{obj_id}) #{obj_schema}>"
|
1729
|
+
end
|
1730
|
+
end
|
1731
|
+
|
1732
|
+
# Metadata for a database.
|
1733
|
+
#
|
1734
|
+
# This is returned by:
|
1735
|
+
# * OCI8#describe_database(database_name)
|
1736
|
+
class Database < Base
|
1737
|
+
register_ptype OCI_PTYPE_DATABASE
|
1738
|
+
|
1739
|
+
# Table 6-17 Attributes Specific to Databases
|
1740
|
+
|
1741
|
+
# database version
|
1742
|
+
def version
|
1743
|
+
attr_get_string(OCI_ATTR_VERSION)
|
1744
|
+
end
|
1745
|
+
|
1746
|
+
# database character set Id
|
1747
|
+
def charset_id
|
1748
|
+
attr_get_ub2(OCI_ATTR_CHARSET_ID)
|
1749
|
+
end
|
1750
|
+
|
1751
|
+
# database national language support character set Id
|
1752
|
+
def ncharset_id
|
1753
|
+
attr_get_ub2(OCI_ATTR_NCHARSET_ID)
|
1754
|
+
end
|
1755
|
+
|
1756
|
+
# List of schemas in the database
|
1757
|
+
def list_schemas
|
1758
|
+
__param(OCI_ATTR_LIST_SCHEMAS)
|
1759
|
+
end
|
1760
|
+
private :list_schemas
|
1761
|
+
|
1762
|
+
# Maximum length of a procedure name
|
1763
|
+
def max_proc_len
|
1764
|
+
attr_get_ub4(OCI_ATTR_MAX_PROC_LEN)
|
1765
|
+
end
|
1766
|
+
|
1767
|
+
# Maximum length of a column name
|
1768
|
+
def max_column_len
|
1769
|
+
attr_get_ub4(OCI_ATTR_MAX_COLUMN_LEN)
|
1770
|
+
end
|
1771
|
+
|
1772
|
+
# How a COMMIT operation affects cursors and prepared statements in
|
1773
|
+
# the database. Values are:
|
1774
|
+
# [<tt>:cusror_open</tt>] preserve cursor state as before the commit
|
1775
|
+
# operation
|
1776
|
+
# [<tt>:cursor_closed</tt>] cursors are closed on COMMIT, but the
|
1777
|
+
# application can still re-execute the
|
1778
|
+
# statement without re-preparing it
|
1779
|
+
def cursor_commit_behavior
|
1780
|
+
case attr_get_ub1(OCI_ATTR_CURSOR_COMMIT_BEHAVIOR)
|
1781
|
+
when 0; :cusror_open
|
1782
|
+
when 1; :cursor_closed
|
1783
|
+
end
|
1784
|
+
end
|
1785
|
+
|
1786
|
+
# Maximum length of a catalog (database) name
|
1787
|
+
def max_catalog_namelen
|
1788
|
+
attr_get_ub1(OCI_ATTR_MAX_CATALOG_NAMELEN)
|
1789
|
+
end
|
1790
|
+
|
1791
|
+
# Position of the catalog in a qualified table. Values are
|
1792
|
+
# <tt>:cl_start</tt> and <tt>:cl_end</tt>
|
1793
|
+
def catalog_location
|
1794
|
+
case attr_get_ub1(OCI_ATTR_CATALOG_LOCATION)
|
1795
|
+
when 0; :cl_start
|
1796
|
+
when 1; :cl_end
|
1797
|
+
end
|
1798
|
+
end
|
1799
|
+
|
1800
|
+
# Does database support savepoints? Values are
|
1801
|
+
# <tt>:sp_supported</tt> and <tt>:sp_unsupported</tt>
|
1802
|
+
def savepoint_support
|
1803
|
+
case attr_get_ub1(OCI_ATTR_SAVEPOINT_SUPPORT)
|
1804
|
+
when 0; :sp_supported
|
1805
|
+
when 1; :sp_unsupported
|
1806
|
+
end
|
1807
|
+
end
|
1808
|
+
|
1809
|
+
# Does database support the nowait clause? Values are
|
1810
|
+
# <tt>:nw_supported</tt> and <tt>:nw_unsupported</tt>
|
1811
|
+
def nowait_support
|
1812
|
+
case attr_get_ub1(OCI_ATTR_NOWAIT_SUPPORT)
|
1813
|
+
when 0; :nw_supported
|
1814
|
+
when 1; :nw_unsupported
|
1815
|
+
end
|
1816
|
+
end
|
1817
|
+
|
1818
|
+
# Is autocommit mode required for DDL statements? Values are
|
1819
|
+
# <tt>:ac_ddl</tt> and <tt>:no_ac_ddl</tt>
|
1820
|
+
def autocommit_ddl
|
1821
|
+
case attr_get_ub1(OCI_ATTR_AUTOCOMMIT_DDL)
|
1822
|
+
when 0; :ac_ddl
|
1823
|
+
when 1; :no_ac_ddl
|
1824
|
+
end
|
1825
|
+
end
|
1826
|
+
|
1827
|
+
# Locking mode for the database. Values are <tt>:lock_immediate</tt> and
|
1828
|
+
# <tt>:lock_delayed</tt>
|
1829
|
+
def locking_mode
|
1830
|
+
case attr_get_ub1(OCI_ATTR_LOCKING_MODE)
|
1831
|
+
when 0; :lock_immediate
|
1832
|
+
when 1; :lock_delayed
|
1833
|
+
end
|
1834
|
+
end
|
1835
|
+
|
1836
|
+
# database character set name
|
1837
|
+
def charset_name
|
1838
|
+
__charset_name(charset_id)
|
1839
|
+
end
|
1840
|
+
|
1841
|
+
# database national language support character set name
|
1842
|
+
def ncharset_name
|
1843
|
+
__charset_name(ncharset_id)
|
1844
|
+
end
|
1845
|
+
|
1846
|
+
# array of Schema objects in the database
|
1847
|
+
def schemas
|
1848
|
+
@schemas ||= list_schemas.to_a
|
1849
|
+
end
|
1850
|
+
|
1851
|
+
def inspect # :nodoc:
|
1852
|
+
"#<#{self.class.name}:(#{obj_id}) #{obj_name} #{version}>"
|
1853
|
+
end
|
1854
|
+
end
|
1855
|
+
|
1856
|
+
=begin
|
1857
|
+
class Rule < Base # :nodoc:
|
1858
|
+
register_ptype OCI_PTYPE_RULE
|
1859
|
+
|
1860
|
+
# Table 6-18 Attributes Specific to Rules
|
1861
|
+
|
1862
|
+
def condition
|
1863
|
+
attr_get_string(OCI_ATTR_CONDITION)
|
1864
|
+
end
|
1865
|
+
|
1866
|
+
def eval_context_owner
|
1867
|
+
attr_get_string(OCI_ATTR_EVAL_CONTEXT_OWNER)
|
1868
|
+
end
|
1869
|
+
|
1870
|
+
def eval_context_name
|
1871
|
+
attr_get_string(OCI_ATTR_EVAL_CONTEXT_NAME)
|
1872
|
+
end
|
1873
|
+
|
1874
|
+
def comment
|
1875
|
+
attr_get_string(OCI_ATTR_COMMENT)
|
1876
|
+
end
|
1877
|
+
|
1878
|
+
# def list_action_context
|
1879
|
+
# __param(???)
|
1880
|
+
# end
|
1881
|
+
end
|
1882
|
+
|
1883
|
+
class RuleSet < Base # :nodoc:
|
1884
|
+
register_ptype OCI_PTYPE_RULE_SET
|
1885
|
+
|
1886
|
+
# Table 6-19 Attributes Specific to Rule Sets
|
1887
|
+
|
1888
|
+
def eval_context_owner
|
1889
|
+
attr_get_string(OCI_ATTR_EVAL_CONTEXT_OWNER)
|
1890
|
+
end
|
1891
|
+
|
1892
|
+
def eval_context_name
|
1893
|
+
attr_get_string(OCI_ATTR_EVAL_CONTEXT_NAME)
|
1894
|
+
end
|
1895
|
+
|
1896
|
+
def comment
|
1897
|
+
attr_get_string(OCI_ATTR_COMMENT)
|
1898
|
+
end
|
1899
|
+
|
1900
|
+
# def list_rules
|
1901
|
+
# __param(???)
|
1902
|
+
# end
|
1903
|
+
end
|
1904
|
+
|
1905
|
+
class EvaluationContext < Base # :nodoc:
|
1906
|
+
register_ptype OCI_PTYPE_EVALUATION_CONTEXT
|
1907
|
+
|
1908
|
+
# Table 6-20 Attributes Specific to Evaluation Contexts
|
1909
|
+
|
1910
|
+
def evaluation_function
|
1911
|
+
attr_get_string(OCI_ATTR_EVALUATION_FUNCTION)
|
1912
|
+
end
|
1913
|
+
|
1914
|
+
def comment
|
1915
|
+
attr_get_string(OCI_ATTR_COMMENT)
|
1916
|
+
end
|
1917
|
+
|
1918
|
+
def list_table_aliases
|
1919
|
+
__param(OCI_ATTR_LIST_TABLE_ALIASES)
|
1920
|
+
end
|
1921
|
+
|
1922
|
+
def list_variable_types
|
1923
|
+
__param(OCI_ATTR_LIST_VARIABLE_TYPES)
|
1924
|
+
end
|
1925
|
+
end
|
1926
|
+
|
1927
|
+
class TableAlias < Base # :nodoc:
|
1928
|
+
register_ptype OCI_PTYPE_TABLE_ALIAS
|
1929
|
+
|
1930
|
+
# Table 6-21 Attributes Specific to Table Aliases
|
1931
|
+
|
1932
|
+
def name
|
1933
|
+
attr_get_string(OCI_ATTR_NAME)
|
1934
|
+
end
|
1935
|
+
|
1936
|
+
def table_name
|
1937
|
+
attr_get_string(OCI_ATTR_TABLE_NAME)
|
1938
|
+
end
|
1939
|
+
end
|
1940
|
+
|
1941
|
+
class VariableType < Base # :nodoc:
|
1942
|
+
register_ptype OCI_PTYPE_VARIABLE_TYPE
|
1943
|
+
|
1944
|
+
# Table 6-22 Attributes Specific to Variable Types
|
1945
|
+
|
1946
|
+
def name
|
1947
|
+
attr_get_string(OCI_ATTR_NAME)
|
1948
|
+
end
|
1949
|
+
|
1950
|
+
def var_type
|
1951
|
+
attr_get_string(OCI_ATTR_VAR_TYPE)
|
1952
|
+
end
|
1953
|
+
|
1954
|
+
def var_value_function
|
1955
|
+
attr_get_string(OCI_ATTR_VAR_VALUE_FUNCTION)
|
1956
|
+
end
|
1957
|
+
|
1958
|
+
def var_method_function
|
1959
|
+
attr_get_string(OCI_ATTR_VAR_METHOD_FUNCTION)
|
1960
|
+
end
|
1961
|
+
end
|
1962
|
+
|
1963
|
+
class NameValue < Base # :nodoc:
|
1964
|
+
register_ptype OCI_PTYPE_NAME_VALUE
|
1965
|
+
|
1966
|
+
# Table 6-23 Attributes Specific to Name Value Pair
|
1967
|
+
|
1968
|
+
def name
|
1969
|
+
attr_get_string(OCI_ATTR_NAME)
|
1970
|
+
end
|
1971
|
+
|
1972
|
+
# not implemented
|
1973
|
+
def value
|
1974
|
+
__anydata(OCI_ATTR_VALUE)
|
1975
|
+
end
|
1976
|
+
end
|
1977
|
+
=end
|
1978
|
+
end # OCI8::Metadata
|
1979
|
+
|
1980
|
+
# Returns object information.
|
1981
|
+
#
|
1982
|
+
# The return type is depends on the object type.
|
1983
|
+
#
|
1984
|
+
# Oracle type:: Ruby type
|
1985
|
+
# Table:: {OCI8::Metadata::Table}
|
1986
|
+
# View:: {OCI8::Metadata::View}
|
1987
|
+
# Procedure:: {OCI8::Metadata::Procedure}
|
1988
|
+
# Function:: {OCI8::Metadata::Function}
|
1989
|
+
# Package:: {OCI8::Metadata::Package}
|
1990
|
+
# Type:: {OCI8::Metadata::Type}
|
1991
|
+
# Synonym:: {OCI8::Metadata::Synonym}
|
1992
|
+
# Sequence:: {OCI8::Metadata::Sequence}
|
1993
|
+
#
|
1994
|
+
# @param [String] object_name
|
1995
|
+
# @return [a subclass of OCI8::Metadata::Base]
|
1996
|
+
def describe_any(object_name)
|
1997
|
+
__describe(object_name, OCI8::Metadata::Unknown, true)
|
1998
|
+
end
|
1999
|
+
# Returns table or view information. If the name is a current schema's synonym
|
2000
|
+
# name or a public synonym name, it returns table or view information which
|
2001
|
+
# the synonym refers.
|
2002
|
+
#
|
2003
|
+
# If +table_only+ is true, it checks tables in the current schema.
|
2004
|
+
#
|
2005
|
+
# @param [String] table_name
|
2006
|
+
# @param [Boolean] table_only (default: false)
|
2007
|
+
# @return [OCI8::Metadata::Table or OCI8::Metadata::View]
|
2008
|
+
def describe_table(table_name, table_only = false)
|
2009
|
+
if table_only
|
2010
|
+
# check my own tables only.
|
2011
|
+
__describe(table_name, OCI8::Metadata::Table, false)
|
2012
|
+
else
|
2013
|
+
# check tables, views, synonyms and public synonyms.
|
2014
|
+
recursive_level = 20
|
2015
|
+
recursive_level.times do
|
2016
|
+
metadata = __describe(table_name, OCI8::Metadata::Unknown, true)
|
2017
|
+
case metadata
|
2018
|
+
when OCI8::Metadata::Table, OCI8::Metadata::View
|
2019
|
+
return metadata
|
2020
|
+
when OCI8::Metadata::Synonym
|
2021
|
+
table_name = metadata.translated_name
|
2022
|
+
else
|
2023
|
+
raise OCIError.new(4043, table_name) # ORA-04043: object %s does not exist
|
2024
|
+
end
|
2025
|
+
end
|
2026
|
+
raise OCIError.new(36, recursive_level) # ORA-00036: maximum number of recursive SQL levels (%s) exceeded
|
2027
|
+
end
|
2028
|
+
end
|
2029
|
+
# Returns view information
|
2030
|
+
#
|
2031
|
+
# @param [String] view_name
|
2032
|
+
# @return [OCI8::Metadata::View]
|
2033
|
+
def describe_view(view_name)
|
2034
|
+
__describe(view_name, OCI8::Metadata::View, false)
|
2035
|
+
end
|
2036
|
+
# Returns procedure information
|
2037
|
+
#
|
2038
|
+
# @param [String] procedure_name
|
2039
|
+
# @return [OCI8::Metadata::Procedure]
|
2040
|
+
def describe_procedure(procedure_name)
|
2041
|
+
__describe(procedure_name, OCI8::Metadata::Procedure, false)
|
2042
|
+
end
|
2043
|
+
# Returns function information
|
2044
|
+
#
|
2045
|
+
# @param [String] function_name
|
2046
|
+
# @return [OCI8::Metadata::Function]
|
2047
|
+
def describe_function(function_name)
|
2048
|
+
__describe(function_name, OCI8::Metadata::Function, false)
|
2049
|
+
end
|
2050
|
+
# Returns package information
|
2051
|
+
#
|
2052
|
+
# @param [String] package_name
|
2053
|
+
# @return [OCI8::Metadata::Package]
|
2054
|
+
def describe_package(package_name)
|
2055
|
+
__describe(package_name, OCI8::Metadata::Package, false)
|
2056
|
+
end
|
2057
|
+
# Returns type information
|
2058
|
+
#
|
2059
|
+
# @param [String] type_name
|
2060
|
+
# @return [OCI8::Metadata::Type]
|
2061
|
+
def describe_type(type_name)
|
2062
|
+
__describe(type_name, OCI8::Metadata::Type, false)
|
2063
|
+
end
|
2064
|
+
# Returns synonym information
|
2065
|
+
#
|
2066
|
+
# @param [String] synonym_name
|
2067
|
+
# @return [OCI8::Metadata::Synonym]
|
2068
|
+
def describe_synonym(synonym_name, check_public_also = true)
|
2069
|
+
__describe(synonym_name, OCI8::Metadata::Synonym, check_public_also)
|
2070
|
+
end
|
2071
|
+
# Returns sequence information
|
2072
|
+
#
|
2073
|
+
# @param [String] sequence_name
|
2074
|
+
# @return [OCI8::Metadata::Sequence]
|
2075
|
+
def describe_sequence(sequence_name)
|
2076
|
+
__describe(sequence_name, OCI8::Metadata::Sequence, false)
|
2077
|
+
end
|
2078
|
+
# Returns schema information
|
2079
|
+
#
|
2080
|
+
# @param [String] schema_name
|
2081
|
+
# @return [OCI8::Metadata::Schema]
|
2082
|
+
def describe_schema(schema_name)
|
2083
|
+
__describe(schema_name, OCI8::Metadata::Schema, false)
|
2084
|
+
end
|
2085
|
+
# Returns database information
|
2086
|
+
#
|
2087
|
+
# @param [String] database_name
|
2088
|
+
# @return [OCI8::Metadata::Database]
|
2089
|
+
def describe_database(database_name)
|
2090
|
+
__describe(database_name, OCI8::Metadata::Database, false)
|
2091
|
+
end
|
2092
|
+
end # OCI8
|