SELECT ... INTO - Advanced SQL Engine - Teradata Database

Teradata Vantage™ - SQLストアド プロシージャおよび埋め込みSQL

Product
Advanced SQL Engine
Teradata Database
Release Number
17.10
Published
2021年7月
Language
日本語
Last Update
2021-09-23
dita:mapPath
ja-JP/vqj1592443206677.ditamap
dita:ditavalPath
ja-JP/wrg1590696035526.ditaval
dita:id
B035-1148
Product Category
Software
Teradata Vantage

テーブルから最大1行を選択し、その行の値を埋め込みSQLアプリケーションのホスト変数に対してか、またはローカル変数またはストアド プロシージャのパラメータに対して割り当てます。

ANSI準拠

SELECT ... INTOはANSI/ISO SQL:2011に準拠しています。

必要な権限

テーブルからデータを選択するには、そのテーブルに対するSELECT権限を持っていなければなりません。

ビューを通じてデータを選択するには、そのビューに対するSELECT権限を持っていなければなりません。さらに、そのビューの直接所有者(すなわち、そのビューが存在するデータベースの所有者)は、そのビュー内で参照されるすべてのテーブルまたはビューに対して、SELECT WITH GRANT OPTION権限を持っていなければなりません。

ストアド プロシージャの場合、選択リストおよびINTOリストのローカル変数およびパラメータはUDTにすることができます。ただし、VARIANT_TYPE UDTは除きます。

UDTデータ型を持つローカル変数またはパラメータに対するUDTUSAGE権限が必要です。

呼び出し

実行可能形式。

ストアド プロシージャおよび埋め込みSQL。

ストアド プロシージャ構文

[ with_[recursive]_modifier ] { SELECT | SET }
  [ ALL | DISTINCT ] select_list
  INTO { local_variable_name | parameter_name } [,...]
  [ from_clause ]
  [ where_clause ]

埋め込みSQL構文

[ with_[recursive]_modifier ] { SELECT | SET }
  select_list
  INTO into_spec [,...]
  [ from_clause ]
  [ where_clause ]

構文要素

into_spec
[:] host_variable_name [ [INDICATOR] :host_indicator_name ]
with_[recursive]_modifier
再帰的クエリー。WITH RECURSIVEが使用されている場合、対話式の自己結合および設定操作を使ったテーブル検索の手法を提供します。
非再帰的なWITHリクエスト修飾子は、派生テーブルと同じです。
select_list
アスタリスク( * )、または有効なSQL式をカンマで区切ったリスト。
選択リストには、DEFAULT関数のインスタンスを含めることができますが、集約関数や順序付き分析関数を含めることはできません。
ストアド プロシージャのみ:
Vantageでは、DateTimeデータ型について暗黙の変換を行ないます。その他すべてのデータ型については、選択リストのデータ型は、INTO句のターゲット リストのデータ型と一致していなければなりません。
選択リストのデータ型がINTO句のターゲット リストのデータ型と一致しない場合、明示的CASTをターゲット タイプに指定することにより、操作を正常に行なうことができます。
選択リストおよびINTOリストで指定された列はUDTデータ型にすることができます。ただし、VARIANT_TYPE UDTデータ型は除きます。システムは、UDTに対して定義されている暗黙的な変換が存在する場合、それを自動的に適用します。
ターゲット タイプへのCASTが存在し、それがAS ASSIGNMENTオプションを指定して作成された場合にのみ、システムは選択リストのデータ型の暗黙的キャスティングをUDTから事前定義データ型へ、または事前定義タイプからUDTへ適用します。
host_variable_name
選択したデータを配置するホスト変数の名前。
host_indicator_name
ホスト標識変数の名前。
from_clause
SELECTが参照するテーブルまたはビューをリストする句。
where_clause
条件式によって指定される条件を満たす行にSELECTを制限する句。
WHERE句には、その述部のコンポーネントとしてDEFAULT関数を含めることができます。
local_variable_name
選択したデータを配置するストアド プロシージャで宣言されるホスト変数の名前。
ここでは、ストアド プロシージャのステータス変数を使用することはできません。
ストアド プロシージャのみ:ローカル変数にはUDTタイプを持たせることができますが、VARIANT_TYPE UDTデータ型は除きます。
ローカル変数として使用されるUDTに対するUDTUSAGE権限が必要です。
parameter_name
選択したデータを配置するストアド プロシージャのパラメータの名前。
指定できるのは、出力パラメータ(INOUTおよびOUTタイプ)だけです。
ストアド プロシージャのみ:パラメータにはUDTタイプを持たせることができますが、VARIANT_TYPE UDTデータ型は除きます。
パラメータとして使用されるUDTに対するUDTUSAGE権限が必要です。

