43,數據庫(05)

/*
達內學習 Oracle day41 2013-10-30
*/
常見的訪問oracle的技術
1.prosql   過程化SQL
2.proc/c++ 使用C語言或者C++反問Oracle數據庫
3.odbc /ADO VC中訪問數據庫的技術
4.JDBC/SQLJ JAVA訪問數據庫技術
5.OCI     oracle底層連接接口
PL/SQL(procedural language/Sql)是在標準SQL的基礎上增加了過程化處理的語言
oracle客戶端工具訪問oracle的操作語言
oracle對sql的擴充

plsql擴展了sql
變量和數據類型、控制語句(if 、for、go)、過程(procedure)和函數(function)、對象和方法 。

plsql的程序結構:
declare
    /*申明區:*/
begin
    /*執行區*/
exception
    /*異常處理區*/
end;
--------------------------------
c語言的定義和申明
int   a;//定義
extern  int a;//申明 外部變量
--------------------------------
申明區:用來定義變量 或者 類型。  (不區分定義和申明)
執行區:用來執行sql語句或者plsql語句
異常處理區:當sql語句出錯以後  自動轉到異常處理區 做錯誤處理
圖形界面:sqldeveloper

begin
 dbms_output.put_line('hello plsql!');
end;
打開輸出:
set serveroutput on
------------------------------------------
變量的定義:
1,一定要在申明區
變量名   類型;
2,舉例
  declare
    var_id number:=111;
    var_name varchar2(30):='wocao';
  begin
  dbms_output.put_line(var_id||':'||var_name);
   var_id := 1234;
   var_name := 'wozaicao';
   dbms_output.put_line(var_id||'@'||var_name);
  end;
3,變量的修飾
變量名 constant  類型;
變量名  類型 not null; 
var_id  constant number:=111; --不允許修改
var_name varchar2(30) not null:='wocao'; --必須初始化
4,變量的數據類型
標量類型:
number(數字)、binary_integer(二進制整數)、char(定長字符串)
varchar2(變長字符串)、date(日期類型)、boolean(布爾類型 true false null)

複合類型:
record(記錄 對應結構)
table (表類型)

參考類型
ref   參考類型
ref cursor 參考遊標

大類型:
blob   大二進制 0-4g
clog   大字符類型  0-4g
bfile  文件類型    0-4g

declare
 flag boolean := true;
 jobno binary_integer :=123;
begin
 if flag then
  dbms_output.put_line(jobno);
 end if;
end;
-------------------------------------------------
5,取得表中字段對應的類型
表名.字段名%type   取得對應的類型
定義兩個變量  分別和s_emp 表中的 id 和first_name 的類型相同 然後把id = 1的first_name 賦值給定義的變量
declare
myid s_emp.id%type :=1;  /*通過%type定義類型*/
myname s_emp.first_name%type;
begin   /*通過select into語句賦值*/
   select first_name into myname from s_emp where id = myid;
   dbms_output.put_line(myid||'           '||myname);
end;

declare
myid s_emp.id%type := 3;
myname s_emp.first_name%type;
mysalary  s_emp.salary%type ;
begin
  select id,first_name,salary into myid,myname,mysalary from s_emp where id = 3;
  dbms_output.put_line(myid||myname||mysalary);
end;

6,類似於C語言結構體的類型
 record 類型
定義record類型
type record_name is record (
 字段名  類型,
    字段名  類型
);
變量名  記錄類型的名字;

declare
type myrecord is record(/*定義記錄*/
  myid s_emp.id%type,
  myname s_emp.first_name%type,
  mysalary s_emp.salary%type
);
my3 myrecord;  /*定義記錄變量*/
my2 myrecord;
begin
 select id,first_name,salary into my3 from s_emp where id = 3;
  dbms_output.put_line(my3.myid||' '||my3.myname||' '||my3.mysalary);
/*記錄類型之間的賦值*/
my2:= my3;/*字符串賦值  my2.name = my3.name  */
end;
----------------------------------
把s_emp 表中id =1的所有數據記錄在變量中
s_emp%rowtype
s_dept%rowtype

/*  使用表的一行的類型 定義一個變量 */
declare
 var_emp s_emp%rowtype;
begin
   select * into var_emp from s_emp where id = 1;
   dbms_output.put_line(var_emp.id||':'||var_emp.first_name||':'||var_emp.salary);
