すべてのプロダクト
Search
ドキュメントセンター

PolarDB:レコード変数

最終更新日:Jun 04, 2024

このトピックでは、レコード変数の構文とレコード変数の使用方法について説明します。

概要

レコード変数は、PL/SQLの特殊な変数です。 ほとんどの場合、レコード変数はを表します。 レコード変数は複数のフィールドを持ち、A. bなどのテーブル列にアクセスする方法でそのフィールドにアクセスできます。 これが、レコード変数が特別な方法でテーブルと対話する理由です。

構文

次の構文を使用して、レコードタイプを定義できます。

TYPE record_type IS RECORD ( {field_definition [, ...]} ) ;
説明

field_definitionフィールドの例:

フィールドデータ型 [ [NOT NULL] {:= | DEFAULT} 式]

次の構文を使用して、レコード変数を宣言できます。

record1 {record_type | {table | view | cursor} % ROWTYPE | record2 % TYPE} ;

制限

レコード変数を使用する场合は, 次の条件を満たしていることを确认してください。

  • レコード変数は、UPDATEステートメントのSET句の右側、INSERTステートメントのVALUES句、またはRETURNING句のINTO句で使用する必要があります。

  • SELECTリスト、WHERE句、GROUP BY句、またはORDER BY句でレコード変数を使用することはできません。

  • ROWキーワードは、SET句の左側でのみ使用できます。 また、サブクエリと一緒にROWを使用することはできません。

  • ROWを使用するUPDATEステートメントでは、1つのSET句のみが許可されます。

  • INSERTステートメントのVALUES句にレコード変数が含まれている場合、句で他の変数または値を使用することはできません。

  • INTO句にレコード変数が含まれている場合、句で他の変数または値を使用することはできません。

レコード変数の作成

次のいずれかの方法を使用して、レコード変数を作成できます。

  1. レコードタイプを定義し、レコードタイプの変数を宣言します。

  2. レコード変数を宣言するには、% ROWTYPEを使用します。 この場合、レコード変数は、データベーステーブルまたはビュー内の完全な行または行の一部を表します。 % ROWTYPEの先頭には、テーブル、ビュー、明示的なカーソル変数、または強力なカーソル変数を付けることができます。

  3. 以前に宣言されたレコード変数と同じ型のレコード変数を宣言するには、% TYPEを使用します。

<bx id="1" type="code" text="code id=" cuzprv "title=" "uuuid=" lk12agd517qgf3bfpw6 "code=" CREATE TABLE test(id INT、name VARCHAR(10));

DECLARE
TYPE r_type IS RECORD(id INT, name VARCHAR(10));
v1 r_type; -- 方1
v2テスト % ROWTYPE; -- 方2
v3 v2 % TYPE; -- 方3
開始
...
END;"data-tag=" codeblock "outputclass=" language-plsql ""/>CREATE TABLE test(id INT, name VARCHAR(10));

DECLARE
  TYPE r_type IS RECORD(id INT, name VARCHAR(10));
  v1 r_type; -- 方法1
  v2テスト % ROWTYPE; -方法2
  v3 v2 % TYPE; -- メソッド3
開始
  ...
エンド; 

PL/SQLブロックで定義されているレコード型はローカル型で、ブロック内でのみ使用できます。 レコードタイプは、パッケージで宣言されている場合にのみデータベースに格納されます。 この場合、次の構文を使用してレコードタイプを使用できます。

<bx id="1" type="code" text="code id=" oq9ckt "title=" "uuuid=" lk12sldzedop2byzns "code=" CREATE PACKAGE pkg AS
TYPE r_type IS RECORD(id INT, name VARCHAR(10));
エンド;

パッケージボディpkgをAS作成
エンド;

DECLARE
r pkg.r_type := pkg.r_type(1, 'a');
開始
RAISE NOTICE 'id: %, name: % ', r.id, r.name;
END;"data-tag=" codeblock "outputclass=" language-plsql ""/>CREATE PACKAGE pkg AS
  TYPE r_type IS RECORD(id INT, name VARCHAR(10));
エンド;

パッケージボディpkgをAS作成
エンド;

DECLARE
  r pkg.r_type := pkg.r_type(1, 'a');
開始
  RAISE NOTICE 'id: %, name: % ', r.id, r.name;
エンド; 

次のようなレスポンスが返されます。

注意: id: 1, name: a

% ROWTYPEを使用してレコード変数を作成する場合、レコード変数はテーブル内の行全体または行の一部を表します。 table % ROWTYPEを使用して完全なテーブル行を取得するか、定義済みのビューまたはカーソルを使用してテーブル行の一部を取得できます。

<bx id="1" type="code" text="code id=" svx5zq "title=" "uuid=" lk13bri2ruigx32qlcs "code=" CREATE TABLE test(id INT、name VARCHAR(10));

