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と関連する良く見られている質問

QExcel VBAで、セルに入ってるデータ型を調べる方法は?

現在、Excel VBAでプログラムを作成しています。

Do Until ~ Loop の終了条件を
アクティブセルに入っているデータの型が文字列型の時
としたいのですが、そのようなことは可能なのでしょうか?

可能だとしたら、どのように記述したらいいのでしょうか?

当方のPCは
Win XP、Excel2003
です。

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

Aベストアンサー

VarType 関数を使うとか。

Sub SampleProc()

  Dim i As Long
  
  i = 1
  Do While Len(Cells(i, "A").Value) > 0
    If VarType(Cells(i, "A")) = vbString Then
      Exit Do
    Else
      ' // 処理
    End If
    i = i + 1
  Loop
  MsgBox CStr(i) & "行目で停止"

End Sub

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"の方がいいですね。

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

QVBAでオブジェクト変数にsetしたシートがactiveかどうかを調べるには?

標準モジュールの冒頭でワークシート用のオブジェクト変数を確保し、
あるタイミングで、あるシートをそのオブジェクト変数にSetしています。

で、そのシートに値をセットするときに、そのシートがActiveだった場合だけやりたい処理があるのですが、Setしてあるオブジェクト変数だけを見てそのシートがActiveか否かを判断する方法って、あるのでしょうか。

コード例)
Private oSheetA as Worksheet

Sub SetSheet(sName as String)
  Set oSheetA = worksheets(sName)
End Sub

Sub SetValue(nValue as integer)
  xxxxxx ←ここでoSheetAがActiveならやりたいことがある。
  oSheetA.Cells(nRow, nCol) = cValue
End Sub

具体的には、複数のBookを開いている状態で、Activeシートが何であるかはオペレータの操作次第なので固定化できない状態で、SetValueが呼び出されたとき、oSheetAがActiveだったら、値をセットするセルが見えるようにセルをActivateかスクロールさせたいんです。

標準モジュールの冒頭でワークシート用のオブジェクト変数を確保し、
あるタイミングで、あるシートをそのオブジェクト変数にSetしています。

で、そのシートに値をセットするときに、そのシートがActiveだった場合だけやりたい処理があるのですが、Setしてあるオブジェクト変数だけを見てそのシートがActiveか否かを判断する方法って、あるのでしょうか。

コード例)
Private oSheetA as Worksheet

Sub SetSheet(sName as String)
  Set oSheetA = worksheets(sName)
End Sub

Sub SetValue(nVa...続きを読む

Aベストアンサー

Option Explicit

Private oSheetA As Worksheet

Sub SetSheet(sName As String)
Set oSheetA = Worksheets(sName)
End Sub

Sub SetValue(nValue As Integer)
If oSheetA Is ActiveSheet Then
MsgBox ("hoge")
End If
oSheetA.Cells(1, 1) = nValue
End Sub

Sub Main()
SetSheet ("Sheet1")
SetValue (5)
End Sub

'実行できるようにソースは変更していますが,
'こんな感じでIs演算子で同じオブジェクトか比較してみるってのはどうでしょう?

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ベストアンサー

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

QVoidポインタで受け取った変数の型を調べる方法

あるライブラリの関数を利用しようとしたのですが、その関数の引数にVoidポインタがあり、どういう型のデータを格納したのかわかりません。このポインタのアドレスに格納されたデータの型を調べる関数なり方法なりというのはあるのでしょうか。

Voidポインタというのは型を問わずに受け取れるというのは利点ですが、受け取ったものがあらかじめなんだかわからない場合はどうするのでしょうか。よろしくお願いします。

Aベストアンサー

★基本的に調べようがありません。
・『void』ポインタはアドレス情報のみを受け渡しますので、型のサイズまでは分かりません。
 逆に言えば、型のサイズが分からないから『汎用ポインタ』と呼べるのです。
・あるライブラリの関数とは何?→どんな関数か分かりませんので、これ以上はアドバイス無理!
 ただ、C言語の qsort などでは比較用の関数で『void』ポインタを受け取りますが、その関数内で
 渡されたデータの『型』を指定します。→ポインタの形でキャストします。
 この比較用の関数は自前で用意する関数ですので、ソートするデータの型が分かっています。
 でも、ソートするデータ型が複数ある場合は、比較用の関数を複数作って切り替えます。
・あと関数に型を表す引数があれば、それを見て判断できますが、そうでない場合は『void』ポインタで
 渡される前の『型』の調べることは不可能です。→言語仕様より。
・以上。参考に。→一応、あるライブラリの関数とは何?

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...続きを読む

QVBAでテキストファイルの件数を調べる方法

Access2000のVBAで関数を使用して
ファイルのパス名、ファイル名を指定すれば、
テキストファイルの件数を検索し変数に返す
関数はありませんか?
   
通常テキストファイルを開き1件1件カウントを
取っていけば件数を知ることは可能ですが、
数千レコードのテキストファイルが複数個存在
する場合処理スピードが遅くなるため何か
最適な関数はありませんか?
よろしくお願い致します。

Aベストアンサー

こんにちは。maruru01です。

No.2の方のFileSystemObjectを利用する方法です。

行数 = CreateObject("Scripting.FileSystemObject").OpenTextFile(ファイルのフルパス, 8).Line

複数のファイルをカウントするなら、ファイルでループを回せばいいでしょう。

あと、FileSystemObjectの参考ページを紹介しておきます。

http://www.bcap.co.jp/hanafusa/VBHLP/FSOme.htm

http://www.microsoft.com/japan/msdn/library/default.asp?url=/japan/msdn/library/ja/script56/html/jsobjFileSystem.asp

参考URL:http://www.bcap.co.jp/hanafusa/VBHLP/FSOme.htm,http://www.microsoft.com/japan/msdn/library/default.asp?url=/japan/msdn/l

こんにちは。maruru01です。

No.2の方のFileSystemObjectを利用する方法です。

行数 = CreateObject("Scripting.FileSystemObject").OpenTextFile(ファイルのフルパス, 8).Line

複数のファイルをカウントするなら、ファイルでループを回せばいいでしょう。

あと、FileSystemObjectの参考ページを紹介しておきます。

http://www.bcap.co.jp/hanafusa/VBHLP/FSOme.htm

http://www.microsoft.com/japan/msdn/library/default.asp?url=/japan/msdn/library/ja/script56/html/jsobjFileSystem.asp

...続きを読む

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 で試してみてください。

QVBAで他のプログラムが起動しているか調べる方法

VBAで
D:\test\test.exe
が起動中か調べたいのですが
どのようにすれば良いですか?

http://www.vbalab.net/vbaqa/data/access/log/tree_532.htm

このページの方法を使えば、
exe以外のファイルが使用中かは調べることができたのですが
exeファイルの場合にはうまくいきません。

良い方法があれば教えてください。

Aベストアンサー

残念ながら・・・出来ません。
一応、プロパティの中に Handle ってのがあるのですが
取得できるのは ProcessID の値です。
以前、調べていて Handle を見つけた時は、
『やったー \(^o^)/』と思いましたが
ぬか喜びでした。。。orz

なお、当方の環境は、Windows7 Pro & Office2010 です。

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を見た人がよく見るQ&A

人気Q&Aランキング