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;
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;
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;
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;
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;
配列を使用する場合、ユーザーは Oracle によってすでに定義されている配列型を使用することも、独自のニーズに応じて配列型を定義することもできます。
(1) Oracle 独自の配列タイプx 配列を使用します。 --
を使用する場合は初期化が必要です。例:
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;