マンガでよめる痔のこと・薬のこと

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を探す

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

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

QPL/SQL カーソルのFROM句にカーソル

もしご存知の方がいればお教えください。

ORACLE PL/SQLで
CURSOR cur_a AS
SELECT a FROM TBLA
とカーソルを宣言し
そのカーソルを他のカーソルで
使用することは可能でしょうか?
以下のような感じで
CURSOR cur_B AS
SELECT b FROM TBLB,cur_a

ご存知の方が居たら
どのようなSELECT文を
書けばよいかお教えください

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

Aベストアンサー

カーソルにINのパラメータが設定できるので、INで受け取った値をカーソル内のWhere句に指定すれば検索可能です。

昔、こんな感じでやりました。
以下のサンプルはscottユーザで流してみてください。

set serveroutput on size 1000000
DECLARE
CURSOR emp_cur
IS
SELECT
empno,
deptno
FROM emp
;
emp_rec emp_cur%ROWTYPE;

CURSOR dept_cur
(
in_deptno IN NUMBER
)
IS
SELECT
deptno,
dname
FROM dept
WHERE deptno = in_deptno
;
dept_rec dept_cur%ROWTYPE;

BEGIN
OPEN emp_cur;
LOOP
FETCH emp_cur INTO emp_rec;
EXIT WHEN emp_cur%NOTFOUND;

OPEN dept_cur
(
emp_rec.deptno
);

FETCH dept_cur INTO dept_rec;
IF dept_cur%NOTFOUND
THEN
DBMS_OUTPUT.PUT_LINE('dept not found : ' || emp_rec.deptno);
ELSE
DBMS_OUTPUT.PUT_LINE(emp_rec.empno);
DBMS_OUTPUT.PUT_LINE(dept_rec.dname);
END IF;
CLOSE dept_cur;

END LOOP;
CLOSE emp_cur;


EXCEPTION

WHEN OTHERS THEN
DECLARE
ERROR_CODE NUMBER := SQLCODE;
ERROR_MSG VARCHAR2(300) := SQLERRM;
BEGIN
DBMS_OUTPUT.PUT_LINE('*** ORA-ERROR IN THE EXCEPTION ***');
DBMS_OUTPUT.PUT_LINE('ERROR CODE : ' || TO_CHAR(ERROR_CODE));
DBMS_OUTPUT.PUT_LINE('ERROR MSG : ' || ERROR_MSG);
END;

END;
/

カーソルにINのパラメータが設定できるので、INで受け取った値をカーソル内のWhere句に指定すれば検索可能です。

昔、こんな感じでやりました。
以下のサンプルはscottユーザで流してみてください。

set serveroutput on size 1000000
DECLARE
CURSOR emp_cur
IS
SELECT
empno,
deptno
FROM emp
;
emp_rec emp_cur%ROWTYPE;

CURSOR dept_cur
(
in_deptno IN NUMBER
)
IS
SELECT
deptno,
dname
FROM ...続きを読む

QPL/SQLでテーブル名に変数を使いたい

下記のようにV_TABLE_NAMEに不定のテーブル名で使用したい
ご存知の方は教えて頂けないでしょうか?V_TABLE_NAMEに取得したテーブルをセットし、データの件数を取得するPL/SQL

CURSOR C_CUR IS
SELECT COUNT (*)
FROM V_TABLE_NAME;

BEGIN
for ・・・・・ loop
・・・
 ・・・
V_TABLE_NAME := GET_TABLE;

 OPEN C_CUR;
 FETCH C_CUR into w_count;
CLOSE C_CUR;

end loop;

Aベストアンサー

テーブル名のところを変数にすることは出来ません。

テーブル名を可変にするには、動的SQLにする必要があります。
DBMS_SQLパッケージを使用します。

サンプルはこちら
http://otn.oracle.co.jp/sample_code/tech/pl_sql/index.html
(事前に登録が必要です。無料です)

参考URL:http://otn.oracle.co.jp/sample_code/tech/pl_sql/index.html

QFROM句のスキーマ名、テーブル名を動的にしたい

FROM句に続く、[スキーマ名].[テーブル名]を動的にすることは可能でしょうか。何か手法がありますでしょうか。
よろしくお願いします。

Aベストアンサー

以下のサイトをごらんください。

MSDNフォーラム
http://forums.microsoft.com/msdn-ja/ShowPost.aspx?PostID=601586&SiteID=7

以上

Q文字列として"(ダブルコーテーション)を表示させる方法

こんにちは。文字列として、ダブルコーテーションを表示させるには、どうすればよいのか教えてください。m(__)m


例えば、
<font size="2">あいうえお</font>

というタグの「あいうえお」の部分が、セルA1にあった場合、

="<font size="2">"&A1&"</font>"という表示にしたいのです。

"2"のダブルコーテーションも文字列として表示させるには、どうすればよろしいのでしょうか。

教えてください。よろしくお願い致します。

Aベストアンサー

