PLSQLの概要
PLSQLはOracleのSQL99への拡張です。基本的にすべてのデータベースはSQLを拡張します。OracleのSQLへの拡張はPLSQLと呼ばれます。
SQL99とは
- (1)すべてのリレーショナルデータベースを操作するためのルール
- (2)第4世代言語です
- (3)構造化されたクエリ言語です
- (4)合法かつ合理的なコマンドを発行するだけで、対応する結果が表示されます
SQLの機能
- (1)高度にインタラクティブで非手続き的
- (2)強力なデータベース操作機能。コマンドを送信するだけで、達成方法に注意を払う必要はありません。
- (3)マルチテーブル操作では、自動ナビゲーションは次のように簡単です。
select emp.empno,emp.sal,dept.dname from emp,dept where emp.deptno = dept.deptno
- (4)デバッグが簡単、エラープロンプト、簡単
- (5)** SQLは結果を強調します**
PLSQLとは
-Oracleサーバー専用です。** SQLに基づいて、** PLSQLと呼ばれるいくつかの手続き型制御ステートメントを追加します**
-手続きには、型定義、判定、ループ、カーソル、例外または例外処理が含まれます。。。
-** PLSQLはプロセスを強調します**
PLSQLを使用する理由
-SQLは第4世代の命令型言語であるため、**手続き型ビジネスを表示できないため、
SQLの欠点を補うために手続き型プログラミング言語を使用する必要があります**、-SQLとPLSQLは代替ではなく、補うためです。関係
## PLSQL構文##
宣言と例外の両方を省略でき、 `beginとend; /`は省略できません。
`` `sql
[declare]
变量声明;
变量声明;
begin
DML/TCL操作;
DML/TCL操作;
[exception]
例外处理;
例外处理;
end;
/
PLSQLプログラムの場合:;記号は各文の終わりを示し、/はPLSQLプログラム全体の終わりを示します。
PLSQLとSQL実行の違いは何ですか。
- (1)SQLは単一で実行されます
- (2)PLSQLは単一の実行ではなく全体として実行され、PLSQL全体は/で終わり、各文は;で終わります。
PLSQL変数
PLSQLはプロセスに注意を払うため、プロセスを作成するプログラムは基本的な構文を持っている必要があります。まず、PLSQLの変数を紹介しましょう。
PLSQL変数には4種類あります
- 数
- varchar2
- 列名タイプと同じ
- テーブル全体の列タイプと同じ
「helloworld」文字列を出力するPLSQLプログラムを記述します。構文:dbms_output.put_line( 'string to be output');
begin
--向SQLPLUS客户端工具输出字符串
dbms_output.put_line('hello 你好');
end;
/
注:
dbms_outputは、Oracleの出力オブジェクトです
。put_lineは、上記のオブジェクトのメソッドであり、自動行折り返しを使用して文字列を出力するために使用されます。
PLSQLプログラムの実行結果を表示するように設定します。デフォルトでは、PLSQLプログラムの実行結果は表示されません。構文:set serveroutput on / off;
set serveroutput on;
基本的な型変数、定数、コメントを使用して、10 +100の合計を求めます
declare
--定义变量
mysum number(3) := 0;
tip varchar2(10) := '结果是';
begin
/*业务算法*/
mysum := 10 + 100;
/*输出到控制器*/
dbms_output.put_line(tip || mysum);
end;
/
従業員番号7369の名前と給与を出力します。形式は次のとおりです。従業員番号7369の名前はSMITH、給与は800です。構文:テーブル名を使用します。フィールド%type
declare
--定义二个变量,分别装姓名和工资
pename emp.ename%type;
psal emp.sal%type;
begin
--SQL语句
--select ename,sal from emp where empno = 7369;
--PLSQL语句,将ename的值放入pename变量中,sal的值放入psal变量中
select ename,sal into pename,psal from emp where empno = 7369;
--输出
dbms_output.put_line('7369号员工的姓名是'||pename||',薪水是'||psal);
end;
/
従業員番号7788の名前と給与を出力します。形式は次のとおりです。従業員番号7788の名前はSMITH、給与は3000です。構文:テーブル名%rowtypeを使用します。
declare
emp_record emp%rowtype;
begin
select * into emp_record from emp where empno = 7788;
dbms_output.put_line('7788号员工的姓名是'||emp_record.ename||',薪水是'||emp_record.sal);
end;
/
いつ%typeを使用し、いつ%rowtypeを使用するのですか?
- 変数を定義するとき、変数のタイプはテーブルのフィールドのタイプと同じです。%typeを使用できます。
- 変数を定義するとき、変数がテーブル構造全体とまったく同じであるときは、%rowtypeを使用できます。このとき、変数の対応する値は、変数名とフィールド名から取得できます。
- プロジェクトで一般的に使用される%type
判定
注目に値するのは、eslifが間違っていない、eがないことです。
「稼働日」か「休日」かに関係なく、曜日を表示する場合はif-else-endを使用します。
declare
pday varchar2(10);
begin
select to_char(sysdate,'day') into pday from dual;
dbms_output.put_line('今天是'||pday);
if pday in ('星期六','星期日') then
dbms_output.put_line('休息日');
else
dbms_output.put_line('工作日');
end if;
end;
/
キーボードから値を受け取り、「age <16」、「age <30」、「age <60」、「age <80」を表示するには、if-elsif-else-endを使用します。
declare
age number(3) := &age;
begin
if age < 16 then
dbms_output.put_line('你未成人');
elsif age < 30 then
dbms_output.put_line('你青年人');
elsif age < 60 then
dbms_output.put_line('你奋斗人');
elsif age < 80 then
dbms_output.put_line('你享受人');
else
dbms_output.put_line('未完再继');
end if;
end;
/
サイクル
PLSQLには、次の3種類のループ構文があります。
WHILEループ:
- whileが続くループ条件はjavaに似ています。LOOPとENDLOOPはキーワードです**
WHILE total <= 25000
LOOP
total : = total + salary;
END LOOP;
ループループ:
- 終了の背後にある条件が確立されたら、ループを終了します[少し周り]
Loop
exit [when 条件成立];
total:=total+salary;
end loop;
FORループ:
- ループの増分は1のみで、ステップ長はカスタマイズできません。
FOR I IN 1 . . 3
LOOP
语句序列 ;
END LOOP ;
ループを使用して1〜10を表示します
declare
i number(2) := 1;
begin
loop
--当i>10时,退出循环
exit when i>10;
--输出i的值
dbms_output.put_line(i);
--变量自加
i := i + 1;
end loop;
end;
/
whileループを使用して1〜10を表示します
declare
i number(2) := 1;
begin
while i<11
loop
dbms_output.put_line(i);
i := i + 1;
end loop;
end;
/
whileループを使用して、999レコードをempテーブルに挿入します
declare
i number(4) := 1;
begin
while( i < 1000 )
loop
insert into emp(empno,ename) values(i,'哈哈');
i := i + 1;
end loop;
end;
/
whileループを使用して、empテーブルから999レコードを削除します
declare
i number(4) := 1;
begin
while i<1000
loop
delete from emp where empno = i;
i := i + 1;
end loop;
end;
/
forループを使用して20-30を表示します
declare
i number(2) := 20;
begin
for i in 20 .. 30
loop
dbms_output.put_line(i);
end loop;
end;
/
カーソル
Oracleのカーソルは、実際にはJDBCのresultSetに似ています。これは、ポインタの概念です。
resultSetに似ているため、カーソルはクエリを実行する場合にのみ有効です。
文法
CURSOR 光标名 [ (参数名 数据类型[,参数名 数据类型]...)]
IS SELECT 语句;
パラメータなしでカーソルを使用して、すべての従業員の名前と給与をクエリします[複数のレコードをトラバースする必要がある場合は、カーソルカーソルを使用し、レコードが見つからない場合はcemp%notfoundを使用します]
declare
--定义游标
cursor cemp is select ename,sal from emp;
--定义变量
vename emp.ename%type;
vsal emp.sal%type;
begin
--打开游标,这时游标位于第一条记录之前
open cemp;
--循环
loop
--向下移动游标一次
fetch cemp into vename,vsal;
--退出循环,当游标下移一次后,找不到记录时,则退出循环
exit when cemp%notfound;
--输出结果
dbms_output.put_line(vename||'--------'||vsal);
end loop;
--关闭游标
close cemp;
end;
/
パラメータ付きのカーソルを使用して、部門番号10の従業員の名前と給与を照会します。
declare
cursor cemp(pdeptno emp.deptno%type) is select ename,sal from emp where deptno=pdeptno;
pename emp.ename%type;
psal emp.sal%type;
begin
open cemp(&deptno);
loop
fetch cemp into pename,psal;
exit when cemp%notfound;
dbms_output.put_line(pename||'的薪水是'||psal);
end loop;
close cemp;
end;
/
パラメータなしでカーソルを使用すると、従業員の給与が実際に増加します。ANALYSTは1000増加し、MANAGERは800増加し、その他は400増加します。番号、名前、役職、および給与を表示する必要があります。
declare
cursor cemp is select empno,ename,job,sal from emp;
pempno emp.empno%type;
pename emp.ename%type;
pjob emp.job%type;
psal emp.sal%type;
begin
open cemp;
loop
fetch cemp into pempno,pename,pjob,psal;
--循环退出条件一定要写
exit when cemp%notfound;
if pjob='ANALYST' then
update emp set sal = sal + 1000 where empno = pempno;
elsif pjob='MANAGER' then
update emp set sal = sal + 800 where empno = pempno;
else
update emp set sal = sal + 400 where empno = pempno;
end if;
end loop;
commit;
close cemp;
end;
/
例外
上記のPLSQLの文法を見てきました。例外があります。これは、Oracleでは例外と呼ばれます。Javaでは、アチーブメントを例外と見なすこともできます。。。
文法:
在declare节中定义例外
out_of exception ;
在begin节中可行语句中抛出例外
raise out_of ;
在exception节处理例外
when out_of then …
オラクルシステムの組み込み例外を使用して、0への例外を示します[zero_divide]
declare
myresult number;
begin
myresult := 1/0;
dbms_output.put_line(myresult);
exception
when zero_divide then
dbms_output.put_line('除数不能为0');
delete from emp;
end;
/
オラクルシステムの組み込み例外を使用して、部門100の従業員の名前を照会し、データが見つからないことを示します[no_data_found]
declare
pename varchar2(20);
begin
select ename into pename from emp where deptno = 100;
dbms_output.put_line(pename);
exception
when NO_DATA_FOUND then
dbms_output.put_line('查无该部门员工');
insert into emp(empno,ename) values(1111,'ERROR');
end;
/
著者:Java3y
リンク:http://www.imooc.com/article/25261
出典:元のMuクラスネットワーク
で公開されたMuクラスネットワークの記事、出典を示してください、ありがとう