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

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

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

Oracleは、米オラクルが取り扱うリレーショナルデータベース管理システムです。メインフレームからPCまで、多様なプラットフォームに対応しています。

Oracle Database 11g

Oracle DatabaseはRDBMSの商品です。具体的な発売商品として知られているのが、 Oracle9i、Oracle10g、Oracle 11gとOracle 12cです。

PL/SQL

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

Q&A

解決済

1回答

12730閲覧

PL/SQL ROWTYPEを別のProcedureに渡したい。

ken2001

総合スコア16

Oracle

Oracleは、米オラクルが取り扱うリレーショナルデータベース管理システムです。メインフレームからPCまで、多様なプラットフォームに対応しています。

Oracle Database 11g

Oracle DatabaseはRDBMSの商品です。具体的な発売商品として知られているのが、 Oracle9i、Oracle10g、Oracle 11gとOracle 12cです。

PL/SQL

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

0グッド

0クリップ

投稿2017/03/07 09:23

Oracle 11GでROWTYPEの変数を別のProcedureに渡したいと思い
下記のようなコードを記載しているのですが

呼出し元のPROCEDURE作成時に下記のようなエラーになってしまいます。
ROWTYPEについては、引数として使用できないのでしょうか。
また、間違っている場合はご指摘ください。

  • エラー内容

エラー内容:PLS-00306: 'TEST_P02'の呼出しで、引数の数または型が正しくありません。

  • 呼び出し元

sql

1CREATE OR REPLACE PROCEDURE TEST_P01 AS 2 3 cursor curTest() is 4 SELECT a 5 FROM table; 6 7 buf table%ROWTYPE; 8 9BEGIN 10 FOR buf in curTest() LOOP 11 TEST_P02(buf); 12 END LOOP; 13END; 14
  • 呼び出し先

SQL

1CREATE OR REPLACE PROCEDURE TEST_P02(buf IN table%ROWTYPE) AS 2 34 5END;

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

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

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

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

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

guest

回答1

0

ベストアンサー

明示カーソルFOR LOOP文 を使う場合は buf(正式にはカーソル・レコードって言うんだったか?)は定義は不要です。
TEST_P01のbufはtable.a だけの1列しかないなのに対し、TEST_P02(buf IN table%ROWTYPEなので、テーブルかビューかの全列の指定になっているからおかしいよ、って怒られているようです。
TEST_P02(in_a IN table.a%TYPE
としたらどうでしょうか?

投稿2017/03/07 10:46

編集2017/03/07 10:46
Orlofsky

総合スコア16415

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

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

ken2001

2017/03/07 10:58

回答ありがとうございます。 すみません、実際のソースから無駄な部分を削除時に間違えてしまいました。 select区に関しては実際は複数のカラムを選択しています。
Orlofsky

2017/03/07 11:06

質問に、エラーを再現できるだけのCREATE TABLE, CREATE INDEX, CREATE PROCEDURE は提示しましょう。
Orlofsky

2017/03/07 23:46

あと、スコープルールは理解されているでしょうか?TEST_P01のbufはTEST_P01の中だけがスコープの範囲です。TEST_P02のパラメータはtable%ROWTYPEなので、TEST_P01のbufと同じ定義であると判断できません。TEST_P01でbuf とは別に table%ROWTYPEで定義した引数を渡してやる必要があります。
ken2001

2017/03/08 01:11 編集

回答ありがとうございます、FOR文で使用している「buf」は定義している「buf」と別だったんですね・・・。 すみません、ずっと勘違いしていました・・・。 以下のループに変更し対応を行いました。 OPEN CUR0010 FOR SQL_BUF; LOOP FETCH CUR0010 INTO buf; EXIT WHEN CUR0010%NOTFOUND; TEST_P02(buf); END LOOP; CLOSE CUR0010;
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問