end;
/*把id= 50的部門信息仿如一個rowtype類型的變量中並輸出*/
declare
type var_dept s_dept%rowtype;
begin
 select * into var_dept from s_dept where id = 50 ;
 dbms_output.put_line(var_dept.id||var_dept.name||var_dept.region_id);
end;
--------------------------------------------------------------------------
8,table 類型
 相當於c中的數組類型
定義 table 類型
type table_name is table of 表中的數據類型 index by binary_integer;

declare
/*定義表類型*/
 type numstype is table of number index by binary_integer;
/*使用類型定義變量*/
 var_nums numstype;
/*定義一個下標變量*/
 var_ind binary_integer;
begin
--向table類型變量中放入數據
 var_nums(-1):= 234;
 var_nums(1):= 23;
 var_ind :=var_nums.first();
 dbms_output.put_line(var_nums(var_ind));
 var_ind :=var_nums.next(var_ind);
 dbms_output.put_line(var_nums(var_ind));
end;

/*迭代器思想 根據一個元素的信息 可以得到下一個元素的信息*/
first()可以返回第一個元素對於的下標
next(n) 根據一個元素的下標得到下一個元素的下標
last()得到最後一個元素對應的下標

把s_emp表中idd=1 或 id= 5 或 id= 11 的所有數據放入一個table類型的變量中,然後用迭代器打印 id first_name salary
----   老師寫的
declare
  type empstype is table of s_emp%rowtype index by binary_integer;
  var_emps empstype;
  var_ind binary_integer:=1;
begin
 select * into var_emps(var_ind) from s_emp where id=var_ind;
 var_ind:=5;
 select * into var_emps(var_ind) from s_emp where id=var_ind;
 var_ind:=11;
 select * into var_emps(var_ind) from s_emp where id=var_ind;
 var_ind:=var_emps.first();
 dbms_output.put_line(var_emps(var_ind).id||':'||var_emps(var_ind).salary);
 var_ind:=var_emps.next(var_ind);
 dbms_output.put_line(var_emps(var_ind).id||':'||var_emps(var_ind).salary);
 var_ind:=var_emps.last();
 dbms_output.put_line(var_emps(var_ind).id||':'||var_emps(var_ind).salary);
end;
----

------------------------------------------------------------
變量的作用域 和 可見行
plsql塊 嵌套
<<abc>> --標籤
declare
 var_m number:= 1;
begin
 declare
    var_n number:=100;
     begin
        /*
               局部  可以訪問全局  局部優先     
            */
      end;
      /* 全局不能訪問局部*/
end;
---------------------------------------------------------
plsql中的控制語句
1,分支語句
if a<b then
-- 中間代碼
end if;

if a<b then
else
end if;

if a<b then
elsif a<c then
elsif a<d then
end if;

if a<b then
elsif a<c then
elsif a<d then
else
end if;
----------------------------------------------------------
循環
a,簡單循環
loop
……循環條件
end loop;
終止循環:exit when 條件;
          if  條件  then  exit;
b,while 循環
 while 循環條件 loop
……循環語句
  end loop;
declare
i number :=1;
begin
while i<11 loop
dbms_output.put_line(i);
i:=i+1;
end loop;
end;

c,for 循環  ------智能循環
 for 變量 in 區間 loop
  /* 循環語句  */
 end loop;
整數區間1..10 1到10
begin
for i in 1..10 loop
dbms_output.put_line(i);
end loop;
end;

begin
for i in reverse 1..10 loop
dbms_output.put_line(i);
exit when i=5;
end loop;
end;

for循環中的變量不能被修改
-----------------------------------------------------
多重循環的退出
declar
  var_m number;
  var_n number;
begin
  while var_m < 4 loop
  end loop;
end;


    有一個人他有一個小狗,有一天他突然想養一隻小貓,小狗就是不同意,但是他就是非要想養一隻小貓,小狗就是不同意,那腫麼辦呢?於是他就和小狗商量說,咱家再養一隻小狗好不好,小狗非常開心,因爲他每天那麼寂寞其實早就想有一個小夥伴了,晚上的時候小狗很高興很高興,一晚上都沒有睡覺,第二天早晨的時候,主人告訴小狗說咱家要不不養小狗了好嗎?小狗當然很失望,很生氣,很不願意,主人趁機說,養小狗可以那養小貓爲什麼不可以啊,要不這樣吧,養一隻小狗也養一隻小貓好不好,小狗太孤獨了只好答應了,雖然它不想多一隻小貓,可是最起碼也多了一隻小狗啊。後來公主和王子過上了幸福的生活。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章