- PR -

SELECT INTO文について

投稿者投稿内容
まさる
ベテラン
会議室デビュー日: 2006/12/21
投稿数: 59
お住まい・勤務地: 越後の中ほど
投稿日時: 2007-05-29 16:16
引用:

カーニーさんの書き込み (2007-05-29 15:41) より:
複数行を一括で、ではなく、複数列を一括でということなので、ちょっとBULK COLLECT INTOとは違うようなのです。



そう言われてみると、確かにそうですね。
失礼いたしました。
satoko
常連さん
会議室デビュー日: 2006/05/06
投稿数: 35
お住まい・勤務地: 東京
投稿日時: 2007-05-29 17:33
返答が遅くなり申し訳ありません。
皆さん本当にありがとうございます。
動的SQLのページは参考にさせていただきました。

引用:

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

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



CREATE TABLE T_CST_CODE
(
CODE_ID NUMBER(3) NOT NULL,
CODE_TYPE NUMBER(2) NOT NULL,
CODE_NM VARCHAR2(100) NOT NULL
);

CREATE TABLE T_CST_TEST
(
OPE_ID VARCHAR2( NULL,
ABSINDEX NUMBER(3) NULL,
RELINDEX NUMBER(3) NULL,
OWN_FLG NUMBER(2) NULL,
DATA VARCHAR2(300) NULL
);

という二つのテーブルがあったとして、

sDATA DBMS_SQL.VARCHAR2_TABLE;

SELECT CODE_ID,CODE_TYPE,CODE_NM INTO sDATA(0),sDATA(1),sDATA(2) FROM T_CST_CODE;

SELECT OPE_ID,ABSINDEX,RELINDEX,OWN_FLG,DATA INTO sDATA(3),sDATA(4),sDATA(5),sDATA(6),sDATA(7) FROM T_CST_TEST;

というように、一つのPL/SQL表に格納していきたいです。

このsDATAというPL/SQL表は、バインドを使用してINSERT処理を行うためのものです。

検討違いな事を言ってしまっていたら、ごめんなさい
カーニー
ぬし
会議室デビュー日: 2003/09/04
投稿数: 358
お住まい・勤務地: 東京
投稿日時: 2007-05-29 21:05
satokoさんのやりたいことはできるはずなのですが、結局何が問題なんですか?

まだ「ORA-00904: 列名が無効です」が出るのですか?
PL/SQL表の要素ではなく、VARCHAR2で宣言した変数をずらずら並べるのはうまくいきますか?
satoko
常連さん
会議室デビュー日: 2006/05/06
投稿数: 35
お住まい・勤務地: 東京
投稿日時: 2007-05-30 02:20
引用:

satokoさんのやりたいことはできるはずなのですが、結局何が問題なんですか?

まだ「ORA-00904: 列名が無効です」が出るのですか?
PL/SQL表の要素ではなく、VARCHAR2で宣言した変数をずらずら並べるのはうまくいきますか?



もう一度見直して、一件だけPL/SQL表に格納したら、動きました。。。
お騒がせ致しました。
このような初歩的なミスは無いように気をつけます。

BULK COLLECT INTOや動的SQLの参考HPは大変参考になりました。

SELECT INTO文で取得出来たのは良かったのですが、
大量のデータを扱う事になってしまい、SELECT INTO文だとダラダラしてしまうので
教わったBULK COLLECT INTO句の使用を試みました。

--------------------------------------------------------
DECLARE
 sTABLE_DATA DBMS_SQL.VARCHAR2_TABLE;
BEGIN
 SELECT OPE_ID BULK COLLECT INTO sTABLE_DATA FROM T_CST_TEST;
END;
--------------------------------------------------------

実行すると、
ORA-01403: データが見つかりません
と言われてしまいます。

BULK COLLECT INTOはDBMS_SQL.VARCHAR2_TABLEには使えないのでしょうか?

--------------------------------------------------------
DECLARE
 TYPE TYPE_VARCHAR IS TABLE OF VARCHAR2(30) INDEX BY BINARY_INTEGER;
BEGIN
 sTYPE TYPE_VARCHAR;
 SELECT OPE_ID BULK COLLECT INTO sTYPE FROM T_CST_TEST;
END;
--------------------------------------------------------
は正常に動きました。

BULK COLLECT INTO句にこだわっているわけではないのですが、
最終的にはDBMS_SQL.VARCHAR2_TABLEの型で値の入っているものが欲しいので、
何か良い方法はないでしょうか?
カーニー
ぬし
会議室デビュー日: 2003/09/04
投稿数: 358
お住まい・勤務地: 東京
投稿日時: 2007-05-30 15:21
引用:

satokoさんの書き込み (2007-05-30 02:20) より:
--------------------------------------------------------
DECLARE
 sTABLE_DATA DBMS_SQL.VARCHAR2_TABLE;
BEGIN
 SELECT OPE_ID BULK COLLECT INTO sTABLE_DATA FROM T_CST_TEST;
END;
--------------------------------------------------------

実行すると、
ORA-01403: データが見つかりません
と言われてしまいます。

BULK COLLECT INTOはDBMS_SQL.VARCHAR2_TABLEには使えないのでしょうか?


使えないとは聞いたことがないですね。使えないとすれば、実行時エラーではなくて、コンパイル時エラーになるでしょうし。

「ORA-01403: データが見つかりません」というメッセージからすると、そのSELECT文が結果を1行も返さなかったことが原因のように思えるのですが。
satoko
常連さん
会議室デビュー日: 2006/05/06
投稿数: 35
お住まい・勤務地: 東京
投稿日時: 2007-05-31 10:41
引用:

カーニーさんの書き込み (2007-05-30 15:21) より:
使えないとは聞いたことがないですね。使えないとすれば、実行時エラーではなくて、コンパイル時エラーになるでしょうし。

「ORA-01403: データが見つかりません」というメッセージからすると、そのSELECT文が結果を1行も返さなかったことが原因のように思えるのですが。



問題の箇所を、VARCHAR2で宣言した変数に代入しようとすると、値は取れました。
なのでSELECT文から結果は返ってきていると思うのですが
カーニー
ぬし
会議室デビュー日: 2003/09/04
投稿数: 358
お住まい・勤務地: 東京
投稿日時: 2007-05-31 11:38
引用:

satokoさんの書き込み (2007-05-31 10:41) より:
問題の箇所を、VARCHAR2で宣言した変数に代入しようとすると、値は取れました。
なのでSELECT文から結果は返ってきていると思うのですが



そうですか。
実際に自分でも試したりして、解決のお手伝いをしてあげたいのはやまやまなのですが、ちょっと時間的に無理なので、すみませんが後は他の方にお任せします。

もしこちらでよい解決策が見つからなければ、OTNのほうにも行ってみることをお勧めします。
satoko
常連さん
会議室デビュー日: 2006/05/06
投稿数: 35
お住まい・勤務地: 東京
投稿日時: 2007-05-31 15:03
引用:

カーニーさんの書き込み (2007-05-31 11:38) より:
そうですか。
実際に自分でも試したりして、解決のお手伝いをしてあげたいのはやまやまなのですが、ちょっと時間的に無理なので、すみませんが後は他の方にお任せします。

もしこちらでよい解決策が見つからなければ、OTNのほうにも行ってみることをお勧めします。



カーニーさん、どうもありがとうございます。
とても助かりました。
OTNの方も覗いてみる事にします。

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