DECLARE
r1 test % ROWTYPE; -- 取得するオブジェクト名
CURSOR curはテストからのSELECT idです;
r2 cur % ROWTYPE; -- 取得オブジェクト定义ID
開始
r1.id = 1;
r1.name = 'a';
r2.id = 2;
RAISE NOTICE 'r1.id: %, r1.name: % ', r1.id, r1.name;
RAISE NOTICE 'r2.id: % '、r2.id;
END;"data-tag=" codeblock "outputclass=" language-plsql ""/>CREATE TABLE test(id INT, name VARCHAR(10));

DECLARE
  r1 test % ROWTYPE; -- id列とname列を含む、テーブル内の完全な行定義を取得します。
  CURSOR curはテストからのSELECT idです;
  r2 cur % ROWTYPE; -- テーブル内の行定義のid列を取得します。
BEGIN
  r1.id = 1;
  r1.name = 'a';
  r2.id = 2;
  RAISE NOTICE 'r1.id: %, r1.name: % ', r1.id, r1.name;
  RAISE NOTICE 'r2.id: % '、r2.id;
エンド; 

次のようなレスポンスが返されます。

<g id="1" type="code" text="code id=" 4hzava "title=" "uuid=" lk13hczpfjv7purlrme "code=" NOTICE: r1.id: 1, r1.name: a
注意: r2.id: 2 "data-tag=" codeblock "outputclass=" language-plsql ""> 注意: r1.id: 1, r1.name: a
注意: r2.id: 2 

レコード変数の初期化

レコードタイプを定義するときは、フィールドにNOT NULL制約を設定するか、デフォルト値を指定できます。

<bx id="1" type="code" text="code id=" vo8tvk "title=" "uuid=" lk12dx40gwhxmc8bk3j "code=" DECLARE
TYPE r_typeが記録されています (id INT NOT NULL := 1、名前VARCHAR(10) デフォルト '名前');
開始
...
END;"data-tag=" codeblock "outputclass=" language-plsql ""/>DECLARE
  TYPE r_typeが記録されています (id INT NOT NULL := 1、 
                        名前VARCHAR(10) デフォルト '名前');
開始
  ...
エンド; 

方法2または方法3を使用してレコード変数を作成する場合、変数のデフォルト値はNULLです。 この場合、テーブルの制約は継承されず、フィールド名とタイプのみが取得されます。 また、表の非表示列またはrowid列は取得されません。

また、レコード変数を初期化するときに、レコード変数を定数として指定できます。 このように、レコード変数は初期化後に変更できません。 この操作は、通常の変数にも適用できます。

<bx id="1" type="code" text="code code=" DECLARE
TYPE r_type IS RECORD(id INT, name VARCHAR(10));
r CONSTANT r_type := r_type(1, 'a');
開始
r := My_Rec(2、'b'); -- 修正
END;"id=" g338qn "title=" "uuid=" lk12ki1b5wx08gqr8s2 "data-tag=" codeblock "outputclass=" language-plsql ""/>DECLARE
  TYPE r_type IS RECORD(id INT, name VARCHAR(10));
  r CONSTANT r_type := r_type(1, 'a');
開始
  r := My_Rec(2、'b'); -- エラー
エンド; 

次のようなレスポンスが返されます。

エラー: 変数 "r" はCONSTANTと宣言されています

レコード変数の割り当て

レコード変数の各フィールドに値を1つずつ割り当てることができます。

<bx id="1" type="code" text="code id=" iwdtxt "title=" "uuid=" lk140yyndw21ecsxfnb "code=" DECLARE
TYPE r_type IS RECORD(id INT, name VARCHAR(10));
r r_type;
開始
r.id := 1;
r.name := 'name';
RAISE NOTICE 'r.id: %, r.name: % ', r.id, r.name;
END;"data-tag=" codeblock "outputclass=" language-plsql ""/>DECLARE
  TYPE r_type IS RECORD(id INT, name VARCHAR(10));
  r r_type;
開始
  r.id := 1;
  r.name := 'name';
  RAISE NOTICE 'r.id: %, r.name: % ', r.id, r.name;
エンド; 

次のようなレスポンスが返されます。

注意: r.id: 1, r.name: name

または、対応するフィールドの属性で暗黙的な型変換が許可されている場合は、あるレコード変数の値を別のレコード変数の値に直接割り当てることもできます。

