Oracle ストアド プロシージャの基本構文の概要

黄舟
リリース: 2016-12-12 13:45:31
オリジナル
1508 人が閲覧しました

Oracleストアドプロシージャの基本構文 ストアドプロシージャ
1 CREATE OR REPLACE PROCEDURE ストアドプロシージャ名
2 IS
3 BEGIN
4 NULL

1行目:
作成または置換 PROCEDURE は、Oracle データベースにスケルトンと呼ばれるストアド プロシージャを作成し、存在する場合はそれを上書きするように指示する SQL ステートメントです。
ISキーワードは、PL/SQL本体が後に続くことを示します。
3行目:
BEGINキーワードはPL/SQL本体の始まりを示します。
4行目:
NULL PL/SQL ステートメントは、何もしないことを示します。PL/SQL 本体に少なくとも 1 つの文が必要であるため、この文は削除できません。
ENDキーワードはPL/SQL本体の終わりを示します
ストアドプロシージャ作成構文:
プロシージャの作成または置換 ストアド プロシージャ名 (param1 in 型、param2 out 型)
変数 1 の型 (値の範囲) --vs_msg; VARCHAR2(4000);
変数 2 型 (値の範囲);

Begin Select count(*) into 变量1 from 表A where列名=param1; If (判断条件) then Select 列名 into 变量2 from 表A where列名=param1; Dbms_output。Put_line(‘打印信息'); Elsif (判断条件) then Dbms_output。Put_line(‘打印信息'); Else Raise 异常名(NO_DATA_FOUND); End if; Exception When others then Rollback; End;
ログイン後にコピー

注:
1. ストアド プロシージャのパラメーターには値の範囲がありません。in は受信を意味し、out は出力を意味します。タイプ。
2、 変数には値の範囲があり、その後にセミコロンが続きます

3. ステートメントを判断する前に、count(*) 関数を使用して操作レコードが存在するかどうかを判断することをお勧めします

4。 。 。 。の中へ。 。 。変数に値を代入します
5、raise + 例外名を使用してコード内で例外をスローします

CREATE OR REPLACE PROCEDURE存储过程名 ( --定义参数 is_ym IN CHAR(6) , the_count OUT NUMBER, ) AS --定义变量 vs_msg VARCHAR2(4000); --错误信息变量 vs_ym_beg CHAR(6); --起始月份 vs_ym_end CHAR(6); --终止月份 vs_ym_sn_beg CHAR(6); --同期起始月份 vs_ym_sn_end CHAR(6); --同期终止月份 --定义游标(简单的说就是一个可以遍历的结果集) CURSOR cur_1 IS SELECT 。。。 FROM 。。。 WHERE 。。。 GROUP BY 。。。; BEGIN --用输入参数给变量赋初值,用到了Oralce的SUBSTR TO_CHAR ADD_MONTHS TO_DATE 等很常用的函数。 vs_ym_beg := SUBSTR(is_ym,1,6); vs_ym_end := SUBSTR(is_ym,7,6); vs_ym_sn_beg := TO_CHAR(ADD_MONTHS(TO_DATE(vs_ym_beg,'yyyymm'), -12),'yyyymm'); vs_ym_sn_end := TO_CHAR(ADD_MONTHS(TO_DATE(vs_ym_end,'yyyymm'), -12),'yyyymm'); --先删除表中特定条件的数据。 DELETE FROM 表名 WHERE ym = is_ym; --然后用内置的DBMS_OUTPUT对象的put_line方法打印出影响的记录行数,其中用到一个系统变量SQL%rowcount DBMS_OUTPUT.put_line('del上月记录='||SQL%rowcount||'条'); INSERT INTO表名(area_code,ym,CMCODE,rmb_amt,usd_amt) SELECT area_code,is_ym,CMCODE,SUM(rmb_amt)/10000,SUM(usd_amt)/10000 FROM BGD_AREA_CM_M_BASE_T WHERE ym >= vs_ym_beg AND ym <= vs_ym_end GROUP BY area_code,CMCODE; DBMS_OUTPUT.put_line('ins当月记录='||SQL%rowcount||'条'); --遍历游标处理后更新到表。遍历游标有几种方法,用for语句是其中比较直观的一种。 FOR rec IN cur_1 LOOP UPDATE 表名 SET rmb_amt_sn = rec.rmb_amt_sn,usd_amt_sn = rec.usd_amt_sn WHERE area_code = rec.area_code AND CMCODE = rec.CMCODE AND ym = is_ym; END LOOP; COMMIT; --错误处理部分。OTHERS表示除了声明外的任意错误。SQLERRM是系统内置变量保存了当前错误的详细信息。 EXCEPTION WHEN OTHERS THEN vs_msg := 'ERROR IN xxxxxxxxxxx_p('||is_ym||'):'||SUBSTR(SQLERRM,1,500); ROLLBACK; --把当前错误记录进日志表。 INSERT INTO LOG_INFO(proc_name,error_info,op_date) VALUES('xxxxxxxxxxx_p',vs_msg,SYSDATE); COMMIT; RETURN; END;
ログイン後にコピー

