forked from docs/doc-exports
Reviewed-by: Pruthi, Vineet <vineet.pruthi@t-systems.com> Co-authored-by: Lu, Huayi <luhuayi@huawei.com> Co-committed-by: Lu, Huayi <luhuayi@huawei.com>
105 lines
14 KiB
HTML
105 lines
14 KiB
HTML
<a name="EN-US_TOPIC_0000001693717269"></a><a name="EN-US_TOPIC_0000001693717269"></a>
|
|
|
|
<h1 class="topictitle1">Composite Types</h1>
|
|
<div id="body0000001693717269"><p id="EN-US_TOPIC_0000001693717269__p8060118">A composite type represents the structure of a row or record, which is essentially a list of field names and their data types. GaussDB(DWS) allows table columns to be declared as composite types. A composite type is essentially the same as the row type of a table. However, using <a href="dws_06_0185.html">CREATE TYPE</a> avoids the need to create an actual table when only a type needs to be defined. A stand-alone composite type is useful as the parameter or return type of a function.</p>
|
|
<div class="section" id="EN-US_TOPIC_0000001693717269__section1044314587443"><h4 class="sectiontitle">Declaration of Composite Types</h4><p id="EN-US_TOPIC_0000001693717269__p16941401452">GaussDB (DWS) allows users to use <a href="dws_06_0185.html">CREATE TYPE</a> to define composite types.</p>
|
|
<div class="codecoloring" codetype="Sql" id="EN-US_TOPIC_0000001693717269__screen224352365019"><div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span class="normal"> 1</span>
|
|
<span class="normal"> 2</span>
|
|
<span class="normal"> 3</span>
|
|
<span class="normal"> 4</span>
|
|
<span class="normal"> 5</span>
|
|
<span class="normal"> 6</span>
|
|
<span class="normal"> 7</span>
|
|
<span class="normal"> 8</span>
|
|
<span class="normal"> 9</span>
|
|
<span class="normal">10</span></pre></div></td><td class="code"><div><pre><span></span><span class="k">CREATE</span><span class="w"> </span><span class="k">TYPE</span><span class="w"> </span><span class="n">complex</span><span class="w"> </span><span class="k">AS</span><span class="w"> </span><span class="p">(</span>
|
|
<span class="w"> </span><span class="n">r</span><span class="w"> </span><span class="n">double</span><span class="w"> </span><span class="k">precision</span><span class="p">,</span>
|
|
<span class="w"> </span><span class="n">i</span><span class="w"> </span><span class="n">double</span><span class="w"> </span><span class="k">precision</span>
|
|
<span class="w"> </span><span class="p">);</span>
|
|
|
|
<span class="k">CREATE</span><span class="w"> </span><span class="k">TYPE</span><span class="w"> </span><span class="n">inventory_item</span><span class="w"> </span><span class="k">AS</span><span class="w"> </span><span class="p">(</span>
|
|
<span class="w"> </span><span class="n">name</span><span class="w"> </span><span class="nb">text</span><span class="p">,</span>
|
|
<span class="w"> </span><span class="n">supplier_id</span><span class="w"> </span><span class="nb">integer</span><span class="p">,</span>
|
|
<span class="w"> </span><span class="n">price</span><span class="w"> </span><span class="nb">numeric</span>
|
|
<span class="w"> </span><span class="p">);</span>
|
|
</pre></div></td></tr></table></div>
|
|
|
|
</div>
|
|
<p id="EN-US_TOPIC_0000001693717269__p155612106565">After defining a composite type, you can create a table or function.</p>
|
|
<div class="codecoloring" codetype="Sql" id="EN-US_TOPIC_0000001693717269__screen232033112114"><div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span class="normal">1</span>
|
|
<span class="normal">2</span>
|
|
<span class="normal">3</span>
|
|
<span class="normal">4</span>
|
|
<span class="normal">5</span>
|
|
<span class="normal">6</span></pre></div></td><td class="code"><div><pre><span></span><span class="k">CREATE</span><span class="w"> </span><span class="k">TABLE</span><span class="w"> </span><span class="n">on_hand</span><span class="w"> </span><span class="p">(</span>
|
|
<span class="w"> </span><span class="n">item</span><span class="w"> </span><span class="n">inventory_item</span><span class="p">,</span>
|
|
<span class="w"> </span><span class="k">count</span><span class="w"> </span><span class="nb">integer</span>
|
|
<span class="w"> </span><span class="p">);</span>
|
|
|
|
<span class="k">INSERT</span><span class="w"> </span><span class="k">INTO</span><span class="w"> </span><span class="n">on_hand</span><span class="w"> </span><span class="k">VALUES</span><span class="w"> </span><span class="p">(</span><span class="k">ROW</span><span class="p">(</span><span class="s1">'fuzzy dice'</span><span class="p">,</span><span class="w"> </span><span class="mi">42</span><span class="p">,</span><span class="w"> </span><span class="mi">1</span><span class="p">.</span><span class="mi">99</span><span class="p">),</span><span class="w"> </span><span class="mi">1000</span><span class="p">);</span>
|
|
</pre></div></td></tr></table></div>
|
|
|
|
</div>
|
|
<div class="codecoloring" codetype="Sql" id="EN-US_TOPIC_0000001693717269__screen949017104218"><div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span class="normal">1</span>
|
|
<span class="normal">2</span>
|
|
<span class="normal">3</span>
|
|
<span class="normal">4</span></pre></div></td><td class="code"><div><pre><span></span><span class="k">CREATE</span><span class="w"> </span><span class="k">FUNCTION</span><span class="w"> </span><span class="n">price_extension</span><span class="p">(</span><span class="n">inventory_item</span><span class="p">,</span><span class="w"> </span><span class="nb">integer</span><span class="p">)</span><span class="w"> </span><span class="k">RETURNS</span><span class="w"> </span><span class="nb">numeric</span>
|
|
<span class="w"> </span><span class="k">AS</span><span class="w"> </span><span class="s1">'SELECT $1.price * $2'</span><span class="w"> </span><span class="k">LANGUAGE</span><span class="w"> </span><span class="k">SQL</span><span class="p">;</span>
|
|
|
|
<span class="k">SELECT</span><span class="w"> </span><span class="n">price_extension</span><span class="p">(</span><span class="n">item</span><span class="p">,</span><span class="w"> </span><span class="mi">10</span><span class="p">)</span><span class="w"> </span><span class="k">FROM</span><span class="w"> </span><span class="n">on_hand</span><span class="p">;</span>
|
|
</pre></div></td></tr></table></div>
|
|
|
|
</div>
|
|
</div>
|
|
<div class="section" id="EN-US_TOPIC_0000001693717269__section1595118321534"><h4 class="sectiontitle">Constructing a Compound Value</h4><p id="EN-US_TOPIC_0000001693717269__p221584017315">To write a composite value as a literal constant, enclose the field value in parentheses and separate them with commas. You can add double quotation marks to any field value. This is mandatory if the field value contains commas or parentheses. The general format of a compound constant is as follows:</p>
|
|
<div class="codecoloring" codetype="Sql" id="EN-US_TOPIC_0000001693717269__screen16298897238"><div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span class="normal">1</span></pre></div></td><td class="code"><div><pre><span></span><span class="s1">'( val1 , val2 , ... )'</span>
|
|
</pre></div></td></tr></table></div>
|
|
|
|
</div>
|
|
<p id="EN-US_TOPIC_0000001693717269__p102161140183719"><strong id="EN-US_TOPIC_0000001693717269__b1450112214214">'("fuzzy dice",42,1.99)'</strong> is a valid value of the <strong id="EN-US_TOPIC_0000001693717269__b59964151122">inventory_item</strong> type.</p>
|
|
<p id="EN-US_TOPIC_0000001693717269__p176539123258">To set a field to NULL, left the position empty. If you want a field to be an empty string, use quotation marks. In the following example, the first column is a non-null empty string, and the third column is NULL.</p>
|
|
<div class="codecoloring" codetype="Sql" id="EN-US_TOPIC_0000001693717269__screen117722042910"><div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span class="normal">1</span></pre></div></td><td class="code"><div><pre><span></span><span class="s1">'("",42,)'</span>
|
|
</pre></div></td></tr></table></div>
|
|
|
|
</div>
|
|
<p id="EN-US_TOPIC_0000001693717269__p620010591315">ROW expressions can also be used to build composite values. Example:</p>
|
|
<div class="codecoloring" codetype="Sql" id="EN-US_TOPIC_0000001693717269__screen6184192313321"><div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span class="normal">1</span>
|
|
<span class="normal">2</span></pre></div></td><td class="code"><div><pre><span></span><span class="k">ROW</span><span class="p">(</span><span class="s1">'fuzzy dice'</span><span class="p">,</span><span class="w"> </span><span class="mi">42</span><span class="p">,</span><span class="w"> </span><span class="mi">1</span><span class="p">.</span><span class="mi">99</span><span class="p">)</span>
|
|
<span class="k">ROW</span><span class="p">(</span><span class="s1">''</span><span class="p">,</span><span class="w"> </span><span class="mi">42</span><span class="p">,</span><span class="w"> </span><span class="k">NULL</span><span class="p">)</span>
|
|
</pre></div></td></tr></table></div>
|
|
|
|
</div>
|
|
</div>
|
|
<div class="section" id="EN-US_TOPIC_0000001693717269__section93887169332"><h4 class="sectiontitle">Access Composite Types</h4><p id="EN-US_TOPIC_0000001693717269__p1198813693417">To access a field in a composite column, you can write a dot and the name of the field, just like selecting a field from a table. To avoid confusion, you must use parentheses to distinguish it. For example, select some fields from table <strong id="EN-US_TOPIC_0000001693717269__b17131192215714">on_hand</strong>:</p>
|
|
<div class="codecoloring" codetype="Sql" id="EN-US_TOPIC_0000001693717269__screen137051811133310"><div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span class="normal">1</span>
|
|
<span class="normal">2</span></pre></div></td><td class="code"><div><pre><span></span><span class="k">SELECT</span><span class="w"> </span><span class="n">item</span><span class="p">.</span><span class="n">name</span><span class="w"> </span><span class="k">FROM</span><span class="w"> </span><span class="n">on_hand</span><span class="w"> </span><span class="k">WHERE</span><span class="w"> </span><span class="n">item</span><span class="p">.</span><span class="n">price</span><span class="w"> </span><span class="o">></span><span class="w"> </span><span class="mi">9</span><span class="p">.</span><span class="mi">99</span><span class="p">;</span>
|
|
<span class="n">ERROR</span><span class="p">:</span><span class="w"> </span><span class="n">missing</span><span class="w"> </span><span class="k">FROM</span><span class="o">-</span><span class="n">clause</span><span class="w"> </span><span class="n">entry</span><span class="w"> </span><span class="k">for</span><span class="w"> </span><span class="k">table</span><span class="w"> </span><span class="ss">"item"</span>
|
|
</pre></div></td></tr></table></div>
|
|
|
|
</div>
|
|
<p id="EN-US_TOPIC_0000001693717269__p170681117338">This writing is confused with selecting fields from a table because<strong id="EN-US_TOPIC_0000001693717269__b145541715201120"> item</strong> is regarded as a table name instead of a column name of <strong id="EN-US_TOPIC_0000001693717269__b189692611114">on_hand</strong>. It must be written as follows:</p>
|
|
<div class="codecoloring" codetype="Sql" id="EN-US_TOPIC_0000001693717269__screen87067119338"><div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span class="normal">1</span></pre></div></td><td class="code"><div><pre><span></span><span class="k">SELECT</span><span class="w"> </span><span class="p">(</span><span class="n">item</span><span class="p">).</span><span class="n">name</span><span class="w"> </span><span class="k">FROM</span><span class="w"> </span><span class="n">on_hand</span><span class="w"> </span><span class="k">WHERE</span><span class="w"> </span><span class="p">(</span><span class="n">item</span><span class="p">).</span><span class="n">price</span><span class="w"> </span><span class="o">></span><span class="w"> </span><span class="mi">9</span><span class="p">.</span><span class="mi">99</span><span class="p">;</span>
|
|
</pre></div></td></tr></table></div>
|
|
|
|
</div>
|
|
<p id="EN-US_TOPIC_0000001693717269__p1370641118330">If you need to use the table name (for example, in a multi-table query):</p>
|
|
<div class="codecoloring" codetype="Sql" id="EN-US_TOPIC_0000001693717269__screen1370611173313"><div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span class="normal">1</span></pre></div></td><td class="code"><div><pre><span></span><span class="k">SELECT</span><span class="w"> </span><span class="p">(</span><span class="n">on_hand</span><span class="p">.</span><span class="n">item</span><span class="p">).</span><span class="n">name</span><span class="w"> </span><span class="k">FROM</span><span class="w"> </span><span class="n">on_hand</span><span class="w"> </span><span class="k">WHERE</span><span class="w"> </span><span class="p">(</span><span class="n">on_hand</span><span class="p">.</span><span class="n">item</span><span class="p">).</span><span class="n">price</span><span class="w"> </span><span class="o">></span><span class="w"> </span><span class="mi">9</span><span class="p">.</span><span class="mi">99</span><span class="p">;</span>
|
|
</pre></div></td></tr></table></div>
|
|
|
|
</div>
|
|
<p id="EN-US_TOPIC_0000001693717269__p6706101110337">Objects with parentheses are now correctly interpreted as references to column <strong id="EN-US_TOPIC_0000001693717269__b168265169239">item</strong>, from which fields can be selected.</p>
|
|
<p id="EN-US_TOPIC_0000001693717269__p1670681116338">Similar syntax applies when a field is selected from a compound value. For example, to select a field from the result of a function that returns a compound value, write as follows:</p>
|
|
<div class="codecoloring" codetype="Sql" id="EN-US_TOPIC_0000001693717269__screen18706161114339"><div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span class="normal">1</span></pre></div></td><td class="code"><div><pre><span></span><span class="k">SELECT</span><span class="w"> </span><span class="p">(</span><span class="n">my_func</span><span class="p">(...)).</span><span class="n">field</span><span class="w"> </span><span class="k">FROM</span><span class="w"> </span><span class="p">...</span>
|
|
</pre></div></td></tr></table></div>
|
|
|
|
</div>
|
|
<p id="EN-US_TOPIC_0000001693717269__p570612116334">If there are no additional parentheses, this generates a syntax error.</p>
|
|
</div>
|
|
</div>
|
|
<div>
|
|
<div class="familylinks">
|
|
<div class="parentlink"><strong>Parent topic:</strong> <a href="dws_06_0008.html">Data Types</a></div>
|
|
</div>
|
|
</div>
|
|
|