<bx id="1" type="code" text="code id=" 2sicpa "title=" "uuid=" lk1458bjbsc7fc024e "code=" DECLARE
TYPE r_type1が記録されています (id INT, name VARCHAR(10));
TYPE r_type2が記録されています (id VARCHAR(10) 、name INT);
r1 r_type1;
r2 r_type2 := r_type2('1', 2);
開始
r1 := r2;
RAISE NOTICE 'r.id: % 、r.name: % '、r1.id、r1.name;
END;"data-tag=" codeblock "outputclass=" language-plsql ""/>DECLARE
  TYPE r_type1が記録されています (id INT, name VARCHAR(10));
  TYPE r_type2が記録されています (id VARCHAR(10) 、name INT);
  r1 r_type1;
  r2 r_type2 := r_type2('1', 2);
開始
  r1 := r2;
  RAISE NOTICE 'r.id: % 、r.name: % '、r1.id、r1.name;
エンド; 

次のようなレスポンスが返されます。

注意: r.id: 1、r.name: 2

型変換が失敗すると、エラーが報告されます。

<bx id="1" type="code" text="code id=" 4a0d6c202cq4k "title=" "uuid=" lk14bltsjt6203ux51n "code=" DECLARE
TYPE r_type1が記録されています (id INT, name VARCHAR(10));
TYPE r_type2が記録されています (id VARCHAR(10) 、name INT);
r1 r_type1;
r2 r_type2 := r_type2('a', 2)
開始
r1 := r2;
RAISE NOTICE 'r.id: % 、r.name: % '、r1.id、r1.name;
END;"data-tag=" codeblock "outputclass=" language-plsql ""/>DECLARE
  TYPE r_type1が記録されています (id INT, name VARCHAR(10));
  TYPE r_type2が記録されています (id VARCHAR(10) 、name INT);
  r1 r_type1;
  r2 r_type2 := r_type2('1', 2);
開始
  r1 := r2;
  RAISE NOTICE 'r.id: % 、r.name: % '、r1.id、r1.name;
エンド; 

次のようなレスポンスが返されます。

ERROR: 整数型の無効な入力構文: "a"

テーブルから行をエクスポートし、その行をレコード変数に渡すことができます。 これを行うには、渡される行の列とレコード変数の対応するフィールドの間で暗黙的な型変換が可能でなければなりません。

<bx id="1" type="code" text="code id=" ikp8im "title=" "uuid=" lk14gvnjda94datjeco "code=" CREATE TABLE test(id INT、name VARCHAR(10))
テスト値 (1、'a') に挿入します。テスト値 (2、'b') に挿入します。DECLARE
TYPE r_typeはレコードです (id int、name text);
r r_type;
開始
SELECT * INTO r FROM test LIMIT 1;
昇格通知 '%' 、r;
エンド;
"data-tag=" codeblock "outputclass=" language-plsql ""/>CREATE TABLE test(id INT、name VARCHAR(10))
テスト値 (1、'a') に挿入します。テスト値 (2、'b') に挿入します。DECLARE
  TYPE r_typeはレコードです (id int、name text);
  r r_type;
開始
  SELECT * INTO r FROMテストLIMIT 1; -- 返される行数の制限を設定します。
  昇格通知 '%' 、r;
エンド;

次のようなレスポンスが返されます。

通知 :( 1,a)

返される行数に制限を設定する必要があります。 それ以外の場合、例外がスローされます。

<bx id="1" type="code" text="code id=" 4a0d6c212cyku "title=" "uuid=" lk14ln0lr8cgmlz7krm "code=" CREATE TABLE test(id INT、name VARCHAR(10))
テスト値 (1、'a') に挿入します。テスト値 (2、'b') に挿入します。DECLARE
TYPE r_typeはレコードです (id INT, name VARCHAR (10))
r r_type;
開始
SELECT * INTO rテストから;
昇格通知 '%' 、r;
END;"data-tag=" codeblock "outputclass=" language-plsql ""/>CREATE TABLE test(id INT、name VARCHAR(10))
テスト値 (1、'a') に挿入します。テスト値 (2、'b') に挿入します。DECLARE
  TYPE r_typeはレコードです (id int、name text);
  r r_type;
開始
  SELECT * INTO r FROMテストLIMIT 1; -- 返される行数の制限を設定します。
  昇格通知 '%' 、r;
エンド;

次のようなレスポンスが返されます。

<g id="1" type="code" text="code id=" f9vkmd "title=" "uuid=" lk14m4emcthfd67mp1i "code=" ERROR: クエリは複数の行を返しました
ヒント: クエリが単一の行を返すことを確認するか、LIMIT 1."data-tag=" codeblock "outputclass=" language-plsql "">ERROR: クエリが複数の行を返しました
HINT: クエリが1行を返すことを確認するか、LIMIT 1を使用します。

同様に、INTOを含むステートメントを使用して、返された結果をレコード変数に渡すことができます。 このようなステートメントには、FETCH INTOおよびUPDATE/INSERT/DELETE RETURNING INTOが含まれます。 FETCH INTOおよびUPDATE/INSERT/DELETE RETURNING INTOステートメントの使用方法については、SELECT INTOの構文を参照してください。

