• ベストアンサー

PL/SQLでのSQL文法

mori0309の回答

  • ベストアンサー
  • mori0309
  • ベストアンサー率32% (12/37)
回答No.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; ./ 先頭のピリオドは無視してください。どこかにミスがあったらごめんなさい。

laa_laa_ts
質問者

お礼

回答ありがとうございます。 ご丁寧にコードでの解説、すごくわかりやすかったです。 実際mori0309さんのコーディングを参考に実行してみたら 値を取得することができました。 今回の業務はこれで事足りるのですが、これからも使うことがあると思うので ちゃんと理解するよう勉強したいと思います。大変参考になりました。 どうもありがとうございました。

関連するQ&A

  • 【PL/SQL】SQL文が長すぎてSELECTできない

    oracle9iのpl/sqlでSELECT文を発行し 取得したカーソルを返す処理をしています。 where句が動的になる為 実行するSQL文が長くなり ORA-06502: PL/SQL: 数値または値のエラー: 文字列バッファが小さすぎます。が発生しました のエラーが発生します。 そこで、SQL文の部分をCLOB型にしたり SQL文を「||」でつなげたり してみましたが、どちらもエラーになりました。 長すぎるSQL文を実行するには どうしたらよいでしょうか? 以下ソースです。(左側の数字は行数です) ----------------------------------- 1 PROCEDURE テスト(O_カーソル IN OUT 情報カーソル) IS 2 TYPE curType IS REF CURSOR; 3 tmpCur curType; 4 sqlStr VARCHAR2(32767); 5 6 7 BEGIN 8 9 sqlStr := 'SELECT ' 10 sqlStr := sqlStr || 'A,B ' 11 sqlStr := sqlStr || 'FROM' <<省略>> 12 OPEN tmpCur FOR sqlStr ←エラー発生 13 O_カーソル := tmpCur; --取得したカーソルを返す 14 END テスト; ----------------------------------- (1)SQL文をCLOB型にしてみる:コンパイルエラー 4 sqlStr CLOB (2)SQL文を「||」でつなげてみる:文字列バッファが小さすぎますでエラー Dim sqlStr1 VARCHAR2(32767); Dim sqlStr2 VARCHAR2(32767); Dim sqlStr3 VARCHAR2(32767); <<省略>> 12 OPEN tmpCur FOR (sqlStr1      || sqlStr2      || sqlStr3 <<省略>> )

  • PL/SQLの文法

    oracle8,windows95を使用しています。 PL/SQLで、シーケンスを削除して再度作成するという処理を書きたいのですが、PL/SQLはまったくの素人のためアドバイスをいただけたら、と思います。 実行したいのは、以下のSQL文です。 1) SQL>DROP SEQUENCE SQC_TEST 2) SQL>CREATE SEQUENCE SQC_TEST INCREMENT BY 1 START WITH 1 MAXVALUE 9999 MINVALUE 1 CYCLE; これを、PL/SQLで実行するにはどうかけばよいでしょうか? CREATE OR REPLACE PROCEDURE HC_CREATE_SEQ BEGIN DROP SEQUENCE SEQ_車両申請 FROM DUAL; CREATE SEQUENCE SQC_TEST INCREMENT BY 1 START WITH 1 MAXVALUE 9999 MINVALUE 1 CYCLE; END; / と書いてみましたがコンパイルに失敗しましたとおこられてしまいます。 ヒントだけでもいただけたら、と思います。 よろしくお願いいたします。

  • PL/SQLでカーソルを指定する方法

    以下のSQL文で、 あるストアドプロシージャを作成し、その引数の値を WHERE句の検索条件に取ってカーソルを宣言したいので すが、どうやってもエラーが出ます。結果として カーソルで格納したデータを呼び出し元に返したいの ですが…。下記の文は間違ってますか? CREATE OR REPLACE PROCEDURE ss( quote IN NUMBER result OUT CHAR ) IS CURSOR cur IS SELECT empname FROM emp WHERE empno = quote; result cur%rowtype; BEGIN OPEN cur; LOOP FETCH cur INTO result; ~ END; どうかよろしくお願いします。

  • 【PL/SQL】IF文( EXIT WHEN )でプロシージャの実行結果から判断させたい

    Oracleで動くPL/SQLを作成してます。 プロシージャの実行結果をIF文に入れて、 実行結果からさらに処理を走らせたいのですが エラーが出てしまいます。 例) CREATE PROCEDURE TEST1(id NUMBER) BEGIN select NAME from TBLA where DID = id and ROWNUM <= 1; END; CREATE PROCEDURE TEST2(id NUMBER) BEGIN LOOP EXIT WHEN ( TEST1(id) is not null );☆ここがうまくいかない。 id := id + 1; END LOOP; END; TEST2のCreate時にTEST1は関数として存在しないというエラーメッセージが表示されます。 IF(EXIT WHEN)文中からはずして TEST1(id)のみの実行では、エラーが起きず IF文に入れるとエラーが起きるところまでは分かりました。 例はかなり簡略しているのですが、 どうしたらうまく動くのか分かる方がいれば 教えてもらいたいです。

  • PL/SQL ストアドプロシージャが実行できません

    はじめまして、ほんの最近プログラムの世界に入ったキグと申します。 2週間、インターネットや参考書(ポケットリファレンス、PL/SQL入門)などで調べていたのですが分かりませんでしたので質問させていただきます。 ORACLE11gパーソナルエディションでやっています。 (CSEで作成実行しました。) **************************** 作ったSQL文 CREATE OR REPLACE PROCEDURE PRO_1 IS BEGIN (実行確認できたSELECT文) END ※試してみたこと、 SELECT文の列指定はアスタを使わずに書きました。 AUTHID CURRENT_USERをプロシージャ作成のときに入れてみました。  **************************** EXEC PRO_1 エラー→構文エラーまたはアクセス違反です。 BEGIN PRO_1; END; エラー→オブジェクト'PRO_1'が無効です。 上記エラーが出まして実行できていない状態です。 解決方法が分かる方いらっしゃいましたら、ぜひ回答を お願いしたいです。 以上よろしくお願い申し上げます。

  • PL/SQLのエラー処理について

    PL/SQLを勉強し始めたのですが、テーブルを作成してから、データを流し込むという処理をしたいのですが、テーブルの作成に失敗しらたら、処理を終了させるという処理はできないのでしょうか? それとも、考え方が違うのでしょうか?アドバイスお願いします。 次のようにPL/SQLを作成しています。 例) declare curHandle1 INTEGER; begin curHandle1 := DBMS_SQL.OPEN_CURSOR; DBMS_SQL.PARSE(curHandle1, 'create table xxx as select * from xxx where ID=-1', DBMS_SQL.V7); DBMS_SQL.CLOSE_CURSOR(curHandle1); exception when OTHERS then エラーになったら、処理終了したい(次のブロックにいきたくない) end; declare begin      insert into xxx NOLOGGING values (1,'test'); end; よろしくお願いします。

  • PL/SQLの基礎的な質問ですが・・

    こんばんわ! PL/SQLの超初心者なのですが、以下ように「aaa」という変数に一つ目のselect文の結果を代入して、二つ目のselect文のテーブルにその名前を当てはめたいだけなのです。 DECLAER aaa VARCHAR2(30) BEGIN select max(TABLE_NAME) into aaa from ALL_TABLES Like '***'; select * from aaa END; ところが、結果は「表またはビューが存在しません」となります。 このような使い方はできないのでしょうか? どなたかご教示いただけませんでしょうか?宜しくお願いします。

  • PL/SQLのエラーについて

    こんばんは。PL/SQLのエラーについて質問させて頂きます。 現在、Oracle8.1.7のデータベースを使用したオラクルのE-business Suiteという人事系システムで開発をしています。 そこで、SQL*Plusを使用してPL/SQLのパッケージをコンパイルしたところ、パッケージ仕様部も本体部もコンパイルのエラーは出なかったのですが、E-business SuiteにPL/SQLを設定し、動作させようとしたら、下記のようなエラーが発生しました。 -------------------------------------------------------------------- FDPSTP 内のOracleエラー 6550 原因: ORA-06550: 行 1、列 7: PLS-00221: 'ZT_TYOUHYOU_HENSEI_PKG'がプロシージャではないか、または未定義です。 ORA-06550: 行 1、列 7: PL/SQL: Statement ignored が原因で FDPSTP に失敗しました。 --------------------------------------------------------------------- また、作成したPL/SQLパッケージの仕様部は下記のとおりです。 -------------------------------------------------------------------- CREATE OR REPLACE PACKAGE APPS.ZT_TYOUHYOU_HENSEI_PKG AS FUNCTION get_henseihyo_kbn (i_grade IN VARCHAR2,o_hensei_kbn OUT VARCHAR2) RETURN NUMBER; <・・・・・中間部分は省略・・・・・> PROCEDURE main_shori (p_process_date IN VARCHAR2, p_location IN VARCHAR2); END ZT_TYOUHYOU_HENSEI_PKG; -------------------------------------------------------------------- 原因だと思われる心当たりの部分も探してみたのですが、このエラーの意味は何なのか、原因はどこにあるのか分かりません。 どなたかお判りの方、御回答よろしくお願い致します。

  • テーブル名が可変の動的SQLをファンクションにしたい

    Oracle9iのWindowsXP環境です。 以下のようなPL/SQLを作成しましたが、同じようなselect文の繰り返しなので整理したいのと、レスポンスが悪いのでファンクションにしたいのですが、テーブル名が可変のため上手くいきません。「Table&1」は置換変数で、batファイルからパラメータが渡り、「Table200812」のように変更されます。 【***.bat】 set /p phara sqlplus -s ***/***@*** ***.sql %phara% 【***.sql】 省略 begin select aaa into a1 from Table&1 where code = 'AAAAA'; ・・ select aaa into a2 from Table&1 where code = 'BBBBB'; ・・ select aaa into a3 from Table&1 where code = 'CCCCC'; ・・ 省略 end; / 以下、試しに作成しようとしたファンクションですが、やはり予想どおりですが「表がありません」とコンパイルエラーになります。 create function Func_test(code IN varchar2, Table1 IN varchar2) return number is ret number; begin select aaa into ret from Table1 where code = 'code'; return ret; end; / ※コール側は、「a1 = Func_Test('AAAAA', Table&1);」 そもそもこれが実現できたとしてレスポンスが上がるものなのでしょうか?どちらにせよコードを整理する意味でもファンクションにはしたいのですが。。 宜しくお願い致します。

  • PL/SQL

    PL/SQL(Oralce)で、NVARCHAR2の変数を宣言した場合、その変数への代入方法を教えてください。 Hensu NVARCHAR2; と宣言し、 Hensu := N'テスト'; とした場合、コンパイルエラーとなりませんが、 Hensu  NVARCHAR2; Hsensu1 VARCHAR2; と宣言し、 Hensu := N || Hsensu1; とした場合、”識別子Nを宣言してください。”旨のコンパイルエラーが出力されていしまいます。 OracleはR8.1.7です。 よろしくお願いします。