- - PR -
SELECT INTO文について
投稿者 | 投稿内容 | ||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 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表に格納したいです。 お力添えをお願いいたします。 | ||||||||||||
|
投稿日時: 2007-05-29 13:57
カーソルを使うしか無いですね。
_________________ Inspired Ambitious ISMS Assistant Auditor | ||||||||||||
|
投稿日時: 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エラーになってしまいます。 私、検討違いの事をしてますか。。。? | ||||||||||||
|
投稿日時: 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 | ||||||||||||
|
投稿日時: 2007-05-29 14:33
できますよ。
aaaという列名が間違っているんじゃないでしょうか。 | ||||||||||||
|
投稿日時: 2007-05-29 15:14
BULK COLLECT INTO で検索してみてください。
| ||||||||||||
|
投稿日時: 2007-05-29 15:41
僕も最初はBULK COLLECT INTOかなぁ、と思いました。 しかしよく読むとやりたいことが、
複数行を一括で、ではなく、複数列を一括でということなので、ちょっとBULK COLLECT INTOとは違うようなのです。 | ||||||||||||
|
投稿日時: 2007-05-29 16:13
テーブル構成がいまいち見えないんですよね。 と言う事で。 可能な範囲でテーブル構成を書いて下さいな ![]() >satokoさん |