環境:Oracle81740
タイトル通りの質問ですが、、、
以下のテーブルがあったとします。
CREATE TABLE PUBLIC.TEST_TABLE
(
KEY1 CHAR(20) NOT NULL,
KEY2 CHAR(20) NOT NULL,
VALUE1 VARCHAR2(256),
CONSTRAINT GENERAL_TABLE_PK PRIMARY KEY (KEY1, KEY2)
)
そこで本題ですが、
(構文がめちゃくちゃだとは思いますが、読み取ってください^^;)
FUNCTION TEST_GET
(
IN_KEYTEST_TABLE.KEY1%TYPE
)
RETURN TABLE IS retTbl TABLE;
というイメージで、[KEY1]値を受け取り、該当するレコードをテーブルとして返す関数を組みたいのですが、調べがつきません。
どなたかよろしくお願いいたします。
No.4ベストアンサー
- 回答日時:
CREATE OR REPLACE PACKAGE test_pkg AS
TYPE test_rec_type IS TEST_TABLE%ROWTYPE;
TYPE test_tbl_type IS TABLE OF test_rec INDEX BY BINARY_INTEGER;
FUNCTION test_get(key1 IN test_table.key1%TYPE) RETURN test_tbl_type;
END test_pkg;
/
CREATE OR REPLACE PACKAGE BODY test_pkg AS
FUNCTION test_get(in_key1 IN test_table.key1%TYPE) RETURN test_tbl_type
IS
CURSOR test_cur (in_key1 IN test_table.key1%TYPE) IS
SELECT * FROM test_table WHERE key1 = in_key1;
test_rec test_cur%ROWTYPE;
out_tbl test_tbl_type;
out_tbl_index BINARY_INTEGER := 1;
BEGIN
OPEN test_cur(in_key1);
LOOP
FETCH test_cur INTO test_rec;
EXIT WHEN test_cur%NOTFOUND;
out_tbl(out_tbl_index).key1 := test_rec.key1
out_tbl(out_tbl_index).key2 := test_rec.key2
out_tbl(out_tbl_index).value1 := test_rec.value1
out_tbl_index := out_tbl_index + 1;
END;
CLOSE test_cur;
RETURN out_tbl;
END test_get;
END test_pkg;
/
No.5
- 回答日時:
No.4はPL/SQL表を使用する例でしたが、これだと
結果に対して検索はできないです。
下記の例はオブジェクト型のテーブルの例です。
結果に対して検索できます。
ご質問のFUNCTION機能は書いていませんが、
参考になると思います。
-----------------------------------------------
SET SERVEROUTPUT ON
CREATE TABLE employees (id NUMBER, name VARCHAR2(50), gender VARCHAR2(10));
INSERT INTO employees values (1,'Taro','Male');
INSERT INTO employees values (2,'Jiro','Male');
INSERT INTO employees values (3,'Saburo','Male');
INSERT INTO employees values (4,'Hanako','Female');
COMMIT;
CREATE OR REPLACE TYPE employee_type
AS OBJECT (id NUMBER, name VARCHAR2(50), gender VARCHAR2(10))
/
CREATE OR REPLACE TYPE employee_table_type AS TABLE OF employee_type
/
DECLARE
employee_table employee_table_type;
CURSOR employee_table_cur IS
SELECT * FROM TABLE (CAST(employee_table AS employee_table_type)) tbl;
employee_table_rec employee_table_cur%ROWTYPE;
BEGIN
SELECT employee_type
BULK COLLECT INTO employee_table
FROM (
SELECT employee_type(id, name, gender) employee_type
FROM employees
WHERE gender = 'Male'
);
--
OPEN employee_table_cur;
LOOP
FETCH employee_table_cur INTO employee_table_rec;
EXIT WHEN employee_table_cur%NOTFOUND;
DBMS_OUTPUT.PUT_LINE(employee_table_rec.id||','||employee_table_rec.name);
END LOOP;
END;
/
>No.4はPL/SQL表を使用する例でしたが、これだと
>結果に対して検索はできないです。
いえいえ、あらかじめ条件で絞った一時テーブルが取得できたら、それに対して細かく扱うことはいたしません。
前方にカーソルを進めて利用するだけなので、全然問題無しです。
また、#5のこの発言も参考資料として、大変助かります。
ありがとうございました。
No.3
- 回答日時:
>SQL-Serverで以前やっていたのですが、そういうことを
>Oracleでもできると聞いたことがあるので、
>質問をしてみたのですが、誤情報であったらすいません。
SQL Serverの処理に一番近いのが、一時表用の領域に一時テーブルを作るものだと思いますけど。
で、メモリ上に確保した配列を返すのが、
>PL/SQL表を返す
です。
ただし、あくまでも配列なので、フェッチのようなことはできません。
ありがとうございます。
>SQL Serverの処理に一番近いのが、一時表用の領域に一時テーブルを作るものだと思いますけど。
#2の補足を書いた後に、私の早合点であって、同じことを意とした発言であることが理解できました。
すいません。
その一時テーブルを作成する方法が知りたかったのです^^;
ありがとうございました。
No.2
- 回答日時:
>私といたしましては「一時テーブル」がよいのかな?と
>思っているのですが、どの方法でも結構です。
結構ですって・・・
何を期待しているのでしょうか?
一時テーブルを作成する場合、8iでは一時テーブル用の表領域を準備し、そこに一時テーブルを作成すれば、消し忘れを防ぐことが可能です。
こんな表領域が準備できないのでしたら、PL/SQL内で空テーブルを作成するなり、CREATE TABLE AS SELECTで抽出結果のテーブルを作ったりすることになるでしょう。
ここでの注意点は、
・途中で異常終了した場合に一時テーブルが残る可能性がある
・固定の名称でテーブルを作成した場合、複数セッションから同時に該当の処理が行われた場合に正しく動作しない。
というところですかね。
要件を考慮しながらがんばってみてください。
この回答への補足
>一時的なテーブル
>表領域に
いや、そういうことじゃないと思ったのですが^^;
プロシージャ内で有効な#TmpTable(仮)というようなテーブルを、利用するという意味に受け取っておりました。
要するに物理的に存在するテーブルではなく、本当の一時的にしか存在しないメモリ上のテーブルという意味ではなかったのですね^^;
SQL-Serverで以前やっていたのですが、そういうことをOracleでもできると聞いたことがあるので、質問をしてみたのですが、誤情報であったらすいません。
No.1
- 回答日時:
フィルタリングの方法が書いてないのでなんともいえませんが、
カーソルを返す
か、
PL/SQL表を返す
でしょうかね?
あとは、フィルタリングした結果を一時的なテーブルに書き込んで、そのテーブル名を返すとか
(動的SQLがめんどくさそう・・・)
さっそくありがとうございます。
>カーソルを返す
>PL/SQL表を返す
>一時テーブル
私といたしましては「一時テーブル」がよいのかな?と思っているのですが、どの方法でも結構です。
ちなみにこの関数をコールする側では、その関数で得た表をカーソルにセットして使用するつもりです。
参照するだけで、更新はいたしません。それと、この[TEST_TABLE]は、他のところからもよく参照されるテーブルです。
以上が特徴なのです。
よろしくお願いいたします。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- MySQL my_itemsテーブルのIDにAUTO_INCREMENT を追加ができるかで 1 2023/01/03 09:09
- MySQL MYSQL エラー 2 2022/10/18 11:37
- MySQL エラー 1068 (42000): 複数の主キーが定義されていますエラー 2 2022/11/17 04:36
- MySQL SHOW CREATE TABLE posts;これって何ですか? 3 2022/08/28 22:57
- MySQL 何にかが違うから エラーなんでしょうね! 2 2022/09/18 05:28
- MySQL テーブル作成です。どこかのスペルが間違っているか記号など スペースかな? 1 2022/10/01 05:08
- MySQL `picture` varchar(255) のコマンドで間違いないでしょうか? 1 2022/11/21 04:08
- PHP php テーブルが作成できない 1 2022/11/17 23:41
- MySQL php テーブルを作れない 2 2022/11/17 18:22
- MySQL PHPとMySQLを使った掲示板の作り方 1 2022/06/02 13:00
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
オラクルのUPDATEで複数テーブル
-
エラーを起こす方法
-
truncate tableを使って複数の...
-
既にテーブルが存在する場合の...
-
データ削除とSQL*Loaderでのイ...
-
エクスポート不具合
-
AccessからOracle DB(View)を...
-
accessのデータをoracleへinser...
-
テーブル定義書(Oracle) 【IX】...
-
Where句のNot条件をAnd条件にし...
-
Olacle Database 9iと10gの違い
-
複数レコードの複数フィールド...
-
SELECT INTOで一度に複数の変数...
-
VBAでの行数を揃える方法
-
フラグをたてるってどういうこ...
-
【SQL】他テーブルに含まれる値...
-
テーブル名が可変の場合のクエ...
-
UPDATEで既存のレコードに文字...
-
sqlに記述できない文字
-
'modify' 付近に不適切な構文が...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
オラクルのUPDATEで複数テーブル
-
truncate tableを使って複数の...
-
エラーを起こす方法
-
データ削除とSQL*Loaderでのイ...
-
既にテーブルが存在する場合の...
-
Where句のNot条件をAnd条件にし...
-
テーブル定義書(Oracle) 【IX】...
-
複数レコードの複数フィールド...
-
CASEでBETWEEN制約
-
viewの性能
-
ORA-01630の対応方法について
-
AccessVBAにて動的にテーブルを...
-
フィールド数が異なるテーブル...
-
accessのデータをoracleへinser...
-
エクスポート不具合
-
テーブルDROPできないのです。。。
-
SELECT実行結果のレスポンス改...
-
テーブルに変更があったらCSV出力
-
現在、VBAにてUNICODEのCSVを出...
-
oracle ora-02298
おすすめ情報