PLSQL学習の基盤

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の欠点を補うために手続き型プログラミング言語を使用する必要があります**、-SQLPLSQLは代替ではなく、補うためです。関係

## 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クラスネットワークの記事、出典を示してください、ありがとう

おすすめ

転載: blog.csdn.net/qq_39331713/article/details/93601891