PL/SQLでSQL文を実行します。(三)
4213 ワード
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.ダイナミック挿入
注意:同じ道理で他の操作ができます。
3.コンテキストエリア(context ara):ラベル(cursor)
SQL%ROWCOUNTは、先ほど実行したsql文の影響を示すレコードの枚数です。
4.臨時表temp_を作成する蘭
ifが存在します。データtrucateまたはdropをクリアします。
ifは存在しません。作成します。
公式サイトに行きます
5.分岐文
case方式でもいいです。
注意:ここで調べても出現しない:no data found異常、これはシステムに異常があるので、自分で定義できます。
6.循環文
また、JAVA forサイクルと同じです。
ここで紹介しているのは、よく使われる分岐と循環文です。JAVAと似ています。
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と似ています。