- ベストアンサー
ストアドプロシージャ
以下のような事が行いたいのですが、うまくいきません。 <テーブル1> id 計算式 1 注文数×単価 2 在庫数×単価 <テーブル2> No. 注文数 在庫数 単価 A 50 20 500 B 70 85 860 ここで、テーブル1より計算式を検索し、 その計算式をもとにテーブル2のデータを計算したいのです。 ストアドプロシージャ等を使用すれば出来るのかとおもったのですが、 どうしてもうまくいきません。 このようなことはできないのでしょうか? 開発環境 ORACLE 8.1.7
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
動的SQLを使えば可能だと思いますよ。 選択した計算式の列名と演算子を使って、SQL文を動的に生成して実行すればいいと思います。 動的SQLの使用方法は、Oracleのマニュアルや市販のPL/SQLの解説書等を参考にしてください。
その他の回答 (4)
- TAGOSAKU7
- ベストアンサー率65% (276/422)
しつれい!!!!しました!!! PLでしたね。。。。 ごめんなさーい SQL鯖と勘違い!!
お礼
何度もありがとうございます! そうなんです。PLなんです(^。^; なんとか無事に解決する事が出来ました。 また何かありましたらよろしくお願いします。
- TAGOSAKU7
- ベストアンサー率65% (276/422)
下記の文章で、字足らずがありました >(画面横のオブジェクトブラウザは、) の部分ですが、、、 画面横のオブジェクトブラウザは、すぐに反映されていませんが、成功したなら登録ができています。情報の更新をすることにより、表示します。 と言いたかったのです。。。 でわでわ
- TAGOSAKU7
- ベストアンサー率65% (276/422)
例.ローカルの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)
> 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:
補足
プログラムまで考えてくれてありがとうございますm(_ _)m そこで、質問があるのですが…。 このプログラムは、プロシージャのところに書けばよいのでしょうか? でも、プロシージャにはRETURNは使えないようなので、 FUNCTIONになるのでしょうか? 初歩的な質問で申し訳ありません。 オラクルは、テーブル・ビューしかさわった事のない初心者なので、 もしよろしければ、教えて頂けないでしょうか?
お礼
動的SQLでなんとか解決する事が出来ました! どうもありがとうございましたm(_ _)m
補足
早速の回答ありがとうございますm(_ _)m 動的SQLですか… 資料をいくつか見てみたのですが、これなら出来そうな気がします。 しかし、実際にやろうとしてることがサンプルにありません(苦笑 もしご存じであれば教えてください。 よろしくお願いします。