こんにちは~

表示形式は 「標準」 のままで、
ダブルコーテーションを、ダブルコーテーションで囲んでください。

""2""

="<font size=""2"">"&A1&"</font>"

としてみてください。

Qデータベース内のテーブル名の取得

お世話になります。
初心者的な質問でしたらすいません。
SQL文にてデータベース内のテーブル名を
調べることができると聞いたことがあるのですが、
可能でしょうか。

もし、可能であれば、SQLの記述を教えてください。
お願いします。

Aベストアンサー

select * from tab;

私の場合、テーブル名だけ手っ取り早く知りたいとき、↑を打ちます。その他の情報も知りたいときは#2さんの仰るとおり、user_tablesで取得します。

Qreplace関数で複数の文字の変換の仕方は?

よろしくお願いします。
WIN2000 oracle8.1.6

SELECT文でreplace関数を使って文字の変換をしたいのですが、複数の文字の変換は可能でしょうか?

やりたい事
aaabb→アアアbb
a-aabb→ア=アアbb

SELECT replace(001,'a','ア'),002,003,004 FROM ZAIKO

よろしくお願いします。

Aベストアンサー

やりたいことの検証できるサンプルを書かないと正しく理解できないし、
正しい答えかどうかの検証ができません。

あなたのやりたいことは、REPLACE関数でなく、TRANSLATE関数で..

SELECT TRANSLATE(001,'ab','アウ'),002,003,004 FROM ZAIKO

ような感じで出来るはずですよ。

Qbatファイルからsql文実行

クライアントOS:WIN2000
Oracle:9i(サーバ(UNIX)上にあります)

現在、クライアントからbatを起動し、SQL文を投げ、結果を取得したいと思っております。
(SQL文は単純にTBLをカウントしているだけです)

・batの中身
sqlplus %UID%/%PASS%@%SID% @test.sql > output

結果は取得出来るのですが、余分な情報も結果に出力されてしまいます。結果のみを出力させるにはどうすればよろしいでしょうか?

・余分な情報
Oracle9i Enterprise Edition Release 9.2.0.4.0 - Production
With the Partitioning, OLAP and Oracle Data Mining options
JServer Release 9.2.0.4.0 - Production
に接続されました。

Aベストアンサー

sqlplus に -S オプションを追加してみればどうでしょうか。

参考URL:http://biz.rivus.jp/sqlplus_overview.html

QSELECTで1件のみ取得するには?

こんにちわ。
いまORACLE9iを使用している者です。

ACCESSでは
SELECT TOP 1 項目名 FROM テーブル名
ORDER BY 項目名;
で並べ替えたデータ群のうち,先頭の1件だけを
取ることができますが,
ORACLEでそのような機能(SQL)はあるでしょうか?
教えてください。
よろしくお願いします。

Aベストアンサー

order by と rownum を併用する場合は注意が必要です。

[tbl01]
cola | colb
------------
1000 | aaaa
1001 | bbbb

というデータがある場合、
select cola from tbl01 where rownum < 1 order by cola desc;
とすると、「1001」ではなく、「1000」が返されます。
これは、order by の前に rownum < 1 が適用されてしまうからです。

解決するには、
select aaa from (select cola aaa from tbl01 order by cola desc) where rownum = 1;
とすれば良いです。

Qjoinの場合のテーブル名の別名の使用方法

select * from table1 a,table2 b
where a.field1=b.field1;

とできますが

select * from table1 as a left join table2 as b
on a.field1=b.field1;

とできません。
joinの場合にテーブル名の別名を使う方法を教えてください

Aベストアンサー

当方、PostgreSQL 8.0を使っていますが、

select * from t1 as x left join t2 as y on x.c1=y.c1

という別名を使った構文は使えるようです。

また、以下のようにインラインビューにする方法はどうでしょうか?

select * from (select * from t1) as x left join (select * from t2) as y on x.c1=y.c1

QSQL 特定のカラムが最大値のレコード取得

初心者です。SQL文で困っています。
どなたかご教授頂けたらと思います。

環境は、SQL SERVER 2000です。
特定のカラムが最大値のレコードのみ取得したいです。
たとえば、以下のようなデータがあるとします。
コード、履歴番号で主キーとします。
コード|履歴番号 |金額
0001 |1 |12000
0001 |2 |12001
0001 |3 |12002
0002 |1 |12000
0002 |2 |12001
0002 |3 |12002
0003 |1 |12000
0003 |2 |12001
この場合に、コード毎に履歴番号が最大のレコードのみを取得したいです。
理想の結果は以下になります。
コード|履歴番号 |金額
0001 |3 |12002
0002 |3 |12002
0003 |2 |12001

以上です。よろしくお願いいたします。

Aベストアンサー

SQL Server 2000で動くかどうか分かりませんが、SQL例です。

select *
from t1 as x
where 履歴番号=(select max(履歴番号)
from t1
where コード=x.コード)
order by コード


人気Q&Aランキング