このトピックでは、レコード変数の構文とレコード変数の使用方法について説明します。
概要
レコード変数は、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句にレコード変数が含まれている場合、句で他の変数または値を使用することはできません。
レコード変数の作成
次のいずれかの方法を使用して、レコード変数を作成できます。
レコードタイプを定義し、レコードタイプの変数を宣言します。
レコード変数を宣言するには、
% ROWTYPEを使用します。 この場合、レコード変数は、データベーステーブルまたはビュー内の完全な行または行の一部を表します。% ROWTYPEの先頭には、テーブル、ビュー、明示的なカーソル変数、または強力なカーソル変数を付けることができます。以前に宣言されたレコード変数と同じ型のレコード変数を宣言するには、
% 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 INTO、FETCH 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行)