16.20 - SELECT … INTO - Teradata Vantage NewSQL Engine

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

prodname
Teradata Database
Teradata Vantage NewSQL Engine
vrm_release
16.20
category
プログラミング リファレンス
featnum
B035-1148-162K-JPN

目的

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

呼び出し

実行可能形式。

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

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



構文: 埋め込みSQLのみ



with_[recursive]_modifier
再帰的クエリー。WITH RECURSIVEが使用されている場合、対話式の自己結合および設定操作を使ったテーブル検索の手法を提供します。
非再帰的なWITHリクエスト修飾子は、派生テーブルと同じです。
select_list
アスタリスク( * )、または有効なSQL式をカンマで区切ったリスト。
選択リストには、DEFAULT関数のインスタンスを含めることができますが、集約関数や順序付き分析関数を含めることはできません。
ストアド プロシージャのみ:
Teradata Databaseでは、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権限が必要です。

ANSI準拠

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

許可

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

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

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

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

再帰的クエリーの例

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

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)が使用されています。これらの変数は再帰的クエリー定義の中では使用できません。

コロン文字の使用のルール

埋め込み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文ではサポートされません。

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

ローカル変数またはパラメータ、および戻されるデータの対応する列のデータ型は互換性のあるデータ型でなければなりません。Teradata Databaseは、ローカル変数またはパラメータと対応する列のデータ型が異なる場合には、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と評価されます。

関連トピック

以下に関する詳細な情報
  • with_[recursive]_修飾子については、<Teradata Vantage™ SQLデータ定義言語の構文規則および例、B035-1144>の「WITH [RECURSIVE]リクエスト修飾子」を参照してください。
  • select_listについては、SELECT文でのDEFAULT関数の使用ルールを参照してください。
  • 暗黙のデータ型変換とCAST関数については、<Teradata Vantage™データ型およびリテラル、B035-1143>の「データ型の変換」を参照してください。
  • 必要な許可の詳細について、<Teradata Vantage™ SQLデータ定義言語の構文規則および例、B035-1144>の「CALL文」を参照してください。
  • キャストの作成とAS ASSIGNMENTオプションの使用については、<Teradata Vantage™ SQLデータ定義言語の構文規則および例、B035-1144>の「CREATE CAST」を参照してください。
  • from_clauseについては、<Teradata Vantage™ SQLデータ定義言語の構文規則および例、B035-1144>の「FROM句」を参照してください。
  • SELECT文でのDEFAULT関数の使用ルールおよび"WHERE句"の文書については、<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>を参照してください。