レコード変数にnot NULL制約がない場合は、レコード変数の値をNULLに設定できます。 ただし、NOT NULL制約を持つレコード変数の値をNULLに設定したり、空でないフィールドをNULLに設定したりすることはできません。

レコード変数のテストTesting of a record variable

レコード変数に対してNOT NULLテスト、等価テスト、および不等式テストを実行できます。 等式または不等式テストを実行すると、対応するフィールドが順番に比較されます。 テスト結果は、レコード変数タイプの比較関数に基づいています。

<bx id="1" type="code" text="code code=" DECLARE
TYPE r_typeはレコードです (id INT, name VARCHAR (10))
r1 r_type := r_type(1, 2);
r2 r_type := r_type(1, 2);
開始
RAISE NOTICE '%', r1 IS NULL; -- false
RAISE NOTICE '%' 、r1 = r2; -- true
RAISE NOTICE '%' 、r1 > r2; -- false
r2.id = 10;
RAISE NOTICE '%' 、r1 < r2; -true
END;"id=" 2fkbqg "title=" "uuid=" lk154c42yud56kiq2mf "data-tag=" codeblock "outputclass=" language-plsql ""/>DECLARE
  TYPE r_typeはレコードです (id INT, name VARCHAR (10))
  r1 r_type := r_type(1, 2);
  r2 r_type := r_type(1, 2);
開始
  RAISE NOTICE '%', r1 IS NULL; -- false
  RAISE NOTICE '%' 、r1 = r2; -- true
  RAISE NOTICE '%' 、r1 > r2; -- false
  r2.id = 10;
  RAISE NOTICE '%' 、r1 < r2; -true
エンド; 

次のようなレスポンスが返されます。

<g id="1" type="code" text="code id=" 6q5urt "title=" "uuid=" lk158o0ul1d6gnr3df "code=" NOTICE: f
通知: t
通知: f
通知: t "data-tag=" codeblock "outputclass=" language-plsql ""> 通知: f
通知: t
通知: f
通知: t 

レコード変数とテーブルの相互作用

上記のように、SELECT INTOFETCH INTO、およびRETURNING INTOを使用して、テーブル内のデータをレコード変数に渡すことができます。 特定の構文を使用して、レコード変数をテーブルに挿入することもできます。

<bx id="1" type="code" text="code id=" y7f3ka "title=" "uuid=" lk15c6uo73557t1cevq "code=" CREATE TABLE test(id INT、name VARCHAR(10));

DECLARE
TYPE r_type IS RECORD(id INT, name VARCHAR(10));
r r_type := r_type(1, 'a');
開始
INSERT INTO test VALUES r; -- 記憶に依存するグラフ
エンド;

SELECT id, name FROM test;"data-tag=" codeblock "outputclass=" language-plsql ""/>CREATE TABLE test(id INT, name VARCHAR(10));

DECLARE
  TYPE r_type IS RECORD(id INT, name VARCHAR(10));
  r r_type := r_type(1, 'a');
開始
  INSERT INTO test VALUES r; -- レコード変数を使用してコンテンツをテーブルに挿入します。
エンド;

SELECT id, name FROM test; 

次のようなレスポンスが返されます。

<bx id="1" type="code" text="code id=" wy2yxx "title=" "uuid=" lk1kuj51y4h5ox8n5to "code=" id | 名前
---- ------
1 | a
(1行) "data-tag=" codeblock "outputclass=" language-plsql ""/> id | name
---- ------
  1 | a
(1行) 

さらに、レコード変数を使用してテーブルを更新できます。

<bx id="1" type="code" text="code id=" 9f6kks "title=" "uuid=" lk1kuykcccyyc4a5r7t "code=" DECLARE
TYPE r_type IS RECORD(id INT, name VARCHAR(10));
r r_type := r_type(2, 'b');
開始
UPDATEテストSET ROW = r WHERE id = 1; -- を使用します。エンド;

SELECT id、名前FROM test;"data-tag=" codeblock "outputclass=" language-plsql ""/>DECLARE
  TYPE r_type IS RECORD(id INT, name VARCHAR(10));
  r r_type := r_type(2, 'b');
開始
  UPDATEテストSET ROW = r WHERE id = 1; -- レコード変数を使用してテーブルを更新します。
エンド;

SELECT id, name FROM test; 

次のようなレスポンスが返されます。

<bx id="1" type="code" text="code id=" b1g0sv "title=" "uuid=" lk1kw2u9cbddja8arcv "code=" id | name
---- ------
2 | b
(1行) "data-tag=" codeblock "outputclass=" language-plsql ""/> id | name
---- ------
  2 | b
(1行)