欧美色欧美亚洲高清在线观看,国产特黄特色a级在线视频,国产一区视频一区欧美,亚洲成a 人在线观看中文

  1. <ul id="fwlom"></ul>

    <object id="fwlom"></object>

    <span id="fwlom"></span><dfn id="fwlom"></dfn>

      <object id="fwlom"></object>

      plsql教學(xué)(本站推薦)

      時(shí)間:2019-05-15 03:46:28下載本文作者:會(huì)員上傳
      簡(jiǎn)介:寫寫幫文庫小編為你整理了多篇相關(guān)的《plsql教學(xué)(本站推薦)》,但愿對(duì)你工作學(xué)習(xí)有幫助,當(dāng)然你在寫寫幫文庫還可以找到更多《plsql教學(xué)(本站推薦)》。

      第一篇:plsql教學(xué)(本站推薦)

      1、一個(gè)簡(jiǎn)單的程序 set serveroutput on;&符號(hào)的作用:提示用戶輸入 begin

      dbms_output.put_line('HelloWorld!');end;/--執(zhí)行語句

      2、一個(gè)簡(jiǎn)單的程序塊 declare

      v_name varchar2(20);begin

      v_name:='i am ynp';

      dbms_output.put_line(v_name);end;

      3、一個(gè)完整的簡(jiǎn)單程序 declare

      v_num number := 0;begin

      v_num :=2/v_num;

      dbms_output.put_line(v_num);exception

      when others then

      dbms_output.put_line('error');end;

      ----變量聲明的規(guī)則

      1.變量名不能夠使用保留字,如from、select等 2.第一個(gè)字符必須是字母 3.變量名最多包含30個(gè)字符 4.不要與數(shù)據(jù)庫的表或者列同名 5.每一行只能聲明一個(gè)變量

      ------

      4、變量聲明盡量以v_ 開頭

      5、常用變量類型

      binary_integer :整數(shù),主要用來計(jì)數(shù)而不是用來表示字段類型 number :數(shù)字類型

      char :定長(zhǎng)字符串類型

      v_empnos(-1):=12;

      v_empnos(2):=111;

      dbms_output.put_line(v_empnos(-1));end;

      說明:table變量類型命名規(guī)則:type(自定義變量)-table(table類型變量)-emp(表emp)-empno(empno字段); 下標(biāo)值可以為負(fù)值;

      2、Record變量類型(類似于java中的類)declare type type_record_dept is record(deptno dept.deptno%type,dname dept.dname%type,loc dept.loc%type);

      v_temp type_record_dept;begin

      v_temp.deptno:=50;

      v_temp.loc:='bj';

      v_temp.dname:='aaa';

      dbms_output.put_line(v_temp.deptno||' '||v_temp.dname);end;

      但上述dept表變動(dòng)時(shí),此程序也得手動(dòng)做相應(yīng)改動(dòng),可以用下述方法自動(dòng)改動(dòng):

      使用%rowtype聲明record變量 declare

      v_temp dept%rowtype;begin

      v_temp.deptno:=50;

      v_temp.loc:='bj';

      v_temp.dname:='aaa';

      dbms_output.put_line(v_temp.deptno||' '||v_temp.dname);end;

      errcode := SQLCODE;--出錯(cuò)代碼 errmsg := SQLERRM

      --出錯(cuò)信息

      -----------------------------pl/sql中的sql語句----------------------

      1、select語句

      有且只有一條返回值,且必須加into 例子: declare

      else

      dbms_output.put_line('middle');

      end if;--注意有這條語句 end;

      5、while語句 declare

      k binary_integer:=1;begin

      while(k <11)loop

      dbms_output.put_line(k);

      k:=k+1;

      end loop;end;

      6、do..while語句 declare

      k binary_integer:=1;begin

      loop

      dbms_output.put_line(k);

      k:=k+1;

      exit when(k>=11);

      end loop;end;

      7、for循環(huán) declare

      k binary_integer:=1;begin

      for k in 1..10 loop

      dbms_output.put_line(k);

      end loop;end;

      declare

      k binary_integer:=1;begin

      for k in reverse 1..10 loop--加上reverse為逆序打印

      dbms_output.put_line(k);

      end loop;end;

      close c;end;

      4、for循環(huán)(循環(huán)時(shí)最簡(jiǎn)單)declare

      cursor c is

      select * from emp;begin

      for v_emp in c loop

      --不用定義v_emp,不用打開關(guān)閉游標(biāo)了

      dbms_output.put_line(v_emp.ename);

      end loop;end;

      5、帶參數(shù)的游標(biāo) declare

      cursor c(v_deptno emp.deptno%type,v_job emp.job%type)is

      select * from emp where deptno = v_deptno and job= v_job;begin

      for v_emp in c(30,'CLERK')loop

      dbms_output.put_line(v_emp.ename);

      end loop;end;

      6、可更新的游標(biāo)

      游標(biāo)一般是作為記錄集讀取數(shù)據(jù)用的,但有時(shí)候用游標(biāo)修改記錄,這就是可更新游標(biāo); declare

      cursor c is

      select * from emp2 for update;begin

      for v_emp in c loop

      if(v_emp.sal <2000)then

      update emp2 set sal =sal+1 where current of c;--修改定位到的當(dāng)前記錄,注意形式

      elsif(v_emp.sal>=2000)then

      delete from emp2 where current of c;

      end if;

      end loop;

      commit;--提交 end;

      -------------------------存儲(chǔ)過程--------------------

      1、把過程的declare變成 create or Replace produce p is 就行。

      end if;

      v_d := v_d+1;end;

      ---> 調(diào)試時(shí):

      可以在命令窗口調(diào)試,出錯(cuò)時(shí) 用show errors 顯示出錯(cuò)信息; 可以在plDv中調(diào)試;

      ---> 運(yùn)行時(shí):

      可以在命令窗口運(yùn)行: declare

      v_a number:=3;

      v_b number:=4;

      v_c number;

      v_d number:=5;begin

      p(v_a,v_b,v_c,v_d);

      dbms_output.put_line(v_c);

      dbms_output.put_line(v_d);end;可以在plDv中調(diào)試;

      ------------------函數(shù)-------------------

      1、它有返回值

      create or replace function tax_tag(sal number)return number--計(jì)算稅率 is begin

      if(sal > 1000)then

      return 0.1;

      elsif(sal>=2000)then

      return 0.15;

      else

      return 0.2;

      end if;end;

      select ename, tax_tag(sal)from emp ;--直接用函數(shù)tax_tag

      ------------------------觸發(fā)器(trigger)------------------------------1.create table emp2_log(insert into article values(10,'螞蟻是護(hù)士',9,1,3);

      ----------》存儲(chǔ)過程

      create or replace procedure p(v_pid article.pid%type,v_level binary_integer)is

      cursor c is select * from article where pid = v_pid;

      v_perStr varchar2(2000):=' ';begin

      for i in 1..v_level loop

      v_perStr := v_perStr||'***';

      end loop;

      for v_article in c loop

      dbms_output.put_line(v_perStr||v_article.cont);

      if(v_article.isleaf = 0)then

      p(v_article.id,v_level + 1);

      end if;

      end loop;end;

      第二篇:PLSQL學(xué)習(xí)

      ----最簡(jiǎn)單的塊

      set serveroutput on

      begin

      dbms_output.put_line('Hello,World');

      end;

      ----有定義和執(zhí)行部分的塊

      ----把用戶的編號(hào)也顯示出來

      declare

      ----定義變量

      v_ename varchar2(20);

      v_salnumber(7,2);

      begin

      select ename,salinto v_ename,v_sal from empwhere empno = &xy;----在控制臺(tái)顯示用戶名

      dbms_output.put_line('用戶名' || v_ename || '薪水是 ' ||v_sal);----異常處理

      exception

      when no_data_found then

      dbms_output.put_line('朋友,你輸入的編號(hào)有問題');

      end;

      CallableStatement 對(duì)象為所有的 DBMS 提供了一種以標(biāo)準(zhǔn)形式調(diào)用已儲(chǔ)存過程的方法。已儲(chǔ)存過程儲(chǔ)存在數(shù)據(jù)庫中。對(duì)已儲(chǔ)存過程的調(diào)用是 CallableStatement對(duì)象所含的內(nèi)容。這種調(diào)用是用一種換碼語法來寫的,有兩種形式:一種形式帶結(jié)果參,另一種形式不帶結(jié)果參數(shù)。結(jié)果參數(shù)是一種輸出(OUT)參數(shù),是已儲(chǔ)存過程的返回值。兩種形式都可帶有數(shù)量可變的輸入(IN 參數(shù))、輸出(OUT 參數(shù))或輸入和輸出(INOUT 參數(shù))的參數(shù)。問號(hào)將用作參數(shù)的占位符。

      在 JDBC 中調(diào)用已儲(chǔ)存過程的語法如下所示。注意,方括號(hào)表示其間的內(nèi)容是可選項(xiàng);方括號(hào)本身并不是語法的組成部份。

      {call 過程名[(?, ?,...)]}

      返回結(jié)果參數(shù)的過程的語法為:

      {? = call 過程名[(?, ?,...)]}

      不帶參數(shù)的已儲(chǔ)存過程的語法類似:

      {call 過程名}

      通常,創(chuàng)建 CallableStatement 對(duì)象的人應(yīng)當(dāng)知道所用的 DBMS 是支持已儲(chǔ)存過程的,并且知道這些過程都是些什么。然而,如果需要檢查,多種DatabaseMetaData 方法都可以提供這樣的信息。例如,如果 DBMS 支持已儲(chǔ)存過程的調(diào)用,則supportsStoredProcedures 方法將返回 true,而getProcedures 方法將返回對(duì)已儲(chǔ)存過程的描述。CallableStatement 繼承 Statement 的方法(它們用于處理一般的 SQL 語句),還繼承了 PreparedStatement 的方法(它們用于處理 IN 參)。

      CallableStatement 中定義的所有方法都用于處理 OUT 參數(shù)或 INOUT 參數(shù)的輸出部分:注冊(cè) OUT 參數(shù)的 JDBC 類型(一般 SQL 類型)、從這些參數(shù)中檢索結(jié)果,或者檢查所返回的值是否為 JDBC NULL。

      1、創(chuàng)建 CallableStatement 對(duì)象

      CallableStatement 對(duì)象是用 Connection 方法 prepareCall 創(chuàng)建的。下例創(chuàng)建 CallableStatement 的實(shí)例,其中含有對(duì)已儲(chǔ)存過程 getTestData 調(diào)用。該過程有兩個(gè)變量,但不含結(jié)果參數(shù):

      CallableStatement cstmt = con.prepareCall(“{call getTestData(?, ?)}”);

      其中?占位符為IN、OUT還是INOUT參數(shù),取決于已儲(chǔ)存過程getTestData。

      2、IN和OUT參數(shù)

      將IN參數(shù)傳給 CallableStatement 對(duì)象是通過 setXXX 方法完成的。該方法繼承自 PreparedStatement。所傳入?yún)?shù)的類型決定了所用的setXXX方法(例如,用 setFloat 來傳入 float 值等)。

      如果已儲(chǔ)存過程返回 OUT 參數(shù),則在執(zhí)行 CallableStatement 對(duì)象以前必須先注冊(cè)每個(gè) OUT 參數(shù)的 JDBC 類型(這是必需的,因?yàn)槟承?DBMS 要求 JDBC 類型)。注冊(cè) JDBC 類型是用 registerOutParameter 方法來完成的。語句執(zhí)行完后,CallableStatement 的 getXXX 方法將取回參數(shù)值。正確的 getXXX 方法是為各參數(shù)所注冊(cè)的 JDBC 類型所對(duì)應(yīng)的 Java 類型。換言之,registerOutParameter 使用的是 JDBC 類型(因此它與數(shù)據(jù)庫返回的 JDBC 類型匹配),而 getXXX 將之轉(zhuǎn)換為 Java 類型。

      作為示例,下述代碼先注冊(cè) OUT 參數(shù),執(zhí)行由 cstmt 所調(diào)用的已儲(chǔ)存過程,然后檢索在 OUT 參數(shù)中返回的值。方法 getByte 從第一個(gè) OUT 參數(shù)中取出一個(gè) Java 字節(jié),而 getBigDecimal 從第二個(gè) OUT 參數(shù)中取出一個(gè) BigDecimal 對(duì)象(小數(shù)點(diǎn)后面帶三位數(shù)):

      CallableStatement cstmt = con.prepareCall(“{call getTestData(?, ?)}”);

      cstmt.registerOutParameter(1, java.sql.Types.TINYINT);

      cstmt.registerOutParameter(2, java.sql.Types.DECIMAL, 3);

      cstmt.executeQuery();

      byte x = cstmt.getByte(1);

      java.math.BigDecimal n = cstmt.getBigDecimal(2, 3);

      CallableStatement 與 ResultSet 不同,它不提供用增量方式檢索大 OUT 值的特殊機(jī)制。

      3、INOUT參數(shù)

      既支持輸入又接受輸出的參數(shù)(INOUT 參數(shù))除了調(diào)用 registerOutParameter 方法外,還要求調(diào)用適當(dāng)?shù)?setXXX 方法(該方法是從 PreparedStatement 繼承來的)。setXXX 方法將參數(shù)值設(shè)置為輸入?yún)?shù),而 registerOutParameter 方法將它的 JDBC 類型注冊(cè)為輸出參數(shù)。setXXX 方法提供一個(gè) Java 值,而驅(qū)動(dòng)程序先把這個(gè)值轉(zhuǎn)換為 JDBC 值,然后將它送到數(shù)據(jù)庫中。這種 IN 值的 JDBC 類型和提供給 registerOutParameter 方法的 JDBC 類型應(yīng)該相同。然后,要檢索輸出值,就要用對(duì)應(yīng)的 getXXX 方法。例如,Java 類型為byte 的參數(shù)應(yīng)該使用方法 setByte 來賦輸入值。應(yīng)該給registerOutParameter 提供類型為 TINYINT 的 JDBC 類型,同時(shí)應(yīng)使用 getByte 來檢索輸出值。

      下例假設(shè)有一個(gè)已儲(chǔ)存過程 reviseTotal,其唯一參數(shù)是 INOUT 參數(shù)。方法setByte 把此參數(shù)設(shè)為 25,驅(qū)動(dòng)程序?qū)阉鳛?JDBC TINYINT 類型送到數(shù)據(jù)庫中。接著,registerOutParameter 將該參數(shù)注冊(cè)為 JDBC TINYINT。執(zhí)行完該已儲(chǔ)存過程后,將返回一個(gè)新的 JDBC TINYINT 值。方法 getByte 將把這個(gè)新值作為 Java byte 類型檢索。

      CallableStatement cstmt = con.prepareCall(“{call reviseTotal(?)}”);

      cstmt.setByte(1, 25);

      cstmt.registerOutParameter(1, java.sql.Types.TINYINT);

      cstmt.executeUpdate();

      byte x = cstmt.getByte(1);

      4、先檢索結(jié)果,再檢索 OUT 參數(shù)

      由于某些 DBMS 的限制,為了實(shí)現(xiàn)最大的可移植性,建議先檢索由執(zhí)行CallableStatement 對(duì)象所產(chǎn)生的結(jié)果,然后再用 CallableStatement.getXXX 方法來檢索 OUT 參數(shù)。如果 CallableStatement 對(duì)象返回多個(gè) ResultSet 對(duì)象(通過調(diào)用 execute 方法),在檢索 OUT 參數(shù)前應(yīng)先檢索所有的結(jié)果。這種情況下,為確保對(duì)所有的結(jié)果都進(jìn)行了訪問,必須對(duì) Statement 方法 getResultSet、getUpdateCount 和getMoreResults 進(jìn)行調(diào)用,直到不再有結(jié)果為止。

      檢索完所有的結(jié)果后,就可用 CallableStatement.getXXX 方法來檢索 OUT 參數(shù)中的值。

      5、檢索作為OUT參數(shù)的NULL值

      返回到 OUT 參數(shù)中的值可能會(huì)是JDBC NULL。當(dāng)出現(xiàn)這種情形時(shí),將對(duì) JDBC NULL 值進(jìn)行轉(zhuǎn)換以使 getXXX 方法所返回的值為 null、0 或 false,這取決于getXXX 方法類型。對(duì)于 ResultSet 對(duì)象,要知道0或false是否源于JDBCNULL的唯一方法,是用方法wasNull進(jìn)行檢測(cè)。如果 getXXX 方法讀取的最后一個(gè)值是 JDBC NULL,則該方法返回 true,否則返回 flases

      第三篇:PLSQL學(xué)習(xí)總結(jié)

      PL/SQL集合批量綁定(Bulk binds)減少循環(huán)開銷PL/SQL引擎會(huì)執(zhí)行過程化語句,但它把SQL語句傳送給SQL引擎處理,然后SQL引擎把處理的結(jié)果返回給PL/SQL引擎。

      PL/SQL和SQL引擎間的頻繁切換會(huì)大大降低效率。典型的情況就是在一個(gè)循環(huán)中反復(fù)執(zhí)行SQL語句。

      批量綁定如何提高性能?

      在SQL語句中為PL/SQL變量賦值稱為綁定,PL/SQL綁定操作分為三種:

      1.內(nèi)綁定(in-bind):用INSERT或UPDATE語句將PL/SQL發(fā)量或主變量保存到數(shù)據(jù)庫。

      2.外綁定(out-bind):途過INSERT、UPDATE或DELETE語句的RETURNING子句返回值為PL/SQL變量或主變量賦值。

      3.定義(define):使用SELECT或FETCH語句為PL/SQL變量或主變量賦值.DML語句可以一次性傳遞集合中所有的元素,這個(gè)過程就是批量綁定。如果集合有20個(gè)元素,批量綁定的一次操作就相當(dāng)于執(zhí)行20次SELECT、INSERT、UPDATE或DELETE語句。綁定技術(shù)是靠減少PL/SQL和SQL引擎間的切換次數(shù)來提高性能的。

      批量綁定(Bulk binds)包括:

      (i)Input collections, use the FORALL statement,一般用來改善DML(INSERT、UPDATE和DELETE)操作的性能

      (ii)Output collections, use BULK COLLECT clause,一般用來提高查詢(SELECT)的性能

      例一:對(duì)DELETE語句應(yīng)用批量綁定

      下面的DELETE語句只往SQL引擎中發(fā)送一次,即使是執(zhí)行了三次DELETE操作: DECLARE

      TYPE numlist IS VARRAY(20)OF NUMBER;

      depts numlist := numlist(10, 30, 70);

      BEGIN

      FORALL i IN depts.FIRST..depts.LAST

      DELETE FROM emp WHERE deptno = depts(i);

      END;

      當(dāng)執(zhí)行DELETE的數(shù)據(jù)數(shù)量非常大時(shí),使用上述批量綁定方法能大大的提高運(yùn)行效率。注意集合變長(zhǎng)數(shù)組類型只能通過構(gòu)造函數(shù)初始化,不能像索引表和嵌套表一樣通過FOR循環(huán)直接賦值,具體可見下例。

      例二:對(duì)INSERT語句應(yīng)用批量綁定

      CREATE TABLE blktest(num NUMBER(20), name varchar2(50));

      DECLARE

      type numtab is table of number(20)INDEX by binary_integer;

      type nametab is TABLE of VARCHAR2(20)INDEX by binary_integer;

      pnums

      numtab;

      pnames

      nametab;

      t1

      number;

      t2

      number;

      t3

      number;

      begin

      for j in 1..100000?為集合索引表變量循環(huán)賦值

      loop

      pnums(j):= j;

      pnames(j):= 'Seq No' || to_char(j);

      end loop;

      select Dbms_Utility.get_time into t1 from dual;--獲得FOR運(yùn)行前時(shí)間

      for i in 1..100000?使用普通FOR循環(huán)插入10000條數(shù)據(jù)

      loop

      insert into blktest values(pnums(i),pnames(i));

      end loop;

      select dbms_utility.get_time into t2 FROM dual;獲得FOR運(yùn)行后時(shí)間和FORALL運(yùn)行前時(shí)間

      forall i in 1..100000?使用FORALL循環(huán)即集合批量綁定方法插入10000條數(shù)據(jù)

      insert into blktest values(pnums(i),pnames(i));

      select dbms_utility.get_time

      into t3 from dual;--獲得FORALL運(yùn)行后時(shí)間

      dbms_output.put_line('Execution Time(secs)');

      dbms_output.put_line('------------------------');

      dbms_output.put_line('FOR loop: ' || TO_CHAR(t2t2));

      END;

      運(yùn)行結(jié)果:

      Execution Time(secs)

      ------------------------

      FOR loop: 982

      FORALL loop: 49

      總結(jié):

      1.在PL/SQL DEVELOPER的SQL WINDOWS中獲得數(shù)據(jù)庫當(dāng)前時(shí)間的方法是:dbms_utility.get_time;如果需要測(cè)試某一段PLSQL的性能,則只需在開始和結(jié)束的時(shí)候分別獲取數(shù)據(jù)庫時(shí)間并做差即可,如上例中分別獲取兩種循環(huán)的耗時(shí)。

      2.上例中,我們把10000個(gè)編號(hào)和名稱放到索引表中。所有的表元素都向數(shù)據(jù)庫插入兩次:第一次使用FOR循環(huán),然后使用FORALL語句。實(shí)際上,F(xiàn)ORALL版本的代碼執(zhí)行速度要比FOR語句版本的快得多。

      3.上述測(cè)試過程也可以通過在PL/SQL DEVELOPER的COMMAND WINDOWS中先編寫PROCEDURE再運(yùn)行的方法實(shí)現(xiàn)。在COMMAND WINDOWS中設(shè)置顯示OUTPUT方法如下:

      本文章未結(jié)束,請(qǐng)繼續(xù)查看 “PLSQL學(xué)習(xí)總結(jié):批量綁定減少循環(huán)開銷--張凱(2)”

      第四篇:Oracle之PLSQL總結(jié)

      基本數(shù)據(jù)類型變量 1.基本數(shù)據(jù)類型

      Number 數(shù)字型

      Int 整數(shù)型

      Pls_integer 整數(shù)型,產(chǎn)生溢出時(shí)出現(xiàn)錯(cuò)誤

      Binary_integer 整數(shù)型,表示帶符號(hào)的整數(shù)

      Char 定長(zhǎng)字符型,最大255個(gè)字符

      Varchar2 變長(zhǎng)字符型,最大2000個(gè)字符

      Long 變長(zhǎng)字符型,最長(zhǎng)2GB

      Date 日期型

      Boolean 布爾型(TRUE、FALSE、NULL三者取一)

      在PL/SQL中使用的數(shù)據(jù)類型和Oracle數(shù)據(jù)庫中使用的數(shù)據(jù)類型,有的含義是完全一致的,有的是有不同的含義的。

      2.基本數(shù)據(jù)類型變量的定義方法

      變量名 類型標(biāo)識(shí)符 [not null]:=值;

      declare

      age number(3):=26;--長(zhǎng)度為3,初始值為26

      commit;

      begin

      end;

      其中,定義常量的語法格式:常量名 constant 類型標(biāo)識(shí)符 [not null]:=值;

      declare

      pi constant number(9):=3.1415926;--為pi的數(shù)字型常量,長(zhǎng)度為9,初始值為3.1415926

      begin

      表達(dá)式

      變量、常量經(jīng)常需要組成各種表達(dá)式來進(jìn)行運(yùn)算,下面介紹在PL/SQL中常見表達(dá)式的運(yùn)算規(guī)則。

      1.數(shù)值表達(dá)式

      PL/SQL程序中的數(shù)值表達(dá)式是由數(shù)值型常數(shù)、變量、函數(shù)和算術(shù)運(yùn)算符組成的,可以使用的算術(shù)運(yùn)算符包括+(加法)、-(減法)、*(乘法)、/(除法)和**(乘方)等。

      命令窗口中執(zhí)行下列PL/SQL程序,該程序定義了名為result的整數(shù)型變量,計(jì)算的是10+3*4-20+5**2的值,理論結(jié)果應(yīng)該是27。

      set serveroutput on

      Declare

      result integer;

      result:=10+3*4-20+5**2;

      begin

      commit;

      end;dbms_output.put_line('運(yùn)算結(jié)果是:'||to_char(result));

      end;

      dbms_output.put_line函數(shù)輸出只能是字符串,因此利用to_char函數(shù)將數(shù)值型結(jié)果轉(zhuǎn)換為字符型。

      2.字符表達(dá)式

      字符表達(dá)式由字符型常數(shù)、變量、函數(shù)和字符運(yùn)算符組成,唯一可以使用的字符運(yùn)算符就是連接運(yùn)算符“||”。

      3.關(guān)系表達(dá)式

      關(guān)系表達(dá)式由字符表達(dá)式或數(shù)值表達(dá)式與關(guān)系運(yùn)算符組成,可以使用的關(guān)系運(yùn)算符包括以下9種。

      4.邏輯表達(dá)式

      邏輯表達(dá)式由邏輯常數(shù)、變量、函數(shù)和邏輯運(yùn)算符組成,常見的邏輯運(yùn)算符包括以下3種。

      PLSQL函數(shù)

      PL/SQL程序中提供了很多函數(shù)供擴(kuò)展功能,除了標(biāo)準(zhǔn)SQL語言的函數(shù)可以使用外,最常見的數(shù)據(jù)類型轉(zhuǎn)換函數(shù)有以下3個(gè)。

      系統(tǒng)輸出打印

      利用pl/sql在數(shù)據(jù)庫服務(wù)器端打印一句話:

      set serveroutput on--設(shè)置數(shù)據(jù)庫輸出,默認(rèn)為關(guān)閉,每次重新打開窗口需要重新設(shè)置。

      BEGIN

      DBMS_OUTPUT.PUT_LINE('Hello PL/SQL');

      END;To_char:將其他類型數(shù)據(jù)轉(zhuǎn)換為字符型。

      To_date:將其他類型數(shù)據(jù)轉(zhuǎn)換為日期型。

      To_number:將其他類型數(shù)據(jù)轉(zhuǎn)換為數(shù)值型。

      繼續(xù)追加中..NOT:邏輯非

      OR:邏輯或

      AND:邏輯與

      運(yùn)算的優(yōu)先次序?yàn)镹OT、AND和OR。< 小于

      > 大于

      = 等于(不是賦值運(yùn)算符:=)

      like 類似于

      in 在??之中

      <= 小于等于

      >= 大于等于

      != 不等于 或<>

      between 在??之間

      關(guān)系型表達(dá)式運(yùn)算符兩邊的表達(dá)式的數(shù)據(jù)類型必須一致。

      pl/sql程序中對(duì)大小寫不敏感(打印聲明的變量)

      set serveroutput on

      DECLARE

      pl語句塊是pl/sql里最小的編程塊,其中可以再嵌套 PL/SQL中的變量聲明

      所有變量必須在declare中聲明,程序中不允許聲明。沒有初始化的變量默認(rèn)值為null,屏幕上null是看不見的,命名習(xí)慣:PL/SQL中變量一般以v_開頭(等同于存儲(chǔ)過程中as和begin區(qū)域的變量定義習(xí)慣)。

      注意number也能存小數(shù),最長(zhǎng)38位,所以以后建議整數(shù)都用binary_integer存。

      long是字符類型,boolean類型不能打印。

      標(biāo)準(zhǔn)變量類型:數(shù)字,字符,時(shí)間,布爾。

      declare

      v_number1 number;v_number2 number(3,2);v_number3 binary_integer :=1;v_name varchar2(20):='kettas';v_date date :=sysdate;v_long long :='ni hao';v_b boolean := true;

      if(v_number1 is null)then dbms_output.put_line('hello');end if;

      dbms_output.put_line(v_number1);dbms_output.put_line(v_number2);dbms_output.put_line(v_number3);dbms_output.put_line(v_name);dbms_output.put_line(v_date);dbms_output.put_line(v_long);

      --dbms_output.put_line(v_b);--執(zhí)行該句ORACLE提示“調(diào)用 'PUT_LINE' 時(shí)參數(shù)v_char varchar2(20):='a';

      v_char1 varchar2(20):='b';

      DBMS_OUTPUT.PUT_LINE(v_char);

      DBMS_OUTPUT.PUT_LINE(v_char1);

      BEGIN

      END;begin

      個(gè)數(shù)或類型錯(cuò)誤”

      end;

      備注:關(guān)于聲明number(4,3)中括號(hào)中的兩個(gè)數(shù)字的意義,前面的數(shù)字叫精度,后面的叫刻度。刻度:當(dāng)刻度為正數(shù)的時(shí)候,表示四舍五入到小數(shù)點(diǎn)后面的位數(shù),當(dāng)刻度為負(fù)數(shù)的時(shí)候,表示四舍五入到小數(shù)點(diǎn)前面的位數(shù)

      精度:從數(shù)字的最前面不為零開始到刻度精確到的位置

      ―――――――――――――――――――――――――――――――――――――

      v_Number number(4,3):=123.12312

      1、按刻度進(jìn)行四舍五入得到123.123

      2、確定刻度精確到的位置123123處,精度為6位(.符號(hào)不算)

      3、根據(jù)精度進(jìn)行判斷6位(>4)精度上限值

      --報(bào)錯(cuò)不能存儲(chǔ)

      ―――――――――――――――――――――――――――――――――――――

      number(3,-3):=44445

      1、根據(jù)刻度-3進(jìn)行四舍五入得到44000

      2、小數(shù)點(diǎn)向前移動(dòng)3位44.此位置為刻度精確到的位置

      3、根據(jù)精度進(jìn)行判斷2位(<3)精度上限值

      --不報(bào)錯(cuò)可存儲(chǔ)結(jié)果為44000

      DECLARE

      v_Number number(4,3):=123.12312;--實(shí)際精度6位大于上限精度值4位,提示“ORA-06502: PL/SQL: 數(shù)字或值錯(cuò)誤 : 數(shù)值精度太高”

      BEGIN

      DECLARE

      v_Number number(7,3):=4555;--實(shí)際精度7位等于上限精度值,可以存儲(chǔ)

      DBMS_OUTPUT.PUT_LINE(v_Number);

      BEGIN

      END

      ;

      ―――――――――――――――――――――――――――――――――――――

      變量賦值方式

      oracle中變量賦值方式是值拷貝而非引用

      declare

      v_number1 number:=100;

      v_number2 number;

      v_number2:=v_number1;

      v_number1:=200;

      dbms_output.put_line(v_number1);--200

      dbms_output.put_line(v_number2);--100

      DBMS_OUTPUT.PUT_LINE(v_Number);

      END

      ;

      begin

      end;

      ―――――――――――――――――――――――――――――――――――――

      PLSQL復(fù)合類型

      記錄類型record

      record類型最常用,聲明的時(shí)候可以加not null,但必須給初始值,如果record類型一致可以相互賦值,如果類型不同,里面的字段恰好相同,不能互相賦值。

      引用記錄型變量的方法是“記錄變量名.基本類型變量名”。

      declare

      type t_first is record(id number(3),name varchar2(20));

      v_first t_first;

      begin

      v_first.id:=1;

      v_first.name:='cheng';

      dbms_output.put_line(v_first.id);

      dbms_output.put_line(v_first.name);

      end;―――――――――――――――――――――――――――――――――――――

      record類型變量間賦值

      declare

      type t_first is record(id number,name varchar2(20));

      v_first t_first;

      v_second t_first;

      v_first.id:=1;

      v_first.name:='susu';

      v_second:=v_first;--相互賦值

      v_first.id:=2;

      v_first.name:='kettas';

      dbms_output.put_line(v_first.id);

      dbms_output.put_line(v_first.name);

      dbms_output.put_line(v_second.id);

      dbms_output.put_line(v_second.name);

      begin

      end;

      ―――――――――――――――――――――――――――――――――――――

      表類型變量table 語法如下:

      type 表類型 is table of 類型 index by binary_integer;

      表變量名 表類型;

      類型可以是前面的類型定義,index by binary_integer子句代表以符號(hào)整數(shù)為索引,這樣訪問表類型變量中的數(shù)據(jù)方法就是“表變量名(索引符號(hào)整數(shù))”。

      table類型,相當(dāng)于java中的Map容器,就是一個(gè)可變長(zhǎng)的數(shù)組,key(符號(hào)整數(shù)索引)必須是整數(shù),可以是負(fù)數(shù),value(類型)可以是標(biāo)量,也可以是record類型??梢圆话错樞蛸x值,但必須先賦值后使用。

      ――――――――――――――――――――――――――――――――――――― 1.定義一維表類型變量

      declare

      type t_tb is table of varchar2(20)index by binary_integer;

      v_tb t_tb;

      v_tb(100):='hello';

      v_tb(98):='world';

      dbms_output.put_line(v_tb(100));

      dbms_output.put_line(v_tb(98));

      begin

      end;

      類型為record的表類型變量

      ――――――――――――――――――――――――――――――――――――― declare

      type t_rd is record(id number,name varchar2(20));

      type t_tb is table of t_rd index by binary_integer;

      v_tb2 t_tb;

      v_tb2(100).id:=1;

      v_tb2(100).name:='hello';

      --dbms_output.put_line(v_tb2(100).id);

      --dbms_output.put_line(v_tb2(100).name);

      dbms_output.put_line(v_tb2(100).id||''||v_tb2(100).name);

      begin

      end;

      ――――――――――――――――――――――――――――――――――――

      2.定義多維表類型變量

      該程序定義了名為tabletype1的多維表類型,相當(dāng)于多維數(shù)組,table1是多維表類型變量,將數(shù)據(jù)表tempuser.testtable中recordnumber為60的記錄提取出來存放在table1中并顯示。

      declare

      type tabletype1 is table of testtable%rowtype index by binary_integer;

      table1 tabletype1;

      select * into table1(60)from tempuser.testtable where recordnumber=60;

      dbms_output.put_line(table1(60).recordnumber||table1(60).currentdate);

      begin

      end;

      備注:在定義好的表類型變量里,可以使用count、delete、first、last、next、exists和prior等屬性進(jìn)行操作,使用方法為“表變量名.屬性”,返回的是數(shù)字。

      set serveroutput on

      declare

      type tabletype1 is table of varchar2(9)index by binary_integer;

      table1 tabletype1;

      table1(1):='成都市';

      table1(2):='北京市';

      table1(3):='青島市';

      dbms_output.put_line('總記錄數(shù):'||to_char(table1.count));

      dbms_output.put_line('第一條記錄:'||table1.first);

      dbms_output.put_line('最后條記錄:'||table1.last);

      dbms_output.put_line('第二條的前一條記錄:'||table1.prior(2));

      dbms_output.put_line('第二條的后一條記錄:'||table1.next(2));

      begin

      end;

      ――――――――――――――――――――――――――――――――――――― %type和%rowtype

      使用%type定義變量,為了讓PL/SQL中變量的類型和數(shù)據(jù)表中的字段的數(shù)據(jù)類型一致,Oracle 9i提供了%type定義方法。

      這樣當(dāng)數(shù)據(jù)表的字段類型修改后,PL/SQL程序中相應(yīng)變量的類型也自動(dòng)修改。

      ―――――――――――――――――――――――――――――――――――――

      create table student(id number, name varchar2(20),age number(3,0));insert into student(id,name,age)values(1,'susu',23);

      查找一個(gè)字段的變量 declare

      查找多個(gè)字段的變量

      declare

      查找一個(gè)類型的變量,推薦用* declare

      也可以按字段查找,但是字段順序必須一樣,不推薦這樣做

      declare

      v_student student%rowtype;

      select id,name,age into v_student from student where rownum=1;

      dbms_output.put_line(v_student.id||''||v_student.name||''||v_student.age);

      begin

      v_student student%rowtype;

      select * into v_student from student where rownum=1;

      dbms_output.put_line(v_student.id||''||v_student.name||' '||v_student.age);

      begin

      v_id student.id%type;

      v_name student.name%type;

      v_age student.age%type;

      select id,name,age into v_id,v_name,v_age from student where rownum=1;

      dbms_output.put_line(v_id||' '||v_name||' '||v_age);

      v_name varchar2(20);

      v_name2 student.name%type;

      select name

      into

      v_name2

      from

      student

      where

      rownum=1;

      begin

      dbms_output.put_line(v_name2);

      end;begin

      end;end;end;

      declare

      備注:insert,update,delete,select都可以,create table,drop table不行。DPL,DML,和流程控制語句可以在pl/sql里用,但DDL語句不行。

      declare

      v_name student.name%type:='wang';

      insert into student(id,name,age)values(2,v_name,26);

      begin

      end;

      begin

      declare

      v_name student.name%type:='hexian';

      update student set name=v_name where id=1;

      begin

      end;

      begin

      update student set name='qinaide' where id=2;

      end;

      ―――――――――――――――――――――――――――――――――――――

      PLSQL變量的可見空間

      變量的作用域和可見性,變量的作用域?yàn)樽兞可昝鏖_始到當(dāng)前語句塊結(jié)束。

      當(dāng)外部過程和內(nèi)嵌過程定義了相同名字的變量的時(shí)候,在內(nèi)嵌過程中如果直接寫這個(gè)變量名是沒有辦法訪問外部過程的變量的,可以通過給外部過程定義一個(gè)名字<>,通過outername變量名來訪問外部過程的變量(待測(cè)試..)。

      declare

      v_i1 binary_inteer:=1;

      begin

      declare

      v_i2 binary_integer:=2;

      begin

      insert into student(id,name,age)values(5,'hehe',25);

      end;v_student student%rowtype;

      select id,name,age into v_student.id,v_student.name,v_student.age from--select * into v_student.id,v_student.name,v_student.age from student dbms_output.put_line();

      begin

      student where id=1;

      where id=1;

      end;

      dbms_output.put_line(v_i1);

      dbms_output.put_line(v_i2);

      dbms_output.put_line(v_i1);

      --dbms_output.put_line(v_i2);解開后執(zhí)行Oracle會(huì)提示“必須說明標(biāo)識(shí)符 'V_I2'”

      end;

      end;

      ―――――――――――――――――――――――――――――――――――――

      PLSQL流程控制

      if判斷

      declare

      if else判斷

      declare

      if elsif else判斷

      declare

      v_name varchar2(20):='cheng';

      if v_name='0701' then dbms_output.put_line('0701');

      elsif v_name='cheng' then dbms_output.put_line('cheng');

      else dbms_output.put_line('false');

      end if;begin

      v_b boolean:=true;

      if v_b then dbms_output.put_line('ok');

      else dbms_output.put_line('false');

      end if;begin

      v_b boolean:=true;

      if v_b then dbms_output.put_line('ok');end if;begin end;end;end;――――――――――――――――――――――――――――――――――――― loop循環(huán),注意推出exit是推出循環(huán),而不是推出整個(gè)代碼塊

      declare

      v_i binary_integer:=0;loop

      if v_i>10 then exit;end if;

      v_i:=v_i+1;

      begin

      dbms_output.put_line('hehe');

      end loop;

      dbms_output.put_line('over');

      end;loop簡(jiǎn)化寫法

      declare

      while循環(huán)

      declare

      for循環(huán),注意不需要聲明變量

      begin

      for v_i in 0..10 loop

      dbms_output.put_line('hello'||v_i);

      end loop;

      dbms_output.put_line('over');v_i binary_integer:=0;while v_i<10 loop

      dbms_output.put_line('hello'||v_i);

      v_i:=v_i+1;

      end loop;

      dbms_output.put_line('over');begin

      v_i binary_integer :=0;loop

      exit when v_i>10;

      v_i :=v_i+1;

      dbms_output.put_line('hehe');

      end loop;

      dbms_output.put_line('over');begin

      end;end;end;―――――――――――――――――――――――――――――――――――――

      PLSQL異常處理

      1、聲明異常

      異常名 EXCEPTION;

      2、拋出異常

      RAISE 異常名

      3、處理異常

      拋出異常后的邏輯代碼不會(huì)被繼續(xù)執(zhí)行

      異常的定義使用 begin

      dbms_output.put_line(1/0);

      exception when others then dbms_output.put_line('error');

      end;declare

      e_myException exception;

      dbms_output.put_line('hello');

      raise e_myException;

      --raise拋出異常,用此關(guān)鍵字,拋出后轉(zhuǎn)到自定義的e_myException,執(zhí)行其里面的--再跳到end處,結(jié)束PL/SQL塊,raise接下面的2句不會(huì)繼續(xù)執(zhí)行。dbms_output.put_line('world');

      dbms_output.put_line(1/0);

      exception when e_myException then dbms_output.put_line(sqlcode);dbms_output.put_line(sqlerrm);--當(dāng)前錯(cuò)誤信息

      dbms_output.put_line('my error');

      when others then dbms_output.put_line('error');

      begin

      putline函數(shù)后,--當(dāng)前會(huì)話執(zhí)行狀態(tài),錯(cuò)誤編碼

      end;

      ―――――――――――――――――――――――――――――――――――――

      PLSQL游標(biāo)和goto語句

      備注:下面提到的游標(biāo)為靜態(tài)cursor,包括顯示和隱式。

      游標(biāo),從declare、open、fetch、close是一個(gè)完整的生命旅程。當(dāng)然了一個(gè)這樣的游標(biāo)是可以被多次open進(jìn)行使用的,顯式cursor是靜態(tài)cursor,她的作用域是全局的,但也必須明白,靜態(tài)cursor也只有pl/sql代碼才可以使用它。

      靜態(tài)游標(biāo)變量是在定義時(shí)就必須指定SQL語句。

      cursor 游標(biāo)(結(jié)果集)用于提取多行數(shù)據(jù),定義后不會(huì)有數(shù)據(jù),使用后才有。一旦游標(biāo)被打開,就無法再次打開(可以先關(guān)閉,再打開)。

      declare

      第二種游標(biāo)的定義方式,用變量控制結(jié)果集的數(shù)量。

      declare

      cursor c_student is select * from book;

      open c_student;

      close c_student;

      begin

      end;v_id binary_integer;

      cursor c_student is select * from book where id>v_id;

      v_id:=10;

      begin

      第三種游標(biāo)的定義方式,帶參數(shù)的游標(biāo),用的最多。

      declare

      cursor c_student(v_id binary_integer)is select * from book where id>v_id;

      open c_student(10);

      游標(biāo)的使用,一定別忘了關(guān)游標(biāo)。

      declare

      如何遍歷游標(biāo)fetch

      游標(biāo)的屬性 %found,%notfound,%isopen,%rowcount。

      %found:若前面的fetch語句返回一行數(shù)據(jù),則%found返回true,如果對(duì)未打開的游標(biāo)使用則報(bào)ORA-1001異常。

      %notfound,與%found行為相反。

      %isopen,判斷游標(biāo)是否打開。

      %rowcount:當(dāng)前游標(biāo)的指針位移量,到目前位置游標(biāo)所檢索的數(shù)據(jù)行的個(gè)數(shù),若未打開就引用,返回ORA-1001。

      注: no_data_found和%notfound的用法是有區(qū)別的,小結(jié)如下

      1)SELECT...INTO 語句觸發(fā) no_data_found;

      2)當(dāng)一個(gè)顯式光標(biāo)(靜態(tài)和動(dòng)態(tài))的 where 子句未找到時(shí)觸發(fā) %notfound;

      3)當(dāng)UPDATE或DELETE 語句的where 子句未找到時(shí)觸發(fā) sql%notfound;

      4)在光標(biāo)的提取(Fetch)循環(huán)中要用 %notfound 或%found 來確定循環(huán)的退出條件,不要用no_data_found。下面是幾個(gè)實(shí)例:

      create table BOOK(ID VARCHAR2(10)not null,BOOKNAME VARCHAR2(10)not null,v_student book%rowtype;

      cursor c_student(v_id binary_integer)is select * from book where id>v_id;

      open c_student(10);fetch c_student into v_student;

      close c_student;

      dbms_output.put_line(v_student.name);

      close c_student;

      end;begin

      open c_student;

      close c_student;

      end;begin

      end;

      PRICE

      VARCHAR2(10)not null,CID

      VARCHAR2(10)not null);--insert create or replace procedure say_hello(i_name in varchar2, o_result_msg out varchar2)as

      v_price varchar2(100);

      e_myException exception;begin

      --update or delete create or replace procedure say_hello(i_name in varchar2, o_result_msg out varchar2)as v_price varchar2(100);

      e_myException exception;

      begin

      --select create or replace procedure say_hello(i_name in varchar2, o_result_msg out varchar2)as

      v_price varchar2(100);

      e_myException exception;begin

      --loop方式遍歷游標(biāo)

      declare

      v_bookname varchar2(100);

      cursor c_book(i_id number)is select bookname from book where id = i_id;

      select price into v_price from book where bookname = i_name;

      o_result_msg := 'success';

      exception when no_data_found then rollback;

      o_result_msg := 'select into dail';

      update book set price = '55' where bookname = i_name;

      delete from book where bookname = i_name;

      if sql%notfound then raise e_myException;

      end if;

      /* if sql%rowcount = 0 then--寫法2 raise e_myException;end if;*/

      o_result_msg := 'success';

      exception when e_myException then rollback;

      o_result_msg := 'update or delete dail';

      insert into book(id,bookname,price)values(1,2,3);

      o_result_msg := 'success';

      exception when others then rollback;

      o_result_msg := substr(sqlerrm, 1, 200);

      end;end;end;begin

      declare

      while循環(huán)遍歷游標(biāo),注意,第一次游標(biāo)剛打開就fetch,%found為null,進(jìn)不去循環(huán)

      解決方法:

      while nvl(c_student%found,true)loop

      declare

      for循環(huán)遍歷,最簡(jiǎn)單,用的最多,不需要聲明v_student,Open和Close游標(biāo)和fetch操作(不用打開游標(biāo)和關(guān)閉游標(biāo),實(shí)現(xiàn)遍歷游標(biāo)最高效方式)

      declare

      v_bookname varchar2(100);

      cursor c_book(i_id number)is select bookname from book where id = i_id;

      Open c_book(i_id);

      while nvl(c_book%found,true)

      --或這種寫法:while c_book%found is null or c_book%found loop Fetch c_book

      update book set price = '33' where bookname = v_bookname;

      End Loop;

      Close c_book;

      v_bookname varchar2(100);

      cursor c_book(i_id number)is select bookname from book where id = i_id;

      Open c_book(i_id);

      Fetch c_book into v_bookname;

      While c_book%Found Loop

      update book set price = '33' where bookname = v_bookname;

      Fetch c_book into v_bookname;

      End Loop;

      Close c_book;

      Open c_book(i_id);

      Loop

      Fetch c_book into v_bookname;

      exit when c_student%notfound;

      update book set price = '33' where bookname = v_bookname;

      End Loop;

      Close c_book;

      end;

      begin

      end;

      begin

      into v_bookname;

      end;

      cursor c_book(i_id number)is select bookname from book where id = i_id;

      for cur in c_book(i_id)--直接將入?yún)_id傳入cursor即可

      loop

      update book set price = '53' where bookname = cur.bookname;

      end loop;

      begin

      end;goto例子,一般不推薦使用goto,會(huì)使程序結(jié)構(gòu)變亂

      declare

      Oracle存儲(chǔ)過程

      在談存儲(chǔ)過程書寫中的一些規(guī)則時(shí),先看一下執(zhí)行它的規(guī)則,在命令窗口執(zhí)行存儲(chǔ)過程sp_get_product_prompt set serveroutput on

      var ret1 varchar2(200);

      var ret2 varchar2(200);

      exec sp_get_product_prompt(83,:ret1,:ret2);--或execute print ret1;print ret2;或

      set serveroutput on

      declare

      ret1 varchar2(200);

      ret2 varchar2(200);

      sp_get_product_prompt(83,ret1,ret2);

      dbms_output.put_line(ret1);

      i number:=0;

      if i=0 then

      goto hello;

      end if;

      <>

      begin

      dbms_output.put_line('hello');

      goto over;

      begin

      end;

      <>

      begin

      dbms_output.put_line('world');

      goto over;

      end;

      <>

      dbms_output.put_line('over');

      end;begin

      dbms_output.put_line(ret2);

      end;存儲(chǔ)過程入?yún)?,不論類型,缺省情況下值都為null,入?yún)⒑统鰠⒉荒苡虚L(zhǎng)度,其中關(guān)鍵字as可以替換成is,存儲(chǔ)過程中變量聲明在as和begin之間,同時(shí),存儲(chǔ)過程中可以再調(diào)用其它的存儲(chǔ)過程,如果要保證存儲(chǔ)過程之間的事務(wù)處理不受影響,可以定義為自治事務(wù)。

      create or replace procedure say_hello(v_name in varchar2, v_flag number, o_ret out number)as

      begin

      對(duì)于入?yún)閚ull情況下給予缺省值

      create or replace procedure say_hello(i_name in varchar2, i_flag number, o_ret out number)

      as

      或直接在insert語句中調(diào)用nvl函數(shù)賦缺省值

      insert into phone(..,wname..,)values(..,nvl(v_name,' '),..);----如果將' '寫成'',則insert進(jìn)來的v_name值還是為''等價(jià)于null值

      帶一個(gè)參數(shù)的存儲(chǔ)過程

      輸入?yún)?shù)in,輸入?yún)?shù)不能進(jìn)行:=賦值,但可以將它賦給as后面定義的變量;

      輸入?yún)?shù)in,可以作為變量進(jìn)行條件判斷;默認(rèn)不寫就是in; 存儲(chǔ)過程沒有重載,這個(gè)有參的say_hello會(huì)替代已經(jīng)存在的無參say_hello。

      create or replace procedure say_hello(v_name in varchar2)

      as

      begin

      --v_name:='a';--存儲(chǔ)過程入?yún)_name不能做為賦值目標(biāo)

      dbms_output.put_line('hello '||v_name);

      v_name varchar2(100);

      if i_name is null then v_name := '0';

      else

      v_name := i_name;

      end if;

      insert into phone(..,wname..,)values(..,v_name,..);

      begin

      if v_name is null and v_flag is null then--v_name和v_flag都等于null

      o_ret := 10;

      else

      o_ret := 100;

      end if;

      end;end;end;

      存儲(chǔ)過程輸入?yún)?shù)作為變量進(jìn)行條件判斷

      create or replace procedure say_hello(i_opFlag in number)

      as

      利用存儲(chǔ)過程中定義的變量對(duì)入?yún)⒌目罩堤幚恚?/p>

      create or replace procedure say_hello(i_name in varchar2)

      as

      多個(gè)參數(shù)的存儲(chǔ)過程

      create or replace procedure say_hello(v_first_name in varchar2, v_last_name in varchar2)

      as

      begin

      out輸出參數(shù),用于利用存儲(chǔ)過程給一個(gè)或多個(gè)變量賦值,類似于返回值

      create or replace procedure say_hello(v_name in varchar2,v_content out varchar2)begin

      調(diào)用:

      declare

      v_con varchar2(200);

      v_in varchar2(20):='wang';

      v_content:='hello'||v_name;

      end;dbms_output.put_line('hello '||v_first_name||'.'||v_last_name);

      end;v_name varchar2(100);

      if i_name is null then v_name :='0';

      else v_name :=i_name;--將入賦值給定義變量

      end if;

      dbms_output.put_line('hello '||v_name);

      begin

      v_name varchar2(100);

      if i_opFlag = 1 then

      v_name :='0';

      else

      v_name :='haha';

      end if;

      dbms_output.put_line('hello '||v_name);

      begin

      end;end;begin

      in out參數(shù),既賦值又取值

      create or replace procedure say_hello(v_name in out varchar2)

      as

      begin

      v_name:='hi '||v_name;

      end;調(diào)用:

      declare

      對(duì)存儲(chǔ)過程入?yún)①x缺省值

      create or replace procedure say_hello(v_name varchar2 default 'susu', v_content varchar2 default 'hello')

      as

      begin

      調(diào)用:(用指明形參名的方式調(diào)用更好)

      begin

      say_hello();

      end;

      begin

      say_hello('cheng');

      end;

      begin

      PLSQL中的function FUNCTION和PROCEDURE的區(qū)別

      1、函數(shù)有返回值,過程沒有

      2、函數(shù)調(diào)用在一個(gè)表達(dá)式中,過程則是作為pl/sql程序的一個(gè)語句

      say_hello(v_name=>'cheng');

      end;dbms_output.put_line(v_name||' '||v_content);

      end;v_inout varchar2(20):='wangsu';

      say_hello(v_inout);

      dbms_output.put_line(v_inout);

      begin

      say_hello(v_in,v_con);

      dbms_output.put_line(v_con);

      end;end;

      過程和函數(shù)都以編譯后的形式存放在數(shù)據(jù)庫中,函數(shù)可以沒有參數(shù)也可以有多個(gè)參數(shù)并有一個(gè)返回值。

      過程有零個(gè)或多個(gè)參數(shù),沒有返回值。函數(shù)和過程都可以通過參數(shù)列表接收或返回零個(gè)或多個(gè)值,函數(shù)和過程的主要區(qū)別不在于返回值,而在于他們的調(diào)用方式,過程是作為一個(gè)獨(dú)立執(zhí)行語句調(diào)用的,函數(shù)以合法的表達(dá)式的方式調(diào)用

      create or replace function func(v_name in varchar2)return varchar2

      is begin

      return(v_name||' hello');

      end;

      調(diào)用:

      declare

      v_name varchar2(20);

      begin

      v_name:=func('cheng');

      dbms_output.put_line(v_name);

      end;

      帶out參數(shù)的函數(shù)

      create or replace function func(v_name in varchar2, v_content out varchar2 return varchar2

      is

      begin

      v_content:=v_name||' hello';

      return v_content;

      end;

      調(diào)用:

      declare

      v_name varchar2(20);

      v_name1 varchar2(20);

      begin

      v_name1:=func('susu',v_name);--返回v_name值

      dbms_output.put_line(v_name1);--打印func結(jié)果

      dbms_output.put_line(v_name);--打印v_name結(jié)果

      end;帶in out 參數(shù)的函數(shù)

      create or replace function func(v_name in out varchar2)return varchar2

      is

      begin

      v_name:=v_name||' hello';

      return 'cheng';)

      end;調(diào)用:

      declare

      v_inout varchar2(20):='world';

      v_ret varchar2(20);

      v_ret:=func(v_inout);--返回調(diào)用v_inout值(作為出參)

      dbms_output.put_line(v_ret);--打印func結(jié)果

      dbms_output.put_line(v_inout);--返回v_name結(jié)果

      begin

      end;

      第五篇:Oracle使用工具plsql遠(yuǎn)程連接問題

      使用PL/SQL Developer遠(yuǎn)程連接Oracle數(shù)據(jù)庫,本地機(jī)器上已經(jīng)安裝了Oracle數(shù)據(jù)庫只要

      1.配置tnsnames.ora(我的安裝在D:oracleproduct10.2.0db_1networkADMIN)

      2.登錄plsql時(shí)填寫相應(yīng)信息

      第一步:配置tnsnames.ora

      找到tnsnames.ora文件,用記事本方式打開,你可以看到像如下配置信息

      ORCL =

      (DESCRIPTION =

      (ADDRESS =(PROTOCOL = TCP)(HOST = 127.0.0.1)(PORT = 1521))

      (CONNECT_DATA =

      (SERVER = DEDICATED)

      (SERVICE_NAME = orcl)))

      上面這段是連接本地(安裝好Oracle默認(rèn)的,你也可以修改數(shù)據(jù)庫別名,將“ORCL”換成其他的)的數(shù)據(jù)庫的要連接遠(yuǎn)程的Oracle數(shù)據(jù)庫則再增加配置信息如下

      自己定義遠(yuǎn)程數(shù)據(jù)庫名稱(別名)=

      (DESCRIPTION =

      (ADDRESS =(PROTOCOL = TCP)(HOST = 遠(yuǎn)程服務(wù)器IP)(PORT = 1521))

      (CONNECT_DATA =

      (SERVER = DEDICATED)

      (SERVICE_NAME = 遠(yuǎn)程服務(wù)器上數(shù)據(jù)庫名稱)))

      注意:別名不能與其他數(shù)據(jù)庫(本地、遠(yuǎn)程)的別名相同,它可以跟相應(yīng)遠(yuǎn)程服務(wù)器上的數(shù)據(jù)庫名稱不一樣,要連接多個(gè)遠(yuǎn)程Oracle數(shù)據(jù)庫,照樣子在來幾段上述配置信息即可。

      第二步:登錄plsql

      Username:

      Password:

      Database:要登錄的數(shù)據(jù)庫名稱(別名)

      Connect as:

      注意:一定要寫對(duì)上面面的紅色部分(其余的3個(gè)字段我就不說了),且跟tnsnames.ora配置文件中的別名相同

      知道這兩步后,以后不管是遠(yuǎn)程還是本地上的數(shù)據(jù)庫你想怎么連就怎么連!只是tnsnames.ora文件中多了幾段配置信息。

      下載plsql教學(xué)(本站推薦)word格式文檔
      下載plsql教學(xué)(本站推薦).doc
      將本文檔下載到自己電腦,方便修改和收藏,請(qǐng)勿使用迅雷等下載。
      點(diǎn)此處下載文檔

      文檔為doc格式


      聲明:本文內(nèi)容由互聯(lián)網(wǎng)用戶自發(fā)貢獻(xiàn)自行上傳,本網(wǎng)站不擁有所有權(quán),未作人工編輯處理,也不承擔(dān)相關(guān)法律責(zé)任。如果您發(fā)現(xiàn)有涉嫌版權(quán)的內(nèi)容,歡迎發(fā)送郵件至:645879355@qq.com 進(jìn)行舉報(bào),并提供相關(guān)證據(jù),工作人員會(huì)在5個(gè)工作日內(nèi)聯(lián)系你,一經(jīng)查實(shí),本站將立刻刪除涉嫌侵權(quán)內(nèi)容。

      相關(guān)范文推薦

        oracle plsql 開窗函數(shù)over學(xué)習(xí)總結(jié)

        連續(xù)求和與求總和的區(qū)別 D 為天,S 為銷售業(yè)績(jī)?yōu)槊刻煊?jì)算銷售總額。 SELECTSUM(s) OVER (ORDERBY d), SUM(s) OVER FROM (SELECT'A'"A",1 D, 20 SFROM DUAL UNIONALL SELEC......

        解決64位win7下plsql連接64位oracle的問題

        解決win7 x64系統(tǒng)下PL/SQL無法連接64位Oracle數(shù)據(jù)庫的方法 #問題描述:確定安裝好Oracle 11g 64位客戶端、PL/SQL developer(不區(qū)分32/64)后,打開PL/SQL,無法選擇數(shù)據(jù)庫實(shí)例,如下圖......

        使用PLSQL創(chuàng)建Oracle數(shù)據(jù)庫User用戶并設(shè)置權(quán)限(共五則范文)

        使用PLSQL 創(chuàng)建Oracle數(shù)據(jù)庫Users用戶并設(shè)置權(quán)限 1、 首先在 PLQL Developer 中打開數(shù)據(jù)庫。使用 "sys" 用戶,輸入數(shù)據(jù)庫名稱,輸入該數(shù)據(jù)庫 ”sys” 用戶的密碼,在 ”Connect a......

        Oracle服務(wù)測(cè)試連接成功,但是用PLSQL連接提示無法解析指定的連接標(biāo)識(shí)符

        Oracle服務(wù)測(cè)試連接成功,但是用PL/SQL連接提示“無法解析指定的連接標(biāo)識(shí)符” 問題分析:可能是安裝了ORACLE的客戶端軟件,而你只在ORACLE安裝程序下配置服務(wù),而沒有在ORACLE的客......

        教學(xué)

        教學(xué)設(shè)計(jì) 一、課前系統(tǒng)部分 (一)課標(biāo)分析 行為動(dòng)詞“掌握”是指在理解的基礎(chǔ)上,把對(duì)象用于新的情境。行為動(dòng)詞“認(rèn)識(shí)”是指描述對(duì)象的特征和由來,闡述此對(duì)象與相關(guān)對(duì)象之間的區(qū)......

        教學(xué)

        第三節(jié) 比熱容 教學(xué)目標(biāo) 1、知識(shí)與技能 (1) 了解比熱容的概念,知道比熱容是物質(zhì)的一種屬性 (2) 嘗試用比熱容解釋簡(jiǎn)單的自然現(xiàn)象 (3) 能根據(jù)比熱容進(jìn)行簡(jiǎn)單的熱量計(jì)算 2、過程與方......

        教學(xué)

        中學(xué)英語教學(xué)法需走“折中”之路 關(guān)鍵字:折中 直接法 教學(xué)法 交際法 聽說法 人類外語教學(xué)活動(dòng)的起源同步于世界各國(guó)各民族之間的政治、經(jīng)濟(jì)、文化交往,但將外語教學(xué)活動(dòng)理論化......

        教學(xué)

        教學(xué)點(diǎn)滴: 大治中心校用分?jǐn)?shù)解決問題的基本方法是 首先,找出數(shù)學(xué)問題中的單位“1”,看他們的單位“1”是不是相同,若單位“1”不同,就變成同一單位“1”。 其次,想單位“1”已知,就......