PL/SQLでSQL文を実行します。(三)


oracleデータベースでは、文は一般的にこれらに分類されます。
 
DML(data manipulation langage):データベース操作文、有
プロジェクト 、insert、udate、deleteでデータを操作できる言語は、厳密に言えばselectです。 その中に入れない
 
DDL(Data Definition Language):データベース定義言語は、
create、drop、alter、truncate など、一般的にデータベース管理システムの一部であり、データベースのすべての特性と属性を定義するために使用されます。
 
DCL データ制御言語は、
Grant、Revoke、Comit、Rollbackは、Comit、Rollbackが厳密にTCLTRSA Control Languageにまとめられています。
 
1.表をコピーし、dept表をコピーし、後から使う
 create table my_dept as select*from dept;
表のコピーは制約条件をコピーしません。
 
2.ダイナミック挿入
 
 begin
       insert into  my_dept  values('&no','&name','&location') ;
       commit;
end;   
                      
 
注意:同じ道理で他の操作ができます。
 
3.コンテキストエリア(context ara):ラベル(cursor)
    SQL%ROWCOUNTは、先ほど実行したsql文の影響を示すレコードの枚数です。
 
declare
  v_rows number := 0;
begin
  delete from my_dept
  where deptno > 40;
  v_rows := SQL%ROWCOUNT;
  commit;
  dbms_output.put_line
     (v_rows||' deleted');
end;
 
4.臨時表temp_を作成する蘭
   ifが存在します。データtrucateまたはdropをクリアします。
   ifは存在しません。作成します。
declare
    v_count number(2) :=0;
begin
    select count(*) into v_count
    from user_tables
    where table_name = 'TEMP_RAN';
    if v_count = 1 then
        execute immediate
            'drop table temp_ran';
    end if;
    execute immediate
        'create table temp_ran as select * from dept';
end;
--     ,  
   注意:user_テーブル名はデフォルトでは大文字で、immediateは直ちに実行されます。効率を高めるために、具体的には
   公式サイトに行きます
 
5.分岐文
declare
    v_rate number(3,2);
    v_job emp.job%type;
    v_sal emp.sal%type;
    v_empno emp.empno%type :=&no;
begin
    select job,sal into v_job,v_sal 
    from emp where empno = v_empno;
    if v_job = 'ANALYST' then
        v_rate := 1.2;
    elsif v_job = 'MANAGER' then
        v_rate  := 1.1;
    elsif v_job = 'SALESMAN' then
        v_rate := 1.05;
    else
        v_rate := 1;
    end if;
    update emp_ran set sal = sal*v_rate
    where empno = v_empno;
    commit;
    dbms_output.put_line(v_job || 'old :'||v_sal||', new :'||v_sal*v_rate);
end;
   ここではelsifはelseifではなく、'ANALYST'empテーブルにコピーされたデータです。  
   case方式でもいいです。
 
  
declare
  v_rate number(3,2);
  v_job emp.job%type;
  v_sal emp.sal%type;
  v_empno emp.empno%type := &no;
begin
  SELECT job,sal into v_job,v_sal
  from emp_ran where empno = v_empno;
  case v_job
    when  'ANALYST' then v_rate :=1.2;
    when  'MANAGER' then v_rate :=1.1;
    when  'SALESMAN' then v_rate :=1.05;
    else v_rate :=1;
  end case;
  update emp_ran set sal = sal * v_rate
  where empno = v_empno;
  commit;
  dbms_output.put_line(v_job ||' old:'||v_sal||','||'new:'||v_sal * v_rate);
end;
 
注意:ここで調べても出現しない:no data found異常、これはシステムに異常があるので、自分で定義できます。
 
6.循環文
declare
  v_i number :=10;
BEGIN
  loop 
    --     
    insert into emp_ran(empno) values(v_i);
    --   v_i =20 ,  ,  1
    exit when v_i = 20;
    v_i := v_i+1;
   end loop;
   COMMIT ;
END ;
 
 また、JAVA forサイクルと同じです。
declare
  v_i number :=10;
begin
  for v_i in 100..110 
  loop
    insert into emp_ran(empno) values(v_i);
    -- commit;
  end loop;
end;
 while方式:
declare
  v_i number := 1000;
begin
  while v_i < 1010 loop
    insert into emp_ran(empno)
    values(v_i);
    v_i := v_i + 1;
  end loop;
  commit;
end;
 
ここで紹介しているのは、よく使われる分岐と循環文です。JAVAと似ています。