- PR -

SELECT INTO文について

投稿者投稿内容
satoko
常連さん
会議室デビュー日: 2006/05/06
投稿数: 35
お住まい・勤務地: 東京
投稿日時: 2007-05-29 13:49
いつも勉強させていただいています。
未熟な故、用語の使い方が間違えていたり、
説明がうまくできないかもしれませんが、よろしくお願いします。

[環境]
DB:Oracle Database 10g Enterprise Edition Release 10.1.0.3.0


SELECT INTO文なのですが、

sDATA DBMS_SQL.VARCHAR2_TABLE;

SELECT aaa INTO sDATA(0) FROM test;

と言う具合に、直接PL/SQL表に格納することは出来ないのでしょうか?

SQL*Plusでコンパイルしようとすると、
PL/SQL: ORA-00904: 列名が無効です
とエラーになってしまいます。

やりたい事は、

SELECT aaa,bbb,ccc INTO sDATA(0),sDATA(1),sDATA(2) FROM test;

という具合にSELECTしつつPL/SQL表に格納したいです。

お力添えをお願いいたします。
NAO
ぬし
会議室デビュー日: 2001/10/24
投稿数: 1256
お住まい・勤務地: 神奈川のはずれから東京の下町
投稿日時: 2007-05-29 13:57
カーソルを使うしか無いですね。
_________________
Inspired Ambitious
ISMS Assistant Auditor
satoko
常連さん
会議室デビュー日: 2006/05/06
投稿数: 35
お住まい・勤務地: 東京
投稿日時: 2007-05-29 14:07
引用:

カーソルを使うしか無いですね。



NAOさんいつも返信ありがとうございます^^

カーソルで作ってみました。

/* SQL設定 */
sSQL := 'SELECT aaa,bbb FROM test';
/* カーソルオープン */
sCUR := DBMS_SQL.OPEN_CURSOR;
/* SQL文のセット */
DBMS_SQL.PARSE( sCUR, sSQL, DBMS_SQL.V7 );
/* 取得カラム宣言 */
DBMS_SQL.DEFINE_COLUMN( sCUR, 1, sDATA(2) );
DBMS_SQL.DEFINE_COLUMN( sCUR, 2, sDATA(3) );
/* カーソル実行 */
sEXE := DBMS_SQL.EXECUTE( sCUR );
/* フェッチ */
sSTS := DBMS_SQL.FETCH_ROWS( sCUR );
WHILE (sSTS <> 0) LOOP
/* フェッチデータ取得 */
DBMS_SQL.COLUMN_VALUE( sCUR, 1, sDATA(2) );
DBMS_SQL.COLUMN_VALUE( sCUR, 2, sDATA(3) );

/* 次データフェッチ */
sSTS := DBMS_SQL.FETCH_ROWS( sCUR );
END LOOP;
/* カーソルクローズ */
DBMS_SQL.CLOSE_CURSOR( sCUR );

コンパイルすると、
PLS-00307:
このコールに一致する'DEFINE_COLUMN'が複数宣言されています。
と、エラーが返ってきてしまいます。

/* 取得カラム宣言 */
DBMS_SQL.DEFINE_COLUMN( sCUR, 1, sDATA(2) );
DBMS_SQL.DEFINE_COLUMN( sCUR, 2, sDATA(3) );

↑ここを、
/* 取得カラム宣言 */
DBMS_SQL.DEFINE_COLUMN( sCUR, 1, sDATA(2), 20 );
DBMS_SQL.DEFINE_COLUMN( sCUR, 2, sDATA(3), 40 );

と桁数を宣言するとコンパイルエラーは消えますが、
ORA-01403: データが見つかりません
と、oracleエラーになってしまいます。

私、検討違いの事をしてますか。。。?
NAO
ぬし
会議室デビュー日: 2001/10/24
投稿数: 1256
お住まい・勤務地: 神奈川のはずれから東京の下町
投稿日時: 2007-05-29 14:31
まず。

sDATA(2)→なんでsDATA(0)から始まらないの?

#開発をやっている訳ではないので作法がそうだったらすいません。

それから変数は最初に宣言してるんでしょうか?
また同じ列なのになぜ桁数が違うんでしょうか?

http://www.systeminfinity.co.jp/sub/tech/doc/plsql/PLSql_DO.htm

この辺りを参考にすると良いかもしれません 

_________________
Inspired Ambitious
ISMS Assistant Auditor
カーニー
ぬし
会議室デビュー日: 2003/09/04
投稿数: 358
お住まい・勤務地: 東京
投稿日時: 2007-05-29 14:33
引用:

satokoさんの書き込み (2007-05-29 13:49) より:
SELECT INTO文なのですが、

sDATA DBMS_SQL.VARCHAR2_TABLE;

SELECT aaa INTO sDATA(0) FROM test;

と言う具合に、直接PL/SQL表に格納することは出来ないのでしょうか?


できますよ。

引用:

SQL*Plusでコンパイルしようとすると、
PL/SQL: ORA-00904: 列名が無効です
とエラーになってしまいます。


aaaという列名が間違っているんじゃないでしょうか。
まさる
ベテラン
会議室デビュー日: 2006/12/21
投稿数: 59
お住まい・勤務地: 越後の中ほど
投稿日時: 2007-05-29 15:14
BULK COLLECT INTO で検索してみてください。
カーニー
ぬし
会議室デビュー日: 2003/09/04
投稿数: 358
お住まい・勤務地: 東京
投稿日時: 2007-05-29 15:41
引用:

まさるさんの書き込み (2007-05-29 15:14) より:
BULK COLLECT INTO で検索してみてください。



僕も最初はBULK COLLECT INTOかなぁ、と思いました。
しかしよく読むとやりたいことが、

引用:

satokoさんの書き込み (2007-05-29 13:49) より:
やりたい事は、

SELECT aaa,bbb,ccc INTO sDATA(0),sDATA(1),sDATA(2) FROM test;

という具合にSELECTしつつPL/SQL表に格納したいです。



複数行を一括で、ではなく、複数列を一括でということなので、ちょっとBULK COLLECT INTOとは違うようなのです。
NAO
ぬし
会議室デビュー日: 2001/10/24
投稿数: 1256
お住まい・勤務地: 神奈川のはずれから東京の下町
投稿日時: 2007-05-29 16:13
引用:

カーニーさんの書き込み (2007-05-29 15:41) より:
引用:

まさるさんの書き込み (2007-05-29 15:14) より:
BULK COLLECT INTO で検索してみてください。



僕も最初はBULK COLLECT INTOかなぁ、と思いました。
しかしよく読むとやりたいことが、

引用:

satokoさんの書き込み (2007-05-29 13:49) より:
やりたい事は、

SELECT aaa,bbb,ccc INTO sDATA(0),sDATA(1),sDATA(2) FROM test;

という具合にSELECTしつつPL/SQL表に格納したいです。



複数行を一括で、ではなく、複数列を一括でということなので、ちょっとBULK COLLECT INTOとは違うようなのです。


テーブル構成がいまいち見えないんですよね。

と言う事で。
可能な範囲でテーブル構成を書いて下さいな 

>satokoさん

スキルアップ/キャリアアップ(JOB@IT)