PL/SQL初心者なので方法があるかないかもわかりません。
SELECT TABLE_NAME
FROM USER_TABLES
で取得したテーブルを
PQL文に使用したいのですが可能ですか?
一応動的(DBMS_SQLを使用した方法)にSQLを作成することはできたのですが
パフォーマンスを考えると静的に使用したいのです。
動的、静的の表現でいいのかわかりませんが普通に
PL/SQL中にSQL文を使いたいんですがいかがでしょうか?

このQ&Aに関連する最新のQ&A

A 回答 (4件)

再びです。


はっきり結論付けなくてすみません。

完全に否定したわけではありませんが、以前サポートに似た質問をしたところできないといわれました。

あとパフォーマンス的にとおっしゃっていますが、作り方によりますが、SQL文のアクセスパスパスが決まらないのは、PL/SQL内の固定SQL文も、動的SQL文も同じだと思います。差が出るのは、SQL文自身の解析が、固定SQL文と動的SQL文の違いになると思いますが、以前テストしてみたら、その部分は大きな差はなかったと思いますが・・・。

いずれにしても、たいした力になれなくて申し訳ありません。
    • good
    • 0

PL/SQLで、DROP文等のDDL文を使いたいときは、DBMS_SQLパッケージを使用する必要があります。

テーブル名を変数にしたいときも同じことです。

DBMS_SQLパッケージは、PL/SQLパッケージの中では割とよく使うパッケージなので、多くの情報が得られると思います。
調べてみてください。
    • good
    • 0
この回答へのお礼

アドバイスありがとうございます。
質問中でも書きましたが
DBMS_SQLパッケージでの実行は、動作確認済みです。

文章内容から推測すると「できない」ということになるのでしょうか?

ない頭なりに考えて、
UTL_FILE.PUT_LINEを使いPL/SQLの関数を作成してしまえばとも
考えましたが、結局 コンパイル時に解析しなくてはならず一緒ですね。

お礼日時:2002/02/21 01:47

も一度こんばんわ



うーん、これは難しいような気がします
とは言っても僕も大して経験があるわけではないので、
「絶対に不可能」とは言い切れませんが・・・
少なくとも僕の知識の範疇では無理そうです。

カーソルうんぬん・・・と言うことであれば、
FETCHして取得したテーブル名を
IF文で条件分岐してその中でそれぞれの処理を行う・・・
と言うくらいしか僕には思いつきません。

うーん、お役に立てなくて、すみませんね
    • good
    • 0
この回答へのお礼

アドバイスありがとうございます。
相談した人もそのようなこといってました。
テーブル名というのが
たとえば
受注YYYYという形で
後ろ4桁が年になっているんです。
実用年数を考えるとIF文でもいいような気がしますが、
システム会社への納品物なのであんまりなソースになってしまい
NGくらいそうなので

お礼日時:2002/02/20 00:25

こんばんわ



FROM句に使いたい・・・と言うことは、
user_tablesから得られたテーブルに対して
何か処理を行いたいということですか?
※処理対象のテーブルが毎回異なるということですか?

もう少し詳しく(具体的に)やりたい内容を
教えて戴けませんでしょうか?
※取得したテーブル名に対して何を行いたいのか、など

もしかしたら、アドバイスくらいなら出来るかもしれません
それでは

この回答への補足

説明不足でしたかすみません

えっと
まず
user_tablesから得たTABLE_NAMEをカーソルを使い
1件ずつフェッチして
そのテーブルにたいして
SELECTやDELETE、DROPなどの処理をしたいのです。
ということで
>処理対象のテーブルが毎回異なるということですか?
そのとうりです。
アドバイスお願いします。

補足日時:2002/02/19 20:41
    • good
    • 0

このQ&Aに関連する人気のQ&A

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

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

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

QPL/SQL ORA-06502エラーに関して(動的SQL)

こんにちは、いつもお世話になっております。
現在、会社で動的SQLを使用してとある開発をおこなっているのですが、
どうしても上手くいかないので、どなたか教えて下さいm(__)m
下記の動的SQL文で最後から2行目のSQL:DBMS_OUTPUT.PUT_LINE(varDel);
を実行するとORA-06502: PL/SQL:
数値または値のエラー: 文字列バッファが小さすぎます。のエラーが
発生します、過去ログやgoogleで検索をかけてみたのですが、
どうにも解決方法がわからず困っています・・・・
お知恵のある方、教えて下さいませm(__)m
※多分、sql文が長いせいだとは思うのですが、どうしても
これ以上は短くできず、静的ではなく、動的で動かさなければならない
という条件付きなんですが、宜しく御願いします。

