ホームページ > 类库下载 > PHP类库 > Oracle ストアド プロシージャの基本構文の概要

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

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

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(&#39;ins当月记录=&#39;||SQL%rowcount||&#39;条&#39;); 
--遍历游标处理后更新到表。遍历游标有几种方法,用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 := &#39;ERROR IN xxxxxxxxxxx_p(&#39;||is_ym||&#39;):&#39;||SUBSTR(SQLERRM,1,500); 

ROLLBACK; 

--把当前错误记录进日志表。 

INSERT INTO LOG_INFO(proc_name,error_info,op_date) 
VALUES(&#39;xxxxxxxxxxx_p&#39;,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(&#39;The No.&#39;|| i || &#39;record in varArray is:&#39;||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 までご連絡ください。
最新の問題
人気のおすすめ
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート