プロが教えるわが家の防犯対策術!

以下のような事が行いたいのですが、うまくいきません。

 <テーブル1>
  id  計算式
   1  注文数×単価
   2  在庫数×単価

 <テーブル2>
   No. 注文数 在庫数 単価
   A   50   20  500
   B   70   85  860

ここで、テーブル1より計算式を検索し、
その計算式をもとにテーブル2のデータを計算したいのです。

ストアドプロシージャ等を使用すれば出来るのかとおもったのですが、
どうしてもうまくいきません。
このようなことはできないのでしょうか?

開発環境
 ORACLE 8.1.7

A 回答 (5件)

動的SQLを使えば可能だと思いますよ。


選択した計算式の列名と演算子を使って、SQL文を動的に生成して実行すればいいと思います。
動的SQLの使用方法は、Oracleのマニュアルや市販のPL/SQLの解説書等を参考にしてください。

この回答への補足

早速の回答ありがとうございますm(_ _)m
動的SQLですか…

資料をいくつか見てみたのですが、これなら出来そうな気がします。
しかし、実際にやろうとしてることがサンプルにありません(苦笑

もしご存じであれば教えてください。
よろしくお願いします。

補足日時:2002/12/10 16:20
    • good
    • 0
この回答へのお礼

動的SQLでなんとか解決する事が出来ました!

どうもありがとうございましたm(_ _)m

お礼日時:2002/12/11 10:12

しつれい!!!!しました!!!


PLでしたね。。。。

ごめんなさーい
SQL鯖と勘違い!!
    • good
    • 0
この回答へのお礼

何度もありがとうございます!
そうなんです。PLなんです(^。^;

なんとか無事に解決する事が出来ました。
また何かありましたらよろしくお願いします。

お礼日時:2002/12/11 10:11

下記の文章で、字足らずがありました


>(画面横のオブジェクトブラウザは、)
の部分ですが、、、
画面横のオブジェクトブラウザは、すぐに反映されていませんが、成功したなら登録ができています。情報の更新をすることにより、表示します。

と言いたかったのです。。。
でわでわ
    • good
    • 0

例.ローカルのpubsにテーブル1・テーブル2があり、ストアドをそのpubsデータべースに登録する方法



注意.SQL Server Enterprise Managerだけで行うこともできますが、ほとんどの人が開発はSQLクエリアナライザを使用していますので、そちらで登録する方法を載せます。


※1.SQL Server Enterprise Manager 起動

※2.ローカル(local)のpubsデータベースまでたどりつく

※3.[ツール]→[SQL クエリ アナライザ]を起動
そうするとローカルのpubsデータベースに最初から接続されたクエリアナライザが起動する。
直接スタートから起動すると、自分で接続先を指定する必要がある。
現在接続の変更は、画面上のプルダウンにて選択可能。
そこがpubsになっていたらOK

※4.#2で書いたサンプルを貼り付ける

※5.クリエイト文のコメントをはずす
--CREATE PROCEDURE TEST

CREATE PROCEDURE TEST

※6.F5を押す(実行)
エラーが出なければ、ストアド名:TESTが作成される。
(画面横のオブジェクトブラウザは、)
もう一度F5を押すと、エラーが出る。(オラで言うdropが必要)

※7.一度作成されたなら、クリエイト文は2度と使わない
その代わり編集を行うときは、ALTERの方を使用する。
SQL鯖はDROPしてCREATEではなく、既存の物に変更を行うようにする。
編集したら再度F5で実行することにより、ストアドは更新される。

※8.クエリアナライザの左上に、エクセルで言う新規作成ボタンみたいのがあるので、それを押す。
(新規クエリが開く)

※9.以下の命令を記載して実行
EXEC TEST 1
TESTというストアドにパラメータ「1」を渡して、実行を行うと言う意味
もしストアドで返しているリターン値を取得したいなら
DECLARE @IntRet INT
EXEC @IntRet = TEST 1
とすることで、変数IntRetにステータスをセットすることもできる。


ここら辺はSQLの教本を見てください。



もしエラーが起きるなら、※7を参考に修正してください。

クエリアナライザを閉じるとき「保存しますか?」と聞いてきますが、実行することにより、ストアドは更新されますので、特に保存する必要はないです。ただし、実行が成功していないストアドは更新されていませんので、ご注意を・・・
「その保存しますか?」がうっとうしく思える場合(私ですが・・・)、
[ツール][オプション][全般][ファイルを閉じるとき・・・]と言うチェックボックスがありますので、そちらを使用してください。
    • good
    • 0

>   1  注文数×単価


>   2  在庫数×単価

   1  注文数*単価
   2  在庫数*単価
にしてください。

 
 

--CREATE PROCEDURE TEST
--ALTER PROCEDURE TEST
(
@in計算式IDINT
)
AS

DECLARE @計算式VARCHAR(100)
DECLARE @ErrorSave int--ErrorCode
DECLARE @RowCnt int--RowCount
DECLARE @StrSQLNVARCHAR(3000)

--計算式を取得
SET @計算式 = (
SELECT計算式
FROMテーブル1
WHEREID = @in計算式ID)
SELECT @RowCnt = @@ROWCOUNT,@ErrorSave = @@ERROR

--データが取得できなかったり、エラーが発生したらエラー
IF (@RowCnt = 0) OR (@ErrorSave != 0) GOTO PGMERR
--式が読み取れなかったらエラー
IF (@計算式 IS NULL) GOTO PGMERR

SET @StrSQL = N'SELECT *,(' + @計算式 + ') ''' + @計算式 + ''''
SET @StrSQL = @StrSQL + N' FROM テーブル2'

EXEC SP_EXECUTESQL @StrSQL
SELECT @ErrorSave = @@ERROR
--エラーが発生したらエラー
IF (@ErrorSave != 0) GOTO PGMERR


PGMEND:
--成功はステータス1を返す
RETURN(1)
GOTO PGMEXIT
PGMERR:
--失敗はステータス-1を返す
RETURN(-1)
GOTO PGMEXIT
PGMEXIT:

この回答への補足

プログラムまで考えてくれてありがとうございますm(_ _)m

そこで、質問があるのですが…。
このプログラムは、プロシージャのところに書けばよいのでしょうか?
でも、プロシージャにはRETURNは使えないようなので、
FUNCTIONになるのでしょうか?
初歩的な質問で申し訳ありません。

オラクルは、テーブル・ビューしかさわった事のない初心者なので、
もしよろしければ、教えて頂けないでしょうか?

補足日時:2002/12/10 16:15
    • good
    • 0

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

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