基本的な構文Oracleのストアドプロシージャ
プロシージャするProc1(CREATE OR REPLACE
p_para1 VARCHAR2、
p_para2 OUT VARCHAR2、
OUT VARCHAR2でp_para3
)AS
v_name VARCHAR2(20)と、
開始
v_nameを:= 'カイマスター';
p_para3:= v_name;
DBMS_OUTPUT.PUT_LINE(「p_para3 :「|| p_para3);
エンド;
注意:ステートメントを作成:作成またはプロシージャ、ストアドプロシージャ名を置き換え、または記載がない場合は交換、そしてちょうどストアドプロシージャを作成します。ストアドプロシージャが存在する場合、エラーが報告されています。オリジナルの削除、再作成し、ストアドプロシージャを置くために、このシステムストアドプロシージャがある場合、システムは、新しいものを作成するには、このストアドプロシージャを持っていない場合の手順を作成するか、または交換してください。
ストアドプロシージャ名が定義されます。ストアドプロシージャ名とパラメータリストを含みます。パラメータ名とパラメータのタイプ。IN、OUT、OUT、IN:パラメータ名はパラメータ渡しモードは、繰り返すことはできません
INは値方式によって渡された入力パラメータを表します。
基準転送モードによって理解されるようにOUTは、出力パラメータを表します。出力は、外部の発信者が使用するストアドプロシージャとして使用することができます。
入力パラメータ可能OUTには、出力パラメータを使用することができます。
データ型パラメータは、タイプ名を指定する必要があり、幅を指定する必要はありません。
幅パラメータは、外部の発信者によって決定されます。
プロセスパラメータは、引数になることはできません
変数宣言ブロック:として(である)キーワードに続く、キーワードは、変数を宣言するための宣言PL / SQLのように理解することができます。
変数宣言ブロックは、変数を宣言するために使用されるストアドプロシージャのストアドプロシージャ、その範囲を使用する必要があります。また、ここでの変数宣言は、幅を指定する必要があります。変数は、PL / SQL文の規範に従ってください。
プロセスステートメントブロック:キーワード文ブロックプロセスに最初から始めます。詳細な論理ストレージ手順がここに実現しました。
例外処理ブロック:キーワードの例外は、例外は、ステートメントを処理することによって生成されます。この部分はオプションで
エンドブロック:端からキーワードの結果。
例:
SP_NAME手順を交換するか作成(
-コンマで区切られたパラメータは、パラメータリスト、。
VARCHAR2にUIDを、 -長さ情報とすることができない
日付に開始日、 -第二の入力パラメータ
VARCHAR2デフォルトでdefaultVarを「」、 -デフォルトパラメータ合格しない場合は、パラメータの順序が留意されるべき
、番号をISOK -出力パラメータが
第二の出力パラメータ- VARCHAR2アウト結果
)
AS
-変数宣言、ステートメントセミコロンで各端部を、ステートメントはまた、初期化してもよい
VAR1をVARCHAR2(11);
var2の数(2)= 123。
開始
-文字列連結で||
DBMS_OUTPUT.PUT_LINE( 'ISOK:' || 'ABC');
-他のストアドプロシージャ呼び出し
sub_sp_name(PARAM1、prarm2、outParam1、 outParam2)。
エンド; -ストアドプロシージャが終了
---------------------
--1。定義ステートメントブロック
DECLARE -変数を宣言 ; - VAR1数(2)のみを宣言 = ':var2ではchar(2) - ; var2の'をしながら、初期化ステートメントを 開始 -文は END; - Endステートメントブロックを
--2。if文
もし= 1、B = 2、次いで その後3 = C ELSIF そう ならば終了。
--- 3。ケースの文分岐制御
意志出力対応する情報;()メソッドの出力、この従来DOSで上SERVEROUTPUTセットを入力する必要があるDBMS_OUTPUT.PUT_LINE
DECLARE NUM番号(10):=を11、 開始 ケースを すると、その後DBMS_OUTPUT.PUT_LINE NUM = 10( 'I 10'); 場合は、その後NUM = DBMS_OUTPUT.PUT_LINE 11( 'I. 11'); 他のDBMS_OUTPUT.PUT_LINE( '私は私が誰か分からない'); エンドケースを、 ケースNUMの ときにDBMS_OUTPUT.PUT_LINE 0('私は10です'); ときにDBMS_OUTPUT.PUT_LINE 1(' I ')は、11よ 、他のDBMS_OUTPUT.PUT_LINE(' I I)は、」私が誰かわからない、 エンドケース; 終了;
--4。Forループ
--forサイクルは、2つの主な用途を有しています。
--4.1、循環の範囲 DECLARE I番号(2) 開始 にI 9 .. 0ループ。 DBMS_OUTPUT.PUT_LINE( 'I' || I); エンドループ; END; - 4.2、暗黙カーソルが横断 - -利点暗黙カーソルを容易にするために、手動で閉じる必要がない BEGIN FOR再IN(SELECTのUserInfo FROM名)LOOP ; DBMS_OUTPUT.PUT_LINE(re.username) のEND LOOP; END;
第二に、次のストアドプロシージャを使用しました:
私は、テーブルのuserinfoを作成するためにここにいます、
-テーブルを作成します。创建表 テーブルuserinfoを作成します ( IDのVARCHAR2(32)NOT NULL、 ユーザ名VARCHAR2(20)、 パスワードVARCHAR2(20)、 セックスVARCHAR2(2)、 SALの数(20)、 insertdate日付のデフォルトのSYSDATEを ) 。 -列にコメントを追加 コラムuserinfo.idにコメント 「ID」です。 コラムuserinfo.usernameにコメントは 「用户の名」です。 コラムuserinfo.passwordにコメントが ある「密码」; コラムuserinfo.sexにコメントが ある「性别」; コラムuserinfo.salにコメントが ある「工资」; コラムuserinfo.insertdateにコメントは 「插入时间」です。
2.1ストアドプロシージャを作成し、データの呼び出しを挿入
OR REPLACE CREATE -ストアドプロシージャを作成し、更新した場合、データの挿入が存在しません作成 手順proc_test(VARCHARでE_ID、 VARCHARでe_username、 VARCHARでe_password、 VARCHARでe_sex、 数e_sal) -引数を長さを定義、またはエラーがない IS 開始 INSERT INTOのUserInfo (ID、ユーザ名、パスワード、性別、SAL) 値 (E_ID、e_username、e_password、e_sex、e_sal); END; -コール1。 DECLAREの ID VARCHAR(32)、 ユーザ名VARCHAR(20)と、 パスワードVARCHAR(20)と、 セックスVARCHAR(2); SAL番号(20です)。 BEGIN ID:= 'asdfasdfa'; ユーザ名:= 'text11'; パスワード:= 'PAS'; 性別:= 'M'; SAL:= 2000; proc_test(E_ID => ID、 e_username =>ユーザ名、 e_password =>パスワード、 = e_sex>セックス、 e_sal => SAL); COMMIT; END; のUserInfoからSELECT *; -データが正常に挿入された参照
---调用2 始める proc_test(E_ID => 'DD'、e_username => 'A'、e_password => 'AA'、e_sex => 'D'、=、> 1000 e_sal)。 コミット; 終わり; -调用3 コールproc_test(E_ID => 'DD'、e_username => 'A'、e_password => 'AA'、e_sex => 'D'、e_sal => 1000)。 コミット;
通話中のjava:
パブリック静的ボイド挿入()はClassNotFoundExceptionが、のSQLException {スロー ":オラクル:JDBCシン:@localhost:1521:ORCL"文字列のURLを=。 文字列名= "user2が"; 文字列のPWD = "user2が"; 文字列DRIVERNAME = "oracle.jdbc.driver.OracleDriverと"; Class.forNameの(DRIVERNAME)。 接続の接続=したDriverManager.getConnection(urlには、名前、PWD)。 CallableStatementの呼=接続 .prepareCall( "呼び出しPROc_TEST(E_ID => 'DD'、e_username => 'A'、e_password => 'AA'、e_sex => 'D'、=> 1000 e_sal)")。 //执行存储过程 ブールB = call.execute()。 (B =真){場合 のSystem.out.println( "!成功插入"); } connection.close(); }
- 2.戻りパラメータを作成します
入力パラメータ--in、出力パラメータの外にある CREATE OR手順(VARCHARでT、REPLACE proc_test1 AS R&LT OUT VARCHAR)を 開始 WHERE名等RからSELECT COUNT(*)INTO&LTのUserInfo T; END; -呼び出し、 -マルチラインステートメントを実行する'/'におけるDOSの端示し DECLARE outobj VARCHAR2(4); BEGIN proc_test1(T => 'A'は、R => outobj); DBMS_OUTPUT.PUT_LINE( 'outobj =' || outobj ); END;
通話中のjava:
+ testPrint)。 conn.close(); }
- 3.結果でクエリを作成します。
- 3. Oracleのストアドプロシージャは値を返しませんので、すべての戻り値がアウトパラメータに置き換えられ、それは、リストが例外ではないですが、あなたは一般的なパラメータを使用することはできませんので、それは、コレクションですので、あなたがpagkageを使用する必要があります。 2つの部分に分割された パッケージをビルドするために、--3.1。次のように: CREATE OR REPLACEパッケージtestpackageをAS 型TEST_CURSOR REFはカーソルです; END; --3.2、ストアドプロシージャ、ストアドプロシージャを構築する: 手順TESTCを作成するか、または交換してください(p_cursor OUTのtestpackage.test_cursor)IS 始める ためのオープンp_cursor のUserInfoからSELECT *を; エンド;
通話中のjava:
静的ボイドが、のSQLException {ClassNotFoundExceptionがスロー)(公共SELECT ;文字列のURL = "ORCL:オラクル:薄い:@localhost:1521 JDBC" 文字列名= "user2が"; 文字列のPWD = "user2が"; 文字列DRIVERNAME =「のoracle.jdbcを.driver.OracleDriver "; Class.forNameの(DRIVERNAME); 接続CONN =したDriverManager.getConnection(urlには、名前、PWD); CallableStatementのprocの= conn.prepareCall("コールTESTC()「?); //ストアドプロシージャ proc.registerOutParameter (1、oracle.jdbc.OracleTypes.CURSOR); //設定された出力パラメータが第1カーソル、カーソル・タイプのパラメータである。 proc.execute(); //は、実行 のResultSetのRS =(ResultSetの)proc.getObject( 1)。 //は、最初のパラメータがカーソルで、ResultSetの型に変換得る (rs.next())//データを取得しながら、 { System.out.println( "ID:" + rs.getString( "ID")+ "\ tusername:" + rs.getString( "ユーザ名")+ "\ tinsertdate:" + rs.getString( "insertdate")) ; } }
4.他のストアドプロシージャを呼び出すことができますストアドプロシージャを作成します。
-------------------------- 3例は、 作成したりプロシージャsp_name(中defaultVar置き換える VARCHAR2のデフォルトの「A」) - 、デフォルトのパラメータをそうでない場合は秩序パラメータに注意を払うように、パス AS -変数の宣言、各宣言はセミコロンで終わります。初期化することができるステートメント VARCHAR2 robj;(4) VAR2番号(20):; = 123 開始 -文字列の連結||と DBMS_OUTPUT.PUT_LINE( 'ISOK:' || 'ABC'); -他の記憶装置へのコールプロセス proc_test1(T => 'A'は、R => robj); DBMS_OUTPUT.PUT_LINE( 'R&LT =' || R&LT); END; -格納処理が終了 -呼び出す 開始 SP_NAME( 'A'); 末端と、