oracle ストアド プロシージャの構文
1、判定ステートメント:
if 比較 then begin end if; for ループ
For.. in ... LOOP

-- ステートメントを実行

end LOOP;
(1) カーソルをループします

create or replace procedure test(x in number) is begin if x >0 then begin x := 0 - x; end; end if; if x = 0 then begin x: = 1; end; end if; end test;
ログイン後にコピー

(2) 配列をループします

create or replace procedure test() as Cursor cursor is select name from student; name varchar(20); begin for name in cursor LOOP begin dbms_output.putline(name); end; end LOOP; end test;
ログイン後にコピー

3 、 While ループ
while 条件文 LOOP
create or replace procedure test(varArray in myPackage.TestArray) as --( 输入参数varArray 是自定义的数组类型,定义方式见标题6) i number; begin i := 1; -- 存储过程数组是起始位置是从1 开始的,与java 、C 、C++ 等语言不同。因为在Oracle 中本是没有数组的概念的,数组其实就是一张 -- 表(Table), 每个数组元素就是表中的一个记录,所以遍历数组时就相当于从表中的第一条记录开始遍历 for i in 1..varArray.count LOOP dbms_output.putline('The No.'|| i || 'record in varArray is:'||varArray(i)); end LOOP; end test;
ログイン後にコピー

4 、配列

まず、概念を明確にしましょう。配列という概念がありますが、配列は実際にはテーブル(Table)です。 配列の各要素はテーブル内のレコードです。

配列を使用する場合、ユーザーは Oracle によってすでに定義されている配列型を使用することも、独自のニーズに応じて配列型を定義することもできます。

(1) Oracle 独自の配列タイプ

x 配列を使用します。 --
を使用する場合は初期化が必要です。例:

create または replace プロシージャ test(y out array) は

x array;
begin
x := new array();
y := x;
テスト終了
(2) カスタム配列タイプ ( データ型をカスタマイズするときは、管理を容易にするためにパッケージを作成することをお勧めします)
パッケージ myPackage を作成または置換します
パブリック型宣言の型情報は Record( name varchar(20), y number);
型 TestArray は binary_integer による情報インデックスのテーブルです
-- ここでは TestArray 型のデータが宣言されていますが、実際にはこれは Info データ型を格納する単なるテーブルであり、TestArray は 2 つのフィールド (1 つは名前) を持つテーブルです。 、1人はyです。ここで binary_integer による Index を使用して Table のインデックス項目をコンパイルすることに注意してください。これを記述せずに、type として直接記述することもできます。 TestArray は
情報のテーブルです。これを記述しない場合は、配列 varArray を使用するときに初期化する必要があります。 myPackage.TestArray; varArray := new myPackage.TestArray();
5. Oracle でのカーソル Cursor の使用 一時テーブル内のクエリ結果を反復処理する場合に非常に便利です。関連するメソッドやプロパティも多数ありますので、一般的な使用方法のみを紹介します。
(1) カーソル型カーソル (パラメータ転送には使用できません)

begin end; end LOOP; E.g create or replace procedure test(i in number) as begin while i < 10 LOOP begin i:= i + 1; end; end LOOP; end test;
ログイン後にコピー


上記の使用方法を説明するために、以下に簡単な例を書きます。アプリケーションを作成するためのストアド プロシージャ:
ここで、2 つのテーブルがあり、1 つは学生のパフォーマンス テーブル (スタッドネット) であると仮定します。 、フィールドは次のとおりです: stdId、数学、記事、言語、音楽、スポーツ、合計、平均、ステップ
1 つは生徒の課外パフォーマンス テーブル (out_school)、フィールドは次のとおりです: stdId、parctice、comment
各生徒の合計スコアと平均スコアはストアド プロシージャによって自動的に計算されます。同時に、生徒が課外授業で A を獲得した場合は、合計スコアに 20 点が追加されます。
りー

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のおすすめ
    人気のチュートリアル
    詳細>
    最新のダウンロード
    詳細>
    ウェブエフェクト
    公式サイト
    サイト素材
    フロントエンドテンプレート
    私たちについて 免責事項 Sitemap
    PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!