DECLARE
numkeepD NUMBER := 0; -- データ保管期間格納用
varAST VARCHAR2(4) := '**'; -- アクセス区分定義外格納用
varkeepD VARCHAR2(2000); -- KEEP_DAYS取得SQL文格納用
varDel VARCHAR2(2000); -- DELETE文格納用

BEGIN
varkeepD := 'SELECT KEEP_DAYS FROM SMCI4T910 WHERE ACC_KBN = '''||varAST||'''';
DBMS_OUTPUT.PUT_LINE(varkeepD);
EXECUTE IMMEDIATE (varkeepD) INTO numkeepD;
DBMS_OUTPUT.PUT_LINE(numkeepD);
-- アクセスログデータ削除SQL文格納
varDel := 'DELETE FROM '||cTABLE_STCI1T910||' ST910 '
||'WHERE '
||'ST910.DELETE_FLG = SCIS_CTS.cDEL_NO AND '
||'EXISTS('
||'SELECT 1 '
||'FROM SMCI4T910 SM910 '
||'WHERE '
||'ST910.ACC_KBN = SM910.ACC_KBN AND '
||'ST910.ACC_CYMD < TO_CHAR(SYSDATE - SM910.KEEP_DAYS,''YYYYMMDD'') AND '
||'ST910.ACC_KBN <> varAST AND '
||'SM910.DELETE_FLG = SCIS_CTS.cDEL_NO)';
DBMS_OUTPUT.PUT_LINE(varDel);
--EXECUTE IMMEDIATE (varDel)
END;

こんにちは、いつもお世話になっております。
現在、会社で動的SQLを使用してとある開発をおこなっているのですが、
どうしても上手くいかないので、どなたか教えて下さいm(__)m
下記の動的SQL文で最後から2行目のSQL:DBMS_OUTPUT.PUT_LINE(varDel);
を実行するとORA-06502: PL/SQL:
数値または値のエラー: 文字列バッファが小さすぎます。のエラーが
発生します、過去ログやgoogleで検索をかけてみたのですが、
どうにも解決方法がわからず困っています・・・・
お知恵のある方、教えて下さいませm(...続きを読む

Aベストアンサー

ごめんなさい、"SUBSTRB"の方がいいですね。

文字数ではなくバイトで切り出しです。

QROW_NUMBER BY PL/SQL

こんばんは。

今PL/SQLで開発をしているのですが、PL/SQLでわからないことがあります。

日付のソート順に並べたデータの中から、何行目から何行目までのデータを取得、ということがしたくてROW_NUMBERを使ってSQL文を作成しました。
そのSQL文はきちんと動くのですが(データ取得できる)、それをPL/SQLにてカーソル宣言するとコンパイルエラーになってしまいます。
ROW_NUMBERの部分を削除するとコンパイルは通るので、原因はROW_NUMBERにあるようです。
しかしながら、ROW_NUMBERを使わずに、何行目から何行目までのデータ取得、ということが実装できるのか検討もつきません。
どうしてカーソルでROW_NUMBERが使えないのか?
ROW_NUMBERのかわりのようなコマンド、もしくは実装方法が存在するのか?

不明な点は補足させていただきますので、ご教示の程宜しくお願い致します<(_ _)>

Aベストアンサー

深く考えすぎ
カーソルオープンしてフェッチしながらループしてくんだから、
取得開始行までフェッチした内容を無視して、必要な行まで取得したらループを抜けてカーソル閉じるだけ

Q質問:DBMS_OUTPUTの使用方法

初めまして、今業務でPL/SQLを使っているのですが、何を調べても分からないのでお聞きします。
DBMS_OUTPUTをプログラムに書き込んで画面表示をしています。文字や変数に格納された情報は出るのですが、空業や、スペースは以下のようにしてもどうしても表示されません。どうすればよいのでしょうか。
私が試した方法。↓
DBMS_OUTPUT.PUT_LINE( '' ); や DBMS_OUTPUT.NEW_LINE; です。
どうか教えてください。お願いします。

Aベストアンサー

こんにちわ
DBMS_OUTPUT パッケージで空行の出力についてですが、
set serveroutput を実行する時に、format wrapped を指定すれば
問題を解決できると思います。
以下に、実行結果を示します。

※ 通常 (デフォルト) のケース
set serveroutput on
begin
dbms_output.put_line('123');
dbms_output.put_line('');
dbms_output.put_line('456');
end;
/
123
456
PL/SQLプロシージャが正常に完了しました。

※ format wrapped を指定したケース
set serveroutput on format wrapped
begin
dbms_output.put_line('123');
dbms_output.put_line('');
dbms_output.put_line('456');
end;
/
123

456
PL/SQLプロシージャが正常に完了しました。

こんにちわ
DBMS_OUTPUT パッケージで空行の出力についてですが、
set serveroutput を実行する時に、format wrapped を指定すれば
問題を解決できると思います。
以下に、実行結果を示します。

※ 通常 (デフォルト) のケース
set serveroutput on
begin
dbms_output.put_line('123');
dbms_output.put_line('');
dbms_output.put_line('456');
end;
/
123
456
PL/SQLプロシージャが正常に完了しました。

※ format wrapped を指定したケース
set serveroutput on format wrapped
begin
dbm...続きを読む

QPL/SQLで複数のFor文を解除したい

PL/SQLでFor文を複数使用したデータ作成プログラムを作っています。
作成したデータが一定数に達したら全てのFor文を抜ける処理を
入れたいのですが、うまくいきません。
VBのExit Functionなどのように複数のFor文を一気に抜けるやり方は
PL/SQLにはあるのでしょうか?

ソース---------------------------------------------------------
(中略)
   StrCnt := 1;
   For i IN 1..3 LOOP
      StrA := "あ"
      For j IN 1..3 LOOP
         StrB := "い"
         For k IN 1..3 LOOP
            StrC := "う"
            outputStr := StrA || StrB || StrC ;
            DBMS_OUTPUT.PUT_LINE (outputStr) ;
            StrCnt := StrCnt + 1 ;
            
            --もしStrCntが5つ作成されればデータ作成を中断
            IF StrCnt > 5 THEN
                ※ここで全てのループを解除したい
            END IF;

         EXIT LOOP;
      EXIT LOOP;
   EXIT LOOP;
(後略)
---------------------------------------------------------------

環境は
 【OS】Window2000 Pro
 【Oracle】8.1.6       です。
Oracleを始めて一週間足らずの未熟者なので、ソース自体が違うかもしれませんが、
どなたかご存知の方、教えてください!

PL/SQLでFor文を複数使用したデータ作成プログラムを作っています。
作成したデータが一定数に達したら全てのFor文を抜ける処理を
入れたいのですが、うまくいきません。
VBのExit Functionなどのように複数のFor文を一気に抜けるやり方は
PL/SQLにはあるのでしょうか?

ソース---------------------------------------------------------
(中略)
   StrCnt := 1;
   For i IN 1..3 LOOP
      StrA := "あ"
      For j IN 1..3 LOOP
         StrB := "い"
    ...続きを読む

Aベストアンサー

EXIT で試してみてください。

QDBをコピーし一部変更して追加するPL/SQL文

オラクルPL/SQL超初心者です。
住所録DBで1項目だけ変更し、あとはすべて同じ内容でその住所録DBに追加するプロシージャーのSQL文の作成例をご教示下さい。(データは約8,000件あります)
例えば下記のように「確認日」だけ更新して追加するには・・・

イメージとしては (変更項目)
氏名 住所 電話  年齢 確認日
-------------------------------------------
AAA aaa xxxx xx 2003/10/31
DDD bbbb xxxx xx 2003/10/31
FFF ccc xxxx xx 2003/10/31
HHH ddd xxxx xx 2003/10/31
TTT fff xxxx xx 2003/10/31
--(追加データ)
AAA aaa xxxx xx 2004/02/11
DDD bbbb xxxx xx 2004/02/11
FFF ccc xxxx xx 2004/02/11
HHH ddd xxxx xx 2004/02/11
TTT fff xxxx xx 2004/02/11

環境はOracle9i、WindowsXP、ツールはSI Object Browserです。

オラクルPL/SQL超初心者です。
住所録DBで1項目だけ変更し、あとはすべて同じ内容でその住所録DBに追加するプロシージャーのSQL文の作成例をご教示下さい。(データは約8,000件あります)
例えば下記のように「確認日」だけ更新して追加するには・・・

イメージとしては (変更項目)
氏名 住所 電話  年齢 確認日
-------------------------------------------
AAA aaa xxxx xx 2003/10/31
DDD bbbb xxxx xx 2003/10/31
FFF ccc xxxx xx 2003/10/31
HHH ddd xxxx xx 2003/1...続きを読む

Aベストアンサー

insert into 住所録DB (氏名,住所,電話,年齢,確認日) values select 氏名,住所,電話,年齢,'2004/02/11' from 住所録DB where 確認日 = '2003/10/31'

で出来ると思うんですが・・・何となくDBの設計に違和感を感じるのは気のせいかな???


このカテゴリの人気Q&Aランキング

おすすめ情報