- ベストアンサー
PL/SQLでのSQL文法
こんにちは。教えてください。 PL/SQLを使うのが初めで戸惑っています。 まず、PROCEDUREで =========================== BEGIN SELECT NAME FROM TABLE1 WHERE NAME='tanaka'; END; / =========================== このように書いて実行させようとすると、「コンパイルエラー」 「INTO句はこのSELECT文に入ります」というエラーが出ます。 SQLの文法的には間違ってないと思うのですが、INTO句とはこれいかに?? ネットでPL/SQLで検索かけて調べたのですがあまりにも初歩すぎて わかりませんでした。 PL/SQLやORACLEのメーリングリストでお勧めがありましたら教えてください。 よろしくお願いいたします。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
コーディング例です。 ************************************************** * 非ループ処理の例 ************************************************** .CREATE OR REPLACE PROCEDURE JOB1 .IS . . w_NAME1 CHAR(10); . .BEGIN . . SELECT NAME1 INTO w_NAME1 FROM TABLE1 . WHERE TBL1_KEY = 'tanaka'; . . UPDATE TABLE2 SET NAME2 = w_NAME1 . WHERE TBL2_KEY = 'tanaka'; . . COMMIT; . .EXCEPTION . WHEN OTHERS THEN . ROLLBACK; .END; ./ ************************************************** * ループ処理の例 ************************************************** .CREATE OR REPLACE PROCEDURE JOB2 .IS . . w_TABLE1 TABLE1%ROWTYPE; . . CURSOR c_TABLE1 IS . SELECT NAME1 . FROM TABLE1 . ORDER BY NAME1; . .BEGIN . . OPEN c_TABLE1; . . LOOP . FETCH . c_TABLE1 . INTO . w_TABLE1; . EXIT WHEN c_TABLE1%NOTFOUND; . . UPDATE TABLE2 SET NAME2 = w_TABLE1.w_NAME1 . WHERE TBL2_KEY = w_TABLE1.w_TBL1_KEY; . . END LOOP; . . CLOSE c_TABLE1; . . COMMIT; . .EXCEPTION . WHEN OTHERS THEN . ROLLBACK; .END; ./ 先頭のピリオドは無視してください。どこかにミスがあったらごめんなさい。
その他の回答 (3)
こんにちは、jotarou といいます。 コーディングは、ishmaster さんので良いと思います。 >ネットでPL/SQLで検索かけて調べたのですがあまりにも初歩すぎてわかりませんでした。 これに関しては、”暗黙カーソル”と入れてお調べください。 >SQLServerで使っていたSQLでは通用しないのでしようか・・・。 難しいとは聞いているのですが、全くの初心者でないのでしたら、通用する部分があると思いますけど・・・。 では・・。
お礼
回答ありがとうございます。 教えていただいたとおり、暗黙カーソルでたくさんヒットしました。 まず、カーソルとはなんぞや、から勉強しないといけません。 一冊本を買ってじっくり取り組もうと思います。 みなさんに教えていただいたこと大変勉強になりました。 また質問することもあると思いますがよろしくお願い致します。
- msystem
- ベストアンサー率42% (79/186)
PL/SQLでSelect文を使うときには、カーソルなり変数(ishmasterさんの言っている領域)に代入する必要があります。でないと、Select文で引っ張ってきたデータを使うことができません。 変数・カーソルへの代入というと構文が少し変なのですが、ishmasterさんの構文でデータベースからデーターを持ってこれると思ってください。 PL/SQLは、Select文は普通のSQLと少し違いますが、INSERT、DELETE、UPDATEはほとんど普通に使えます。ただし、CREATE、DROPなどは原則として使えません。(方法はありますが・・・)
お礼
回答ありがとうございます。 私はVBやAccessのように単純なSQLをぽんぽんと並べれば 実行してくれるのかと勘違いしていました。 そうではないんですね。 少し勉強しないとだめみたいです。 みなさんに教えていただいたことを頭にいれてがんばりたいと思います。 ありがとうございました。
- ishmaster
- ベストアンサー率40% (135/330)
SELECT NAME INTO work FROM TABLE1 WHERE NAME='tanaka'; じゃないでしょうかねえ。 INTOで読み込まれる領域を指定するんではないかと。 PL/SQLは知りませんが。
お礼
回答ありがとうございました。 せっかく教えていただいたので理解力不足ですみませんでした。 みなさんの回答を参考に、しっかり勉強致します。 ありがとうございました。
補足
さっそくの解答ありがとうございます。 領域ですか。 領域とは・・・・・・・???? 環境を書き忘れていました。 WinNT4.0(SR6) Oracle8 ObjectBrowser7.0 です。 OracleもObjectBrowserも使うのが初めてで右も左もわからない状態です。SQLServerで使っていたSQLでは通用しないのでしようか・・・。
お礼
回答ありがとうございます。 ご丁寧にコードでの解説、すごくわかりやすかったです。 実際mori0309さんのコーディングを参考に実行してみたら 値を取得することができました。 今回の業務はこれで事足りるのですが、これからも使うことがあると思うので ちゃんと理解するよう勉強したいと思います。大変参考になりました。 どうもありがとうございました。