使用上の注意

  • コロン文字の使用のルール
    埋め込みSQLでのコロン文字の使用に関するルールは次のとおりです。
    • コロン文字の前後の埋め込み文字はオプションです。
    • host_variable_nameの先頭に追加されるコロン文字はオプションです。
    • SYSUDTLIBの先頭に追加されるコロン文字はhost_indicator_nameです。
    ストアド プロシージャでのコロン文字の使用に関するルールは次のとおりです。
    • local_variable_nameの先頭に追加されるコロン文字はオプションです。
    • param_nameの先頭に追加されるコロン文字はオプションです。
  • ストアド プロシージャのルール
    ストアド プロシージャのSELECT…INTOでは、さまざまな句を指定する順番に重要な意味があります。次の順番で指定する必要があります。
    • WITH [RECURSIVE]リクエスト修飾子
    • SELECT句
    • INTOリスト
    • FROM句

    他の要素がINTOリストとFROM句の間に入ると、結果はエラーになります。他のすべての句は、任意の順番で文の中で指定できます。

    SELECTでは、列のリストを明示的に指定する必要があります。ストアド プロシージャでは、SELECT *構文は使用できません。

    SELECT権限は、FROM句やクエリーの指定に含まれる副クエリーで指定されたすべてのテーブルに対して必要です。また、そのテーブルを格納するデータベースに対しても必要です。

    ストアド プロシージャの場合、選択リストおよびINTOリストの列のデータ型として使用されるUDTに対するUDTUSAGE権限も必要です。

    UNION句、INTERSECT句、およびMINUS句は、SELECT ... INTO文ではサポートされません。

    選択リストで指定する列の数は、ローカル変数やパラメータの仕様の数と一致する必要があります。

    ローカル変数またはパラメータ、および戻されるデータの対応する列のデータ型は互換性のあるデータ型でなければなりません。Vantageは、ローカル変数またはパラメータと対応する列のデータ型が異なる場合には、DateTimeデータ型については暗黙的な変換を実行します。

    ストアド プロシージャの場合、ローカル変数またはパラメータとして使用されるUDTに対するUDTUSAGE権限が必要です。

    文でエラーまたは失敗が生じると、通常の例外条件の処理が行なわれます。

    SELECT ... INTO文から返されてくる予定の行は、通常は多くても1つです。文の実行後に、以下のいずれかの処理が行なわれます。

    SELECT ... INTOが戻す行数 ストアド プロシージャのステータス変数に表示される値 意味
    複数の行
    SQLCODE = 7627
    SQLSTATE = ‘21000’

    ACTIVITY_COUNT =見つかった行数。

    例外条件(Teradataセッション モードでは失敗、ANSIセッション モードではエラー)

    特定の条件ハンドラーまたは一般的なハンドラは、この条件を処理するために指定することができます。ローカル変数やパラメータの値は変更されません。

    行なし、実行警告なし
    SQLCODE = 7632
    SQLSTATE = ‘02000’
    ACTIVITY_COUNT = 0
    正常な完了以外の完了条件。

    この完了条件を処理するために、特定の条件ハンドラーを指定することができます。ローカル変数やパラメータの値は変更されません。

    行なし、実行警告あり SQLCODE =警告コード。

    SQLSTATE =警告に対応するSQLSTATE値。

    ACTIVITY_COUNT = 0.
    正常な完了以外の完了条件。

    この完了条件を処理するために、特定の条件ハンドラーを指定することができます。ローカル変数やパラメータの値は変更されません。

    正確に1行、実行警告なし
    SQLCODE = 0
    SQLSTATE = ‘00000’
    ACTIVITY_COUNT = 1
    取り出された値は、ローカル変数とパラメータに割り当てられます。

    これは正常な完了です。これを処理するために、特定のハンドラーを指定することはできません。

    正確に1行、実行警告あり SQLCODE =警告コード。

    SQLSTATE =警告に対応するSQLSTATE値。

    ACTIVITY_COUNT = 1
    取り出された値は、ローカル変数とパラメータに割り当てられます。

    これは、正常な完了以外の完了条件です。これを処理するために、特定のハンドラーを指定することはできません。

  • 埋め込みSQLのルール

    UDTは明示的にはサポートされていません。

    ただし、tosql変換およびfromsql変換が定義されているUDTへは、その変換ターゲットのデータ型での外部参照が可能であることに注意してください。結果として、必要に応じてUDTでtosql変換またはfromsql変換が定義されていれば、埋め込みSQLアプリケーションはUDTを参照するSQL文を使用できます。

    さらに、アプリケーションはUDTデータをその外部(UDTではない)データ型の形式で送受信しなければなりません。

    SELECT権限は、FROM句やクエリーの指定に含まれるサブクエリーで指定されたすべてのテーブルに対して必要です。また、そのテーブルを格納するデータベースの集合に対しても必要です。

    select_listを使って指定した列の数は、ホスト変数で指定した列の数と同じでなければなりません。

    この値は、ホスト変数が指定された順序で、INTO句で指定されたホスト変数に割り当てられます。最後にSQLCODEに値が割り当てられます。

    主要なホスト変数と、返されたデータで対応する列は、同じデータ型グループでなければなりません。ただし、主要なホスト変数のデータ型が近似値である場合は除きます。この場合、一時テーブルの列のデータ型は近似値か正確な数値のいずれかにすることができます。

    一時テーブルにゼロ行が入っている場合(つまり空白の場合)、+100という値がSQLCODEに割り当てられ、INTO句で指定されたホスト変数には値が割り当てられません。

    データの行が正確に1行戻される場合、その行からの値はINTO句で指定される対応するホスト変数に割り当てられます。

    データの行が正確に1行戻される場合、-810という値がSQLCODEに割り当てられ、INTO句で指定されたホスト変数には値が割り当てられません。

    ホスト変数に値を割り当てるときにエラーが発生した場合、SQLCODEに値-303、-304、または-413のうちの1つが割り当てられ、ホスト変数への値の割り当てはそれ以上行なわれません。

    返されるデータの列の値がNULLで、対応する標識ホスト変数が指定された場合、-1という値がその標識変数に割り当てられます。主要なホスト変数に値が割り当てられることはありません。対応する標識ホスト変数が指定されない場合、-305という値がSQLCODEに割り当てられます。ホスト変数にこれ以上値が割り当てられることはありません。

    返されるデータの列の値がNOT NULLで、対応する標識ホスト変数が指定された場合、標識ホスト変数は以下のように設定されます。
    • 列と主要なホスト変数がCHARACTERデータ型で、列の値が主要なホスト変数よりも長い場合、標識ホスト変数は列の値の長さに設定されます。
    • これ以外の場合はすべて、標識変数はゼロに設定されます。

    SQLCODEに他の値が割り当てられない場合、SQLCODEにはゼロ値が割り当てられます。

    列値は、ホスト変数の場合のルールに従って、対応する主なホスト変数に設定されます。

    SELECT ... INTOを動的SQL文として実行することはできません。

    SELECT ... INTOでは、キュー テーブルに対するブラウズ モードのSELECT操作をサポートします。

  • SELECT文でのDEFAULT関数の使用に関するルール
    • DEFAULT関数は、リレーション列を名前で識別する単一の引数を取ります。この関数は、列の現行デフォルト値に等しい値と評価されます。列のデフォルト値が現行の組み込みシステム関数として指定される場合、DEFAULT関数は、リクエストの実行時にシステム変数の現行値と評価されます。

      この結果として、DEFAULT関数のデータ型は、デフォルトがNULLでない場合、デフォルトとして指定される定数または組み込み関数のデータ型になります。デフォルトがNULLの場合、結果のデータ型は、デフォルトのリクエスト対象である列または式のデータ型になります。

    • DEFAULT関数には2つの形式があります。DEFAULT関数はDEFAULT or DEFAULT (column_name)として指定することができます。列名が指定されていない場合、システムは、コンテキストに基づいて列を派生させます。列のコンテキストを派生させることができない場合、リクエストはアボートし、エラーがリクエスト元に返されます。
    • SELECT文の選択リストに、列名を指定したDEFAULT関数を指定することができます。DEFAULT関数は、指定された列のデフォルト値と評価されます。
    • 式リストに、列名を含めないDEFAULT関数を指定することはできません。システムはリクエストをアボートし、エラーをリクエスト側に戻します。
    • FROM句を指定しないSELECT文を指定する場合、システムは、テーブルに含まれる行の数にかかわらず、列のデフォルト値から成る単一行を常に戻します。

      これは、既存のTYPE関数に似ています。

    • 入力引数としてDEFAULT関数に渡された列に、関連付けられた明示的なデフォルト値がない場合、DEFAULT関数はnullと評価されます。

