• ベストアンサー

ストアドプロシージャ

以下のような事が行いたいのですが、うまくいきません。  <テーブル1>   id  計算式    1  注文数×単価    2  在庫数×単価  <テーブル2>    No. 注文数 在庫数 単価    A   50   20  500    B   70   85  860 ここで、テーブル1より計算式を検索し、 その計算式をもとにテーブル2のデータを計算したいのです。 ストアドプロシージャ等を使用すれば出来るのかとおもったのですが、 どうしてもうまくいきません。 このようなことはできないのでしょうか? 開発環境  ORACLE 8.1.7

質問者が選んだベストアンサー

  • ベストアンサー
  • LOVEPOME
  • ベストアンサー率42% (14/33)
回答No.1

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

mybigbaby
質問者

お礼

動的SQLでなんとか解決する事が出来ました! どうもありがとうございましたm(_ _)m

mybigbaby
質問者

補足

早速の回答ありがとうございますm(_ _)m 動的SQLですか… 資料をいくつか見てみたのですが、これなら出来そうな気がします。 しかし、実際にやろうとしてることがサンプルにありません(苦笑 もしご存じであれば教えてください。 よろしくお願いします。

その他の回答 (4)

  • TAGOSAKU7
  • ベストアンサー率65% (276/422)
回答No.5

しつれい!!!!しました!!! PLでしたね。。。。 ごめんなさーい SQL鯖と勘違い!!

mybigbaby
質問者

お礼

何度もありがとうございます! そうなんです。PLなんです(^。^; なんとか無事に解決する事が出来ました。 また何かありましたらよろしくお願いします。

  • TAGOSAKU7
  • ベストアンサー率65% (276/422)
回答No.4

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

  • TAGOSAKU7
  • ベストアンサー率65% (276/422)
回答No.3

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

  • TAGOSAKU7
  • ベストアンサー率65% (276/422)
回答No.2

>   1  注文数×単価 >   2  在庫数×単価 を    1  注文数*単価    2  在庫数*単価 にしてください。     --CREATE PROCEDURE TEST --ALTER PROCEDURE TEST ( @in計算式ID INT ) AS DECLARE @計算式 VARCHAR(100) DECLARE @ErrorSave int --ErrorCode DECLARE @RowCnt int --RowCount DECLARE @StrSQL NVARCHAR(3000) --計算式を取得 SET @計算式 = ( SELECT 計算式 FROM テーブル1 WHERE ID = @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:

mybigbaby
質問者

補足

プログラムまで考えてくれてありがとうございますm(_ _)m そこで、質問があるのですが…。 このプログラムは、プロシージャのところに書けばよいのでしょうか? でも、プロシージャにはRETURNは使えないようなので、 FUNCTIONになるのでしょうか? 初歩的な質問で申し訳ありません。 オラクルは、テーブル・ビューしかさわった事のない初心者なので、 もしよろしければ、教えて頂けないでしょうか?

関連するQ&A