プロが教える店舗&オフィスのセキュリティ対策術

こんばんわ!

PL/SQLの超初心者なのですが、以下ように「aaa」という変数に一つ目のselect文の結果を代入して、二つ目のselect文のテーブルにその名前を当てはめたいだけなのです。

DECLAER
aaa VARCHAR2(30)
BEGIN
select max(TABLE_NAME) into aaa from ALL_TABLES Like '***';
select * from aaa
END;

ところが、結果は「表またはビューが存在しません」となります。
このような使い方はできないのでしょうか?
どなたかご教示いただけませんでしょうか?宜しくお願いします。

A 回答 (4件)

>column aaa_ren new_value vaaa NOPRINT


先にバインド変数の:aaaにテーブル名を入れたので、
それをsqlplusの置換変数のvaaaに入れるために行っている
ことで、「列aaa_renの内容をvaaaにセットします」と宣言しています。

>select :aaa aaa_ren from dual;
そのあとで:aaaの列名をaaa_renとしてselect文を実行すると、selectが実行され、その結果がvaaaに入ります。
Oracleの場合は、from句がないとselect文は実行できないので、
テーブルでなく変数などをselectしたい場合は、「from dual」とつけるのが普通です(select sysdate from dualなどと同じ)。

>select * from &vaaa
めでたくvaaaにテーブル名が入ったので、その内容を使ってselect文を実行します(置換変数は&付で記載します)。

念のため10gで確認してから書いたので、別に例じゃないですよ。
そのままやれば動くとおもいますけどね。
    • good
    • 0
この回答へのお礼

ご丁寧にどうもありがとうございました。

またよろしくお願いします。

お礼日時:2008/08/16 21:21

とりあえずPL/SQLの無名ブロック内で単純にSELECTを書いてもダメというのは理解しましたよね。


(PL/SQL内でのSELECT文は変数に値を入れるために使うので、「INTO句はこのSELECT文に入ります」というエラーメッセージがでます)

なので、目的が単にsqlplusでSELECTするだけなら、この方法でできなくはない、という前提で書きます。
とりあえず変数は3種類あると思ってください。
1)PL/SQLの変数 (DECLAREで定義するもの)
2)PL/SQLでもsqlplusでも使える変数(バインド変数)
3)sqlplusでしか使えない変数(置換変数)
で、今回のケースは1)はつかっていないです。

SELECT * FROM (変数)とできるのは、3)だけです。
ただし、ここに直接テーブル名をセットできないので、PL/SQLの無名ブロック内で一度バインド変数:aaaに入れて、これをSQLPlusの置換変数&vaaaに渡しています。

こういう書き方にすればよかったですかね。
SQL>variable aaa varchar(30)
SQL>BEGIN
2 SELECT select max(TABLE_NAME) into :aaa from ALL_TABLES Like '***';
3 END;
4 /
PL/SQLプロシージャが正常に完了しました。

SQL>column aaa_ren new_value vaaa NOPRINT
SQL>select :aaa aaa_ren from dual;

SQL>select * from &vaaa;

この回答への補足

ご回答ありがとうございます!

「PL/SQLプロシージャが正常に完了しました。」までは正常にいきましたが、
↓ここからが理解できません。
SQL>column aaa_ren new_value vaaa NOPRINT
columnとnew_valueは調べれましたが、「aaa_ren」と「vaaaa」は何でしょうか?別の変数名ですか?適当に別の変数名を指定してみましたが、「不明なcolumnオプションです。」が出てきます。

SQL>select :aaa aaa_ren from dual;
↑「dual」を指定するのでしょうか?これは単なる例なのでしょうか?

知識不足で大変申し訳ありませんがご教授お願い致します。

補足日時:2008/08/16 13:06
    • good
    • 0

sqlplusでできればいいんですか?


sqlplusの置換変数を使う方法なら、できなくはないです。

variable aaa varchar(30)

BEGIN
SELECT select max(TABLE_NAME) into :aaa from ALL_TABLES Like '***';
END;
/

column aaa_r new_value vaaa NOPRINT

select :aaa aaa_r from dual;

select * from &vaaa;

この回答への補足

ご回答ありがとうございます。
ただスミマセンが私のレベルが低くて申し訳ないのですが、よく理解できません。どれがテーブルの変数でどれが置換変数なのでしょうか?

補足日時:2008/08/15 17:01
    • good
    • 0

今回のエラーは、テーブル名を変数として扱うことはできないことが原因なので、動的クエリにしないとエラーは解消しません。


EXECUTE IMMEDIATE 'select * from ' || aaa;

上記に変えればエラーはでませんが、結果は返りません。
そもそもPL/SQLの無名ブロック内でSELECT文を実行して結果を表示させるという考え方自体を改める必要があると思いますよ。
(SQL ServerのTransact-SQLとは違いますので)
結果はカーソルを使って、DBMS_OUTPUT.PUT_LINEで表示させるのが一般的だと思います。

この回答への補足

ご回答ありがとうございます。
では一つ目のSelect文で返ってきた結果のテーブルを別のSelect文で使用したい場合はどのような方法がありますでしょうか?
ご存知でしたらご教示いただけませんでしょうか?

補足日時:2008/08/15 12:28
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

関連するカテゴリからQ&Aを探す


このQ&Aを見た人がよく見るQ&A