例: 再帰的問合わせ

次の例は、クライアント アプリケーション内部で使用される再帰的クエリーを示しています。

EXEC SQL
      WITH RECURSIVE Reachable_From (Source, Destin, mycount)AS
   (      SELECT Root.Source, Root.Destin, 0 as mycount
          FROM Flights Root
          WHERE Root.Source = ‘Paris’
      UNION ALL
          SELECT in1.Source, out1.Destin, in1.mycount + 1
          FROM Reachable_From in1, Flights out1
          WHERE in1.Destin = out1.Source
          AND in1.mycount <= 100
      )
      SELECT Source, Destin
      INTO :intosource INDICATOR :indvar1
      :intodestin INDICATOR: indvar2
      FROM Reachable_From;
END-EXEC

この例では、再帰的クエリーの最後のSELECTで、ホスト変数(intosourceintodestin)および標識変数(indvar1indvar2)が使用されています。これらの変数は再帰的クエリー定義の中では使用できません。

関連情報

  • with_[recursive]_修飾子について、<Teradata Vantage™ - SQLデータ定義言語-構文規則および例、B035-1144>を参照してください。
  • 暗黙的なデータ型変換とCAST関数について、<Teradata Vantage™ - データ タイプおよびリテラル、B035-1143>を参照してください。
  • 必要な許可の詳細について、<Teradata Vantage™ - SQLデータ定義言語-構文規則および例、B035-1144>の「CALL文」を参照してください。
  • キャストの作成とAS ASSIGNMENTオプションの使用の詳細について、Teradata Vantage™ - SQLデータ定義言語-構文規則および例、B035-1144を参照してください。
  • from_clauseについては、<Teradata Vantage™ - SQLデータ定義言語-構文規則および例、B035-1144>を参照してください。
  • DateTimeデータの暗黙の変換を実行するには、<Teradata Vantage™ - データ タイプおよびリテラル、B035-1143>を参照してください。
  • キュー テーブルに対するブラウズ モードのSELECT操作をサポートするSELECT ... INTOについては、<Teradata Vantage™ - SQLデータ定義言語-構文規則および例、B035-1144>のCREATE TABLE(キュー テーブル形式)に関する情報を参照してください。
  • DEFAULT関数の詳細について、<Teradata Vantage™ - SQL関数、式、および述部、B035-1145>を参照してください。