質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Oracle Database

Oracle Databaseは、米オラクルが開発・販売を行うリレーショナルデータベース管理システムです。

PL/SQL

PL/SQL (Procedural Language/Structured Query Language) はOracle CorporationによるSQL(非手続き型言語)を手続き型言語に拡張させるために開発されたプログラミング言語です。

Q&A

3回答

662閲覧

【PL/SQL】レコード型の定義を柔軟に扱いたい

kaiji24

総合スコア5

Oracle Database

Oracle Databaseは、米オラクルが開発・販売を行うリレーショナルデータベース管理システムです。

PL/SQL

PL/SQL (Procedural Language/Structured Query Language) はOracle CorporationによるSQL(非手続き型言語)を手続き型言語に拡張させるために開発されたプログラミング言語です。

0グッド

0クリップ

投稿2023/05/17 14:23

編集2023/05/18 14:55

実現したいこと

レコード型で定義した項目のうち、
kaisyano,buno,kanoを一括りに処理をしたい。
毎回、kaisyano=・・・、buno=・・・、kano・・・・と打つのではなく。

SQL

1TYPE T_EMPLOYEE IS RECORD( 2  id NUMBER(3,0), 3  kaisyano NUMBER(3,0), 4  buno NUMBER(3,0), 5  kano NUMBER(3,0), 6  address VARCHAR2(20) 7); 8V_EMPLOYEE T_EMPLOYEE;

試したこと

  1. まとめて扱いたい箇所を、レコード型で定義したあと、全体をレコード定義

※カーソル定義の変数としても扱っているため、型が合わないとエラーになりました。

SQL(oracle)

1TYPE T_EMPLOYEE IS RECORD( 2  id NUMBER(3,0), 3  v_kaisya t_kaisya, 4  address VARCHAR2(20) 5); 6 7TYPE T_KAISYA IS RECORD( 8  kaisyano NUMBER(3,0), 9  buno NUMBER(3,0), 10  kano NUMBER(3,0), 11);

2)まとめて扱いたい項目は①文字列や、②配列では定義出来ている。
以下の部品をうまく使って実現出来ないか試案中。

 ①文字列
V_KAISYA := 'kaisyano','buno','kano';
②配列
kaisya[0]:='kaisyano';
kaisya[1]:='buno';
kaisya[2]:='kano';

補足情報(FW/ツールのバージョンなど)

Oracle database 12c

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

正直何をしたいのかよくわかりませんが、例えばクエリの結果セットのレコードにメンバを1つ追加した新しいレコードを宣言し、そのレコード型の変数にそのクエリのレコードを入れるコードは以下のようになります(sqlplus想定)

plsql

1set serveroutput on; 2create table persons( 3 id number primary key, 4 family_name varchar2(100), 5 first_name varchar2(100) 6); 7insert into persons values(1, '山田', '太郎'); 8insert into persons values(2, '田中', '花子'); 9commit; 10select * from persons; 11create or replace procedure hoge 12is 13 cursor cur is 14 select * from persons; 15 type person_with_comments is record ( 16 person cur%ROWTYPE, 17 comments varchar2(1000) 18 ); 19 rec person_with_comments; 20begin 21 open cur(); 22 loop 23 fetch cur into rec.person; 24 exit when cur%NOTFOUND; 25 rec.comments := 'ほげ'; 26 dbms_output.put_line(rec.person.family_name || ' ' || rec.person.first_name || '<-' || rec.comments); 27 end loop; 28 close cur; 29end; 30/ 31call hoge();

投稿2023/05/18 04:27

dameo

総合スコア943

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

質問をそのまま読み解くと以外のようにしたいと解釈しました。
但し、これが柔軟かと問われると私自身ハテナです。

なお、カーソル定義のエラー云々は読み飛ばしています。

PL/SQL

1declare 2 type rtype1 is record ( 3 hoge number default 1 4 ,fuga number default 2 5 ); 6 type rtype2 is record ( 7 foo number default 10 8 ,bar rtype1 9 ); 10 -- 11 rec rtype2; 12begin 13 dbms_output.put_line(rec.foo); 14 dbms_output.put_line(rec.bar.hoge); 15 dbms_output.put_line(rec.bar.fuga); 16end;

投稿2023/05/18 10:25

XiiTuzi

総合スコア26

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

XiiTuzi

2023/05/18 14:17

質問に至った背景を記載頂ければ、全く異なるアプローチでの回答も可能になるかもしれません。
kaiji24

2023/05/18 14:48 編集

拙い説明で申し訳ありません。1で述べたとおり、 hoge,fuga,fooを上記のように、分割して定義するとテーブルの型と一致しないというエラーとなるため困っています。もともと、hoge,fuga,fooという3項目で構成されるテーブルのSELECT結果が代入されるのですが、 ひとつのレコードでhoge,fuga,fooを定義していればエラーとなりませんが、fooとfuga,fooをわけて定義すると型不一致エラーとなります。
XiiTuzi

2023/05/19 03:32 編集

@kaiji24 つまり、回答のような定義をした際にカーソルループでエラーが発生する事について困っているのでしょうか? 追記 回答のソースに対して、適当なカーソルループで値を代入する処理を追加しましたが、エラーは発生しませんでした。
guest

0

定義した値を柔軟に、操作したい。

以下参考
5.1 コレクション・データ型
9.4 コレクションの設計上の考慮点

投稿2023/05/18 00:34

sazi

総合スコア25195

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問