`

PL/SQL学习笔记一

阅读更多
1、 PL/SQL的塊結構
Declare
        /*
Declare section-PL/SQL variables,types,cursors,and local subprograms go here.
        */
Begin
        /*
               Executable section-procedural and SQL statements go here.
               This is ths main section of the bloack and the only one that is required.
        */
Exception
        /*
               Exception-handling section-error-handing statements go here
*/
End;
注: 每個塊的結尾都要用分號結束
如下
declare
    fmajor varchar(50):='Chemistary';
    ffirstName varchar(50):='Fff';
    flastName varchar(50):='LB';
begin
    update students 
    set major=fmajor
    where first_name=ffirstName
    and last_name=flastName;
    
    if SQL%NOTFOUND THEN
        insert into students
        values(student_sequence.NEXTVAL,ffirstName,flastName,fmajor);
    end if;
end;
 

2、 錯誤處理
/**錯誤處理開始**/
Declare
    v_ErrorCode number;         --code for the error
    v_ErrorMsg varchar2(200);   --Message text for the error
    v_CurrentUser varchar2(20) --Current database user
    v_Information varchar2(100) --Information about the error
Begin
    /*Code that processes some data here*/
 
Exception
    when others then
       --Assign values to the log variables,using built-in function
       v_ErrorCode:=SQLCODE;
       v_ErrorMsg:=SQLERRM;
       v_currentUser:=USER;
       V_Information:='Error encountered on' || to_char(SYSDATE) || ' by database user' || v_CurrentUser;
       
       --Insert the log message into log_table.
       Insert into log_table(code,message,infro) values(v_ErrorCode,v_ErrorMsg,v_ErrorInfomation);
end;
/**錯誤處理結束**/


3、變量及類型
自帶基本類型
用戶自定義類型:
           
  Declare
       type t_StudentRecord is record(
           FirstName varchar2(50);
           LastName varchar2(50);
           CurrentCredits number(3);
       );
定義:v_Student t_StudentRecord;
4、過程
1)這里先介紹一個錯誤過程,也是很多初學者都會犯的問題
錯誤過程 1:
CREATE or replace PROCEDURE changOrInsert AS
Declare              --<出錯誤之處。原因,受塊結構的影響>
    fmajor students.major%type:='Chemistary';
    ffirstName students.first_name%type:='Fff';
    flastName students.last_name%type:='LB';
begin
    update students set major=fmajor where first_name=ffirstName and last_name=flastName;   
end changOrInsert;  
   
錯誤過程 2:
CREATE or replace PROCEDURE changOrInsert AS
    fmajor students.major%type:='Chemistary';
    ffirstName students.first_name%type:='Fff';
    flastName students.last_name%type:='LB';
begin
    update students set major=fmajor where first_name=ffirstName and last_name=flastName;    
    if SQL%NOTFOUND THEN
        insert into students
        values(student_sequence.NEXTVAL,ffirstName,flastName,fmajor);
    end if;
exception 
    ;             --<問題處。原因: 受其它開發語言如JAVA的影響>
end changOrInsert;
錯誤過程3:
create or replace procedure addNewColumn
as
    firstID int:=10140;
    beginMark int:=65;
    loopTime int:=1;
begin
--仔細看下面這一條詔句。沒錯呀! 真的嗎?( 就錯在這里)
alter table students add mark int;
--execute immediate 'alter table students add mark1 int';( 這句才是對的)
    loop
       update students set mark=beginMark where id=firstID;
       firstID:=firstID+1;
       beginMark:=beginMark+1;
       loopTime:=loopTime+1;
       exit when loopTime>20;
    end loop;
end addNewColumn;

2)過程的基本結構:
Create [or replace] procedure procedure_name [parameter_list] as
    /*Declarative section is here*/
Begin
    /*Executable section is here*/ 
Exception
    /*Exception is here*/
End [procedure_name];


3) 一個完整的過程
/*Create a Procedure*/
CREATE or replace PROCEDURE changOrInsert(
    fmajor students.major%type,
    ffirstName students.first_name%type,
    flastName students.last_name%type) AS
    
    v_ErrorCode number;
    v_ErrorMsg varchar(200);
    v_currentUser varchar(50);
    v_Information varchar(500);
begin
    update students set major=fmajor where first_name=ffirstName and last_name=flastName;
    
    if SQL%NOTFOUND THEN     --if not found the record
        insert into students --then insert a new one
        values(student_sequence.NEXTVAL,ffirstName,flastName,fmajor);
    end if;
exception 
    --write exception into table log_table
    when others then
       --Assign values to the log variables,using built-in function
       v_ErrorCode:=SQLCODE;
       v_ErrorMsg:=SQLERRM;
       v_currentUser:=USER;
       v_Information:='Error encountered on' || to_char(SYSDATE) || ' by database user ' || v_CurrentUser;       
       --Insert the log message into log_table.
       Insert into log_table(code,message,info) values(v_ErrorCode,v_ErrorMsg,v_Information);
end changOrInsert;


4) 執行存儲過程
       begin
    changOrInsert('Feng','LiBin','Computer');
end;

       而不是像在SQL SERVER中的Call來調用
5、函數
       --
6、包
1)寫的第一個包, 花了不少的檢查時間(有點類似于JAVA中的接口)
表的結構如下圖:

create or replace package manageStu as
 
    procedure addStu(firstname students.first_name%type,
                   lastname students.last_name%type,
                   majorm students.major%type,
                   current_credits students.current_credits%type,
                   markm students.mark%type);
    procedure delStu(stuID int);
    
    procedure modifyStu(idm int,
                     firstname students.first_name%type,
                      lastname students.last_name%type,
                      majorm students.major%type,
                      current_creditsm students.current_credits%type,
                      markm students.major%type);
 
end manageStu;

create or replace package body manageStu as
 
    procedure addStu(firstname students.first_name%type,
                   lastname students.last_name%type,
                   majorm students.major%type,
                   current_credits students.current_credits%type,
                   markm students.mark%type)
    as
    begin
       insert into students values(student_sequence.NEXTVAL,
                                firstname,
                                lastname,
                                majorm,
                                current_credits,
                                markm);
    end addStu;

   
    procedure delStu(stuID int)
    as
    begin
       delete students where id=stuID;
    end delStu;
    
    procedure modifyStu(idm int,
                     firstname students.first_name%type,
                      lastname students.last_name%type,
                      majorm students.major%type,
                      current_creditsm students.current_credits%type,
                      markm students.major%type)
    as
    begin
       update students set 
       first_name=firstname,
       last_name=lastname,
       major=majorm,
       current_credits=current_creditsm,
       mark=markm 
       where id=idm;
    end modifyStu;
 
end manageStu;

2)執行:
    begin
    manageStu.addstu('F1','LB','computer',12,90);
end;

3) 包內過程、方法可以重載
4) 包的初使化
         當第一次調用打包程序時,該包將進行初使化。也就是說將該包從硬盤讀入到內存并啟動調用的子程序的編譯代碼開始運行。這時,系統為該包中定義的所有變量分配內存單元。每個會話都有其打包變量的副本,以確保一包子程序的兩個對話使用不同的內存單元。
         在大多數情況下,初使化代碼要在包第一次初使化時運行。為了實現這種功能,我們可以在包體中所有對象之后加入一個初使化部分,其語法如下:
         CREATE OR REPLACE PACEAGE BODY package_name (IS|AS)
                   . . .
         BEGIN
                   Initialization_code;
         END [package_name]

  

7、取當前系統時間
       SELECT TO_CHAR(SYSDATE,'SSSSS') FROM sys.dual;

8、更改表結構
 
     ALTER TABLE STU MODIFY FIRST_NAME VARCHAR(100);

       注: 一定是MODIFY而不是sql server中的ALTER
分享到:
评论

相关推荐

    pl/sql学习笔记

    以下是对PL/SQL的学习笔记的详细解析: 1. **什么是PL/SQL语言** PL/SQL是Oracle数据库为数据库管理员和开发人员设计的一种编程语言。它扩展了SQL的功能,允许编写包含控制结构、变量、过程和函数的程序段,这些...

    PL/SQL学习笔记

    PL/SQL是Oracle公司开发的一种过程化SQL扩展,它是Oracle数据库的重要组成部分,用于在数据库服务器上编写存储过程、函数、触发器、包等可执行代码。PL/SQL可以处理复杂的数据操作和业务逻辑,支持编程结构如循环、...

    pl/sql数据库学习笔记

    PL/SQL数据库学习笔记 PL/SQL是一种高级的程序语言,主要用于Oracle数据库管理系统中。下面是PL/SQL数据库学习笔记的知识点总结。 一、基本原则 *瀑布模型:需求分析→设计(概要设计,详细设计:SQL语句,变量...

    PL/SQL学习教程,附笔记

    PL/SQL,全称是Procedural Language/Structured Query Language,是Oracle数据库提供的一种结合了SQL语言和过程式编程的编程环境。它扩展了SQL的功能,使得开发人员能够编写复杂的数据库应用程序,处理事务、实现...

    我的PL/SQL学习笔记(一)

    在这个“我的PL/SQL学习笔记(一)”中,我们将探讨PL/SQL的基础知识,包括其语法结构、变量声明、流程控制以及如何与Oracle数据库中的数据进行交互。 首先,PL/SQL的基本结构分为声明部分、执行部分和异常处理部分...

    PL/SQL学习笔记4

    ### PL/SQL学习笔记4 —— 集合与成员函数 #### 一、PL/SQL 表(索引表) 在PL/SQL中,**索引表**(也称为**PL/SQL表**)是一种非常有用的结构,它类似于数组但具有更多的灵活性。这种表是非持久化的,即它们不会...

    ORACLE PL/SQL从入门到精通

    ORACLE PL/SQL是从入门到精通的专业知识,涵盖了数据库开发与管理的多个方面,包括...这本书籍将为读者提供一个全面、系统的学习路径,帮助数据库管理员、开发人员深入理解并掌握ORACLE PL/SQL的强大功能和应用技巧。

    PL/SQl超级笔记

    总的来说,“PL/SQL超级笔记”应该涵盖了从基本语法到高级特性的全面教程,通过学习,新手可以逐步掌握如何使用PL/SQL进行数据库编程,从而更好地管理和操作Oracle数据库。配合"oracle_ppt"中的PPT材料,学习效果会...

    PL/SQL学习笔记6

    在PL/SQL编程中,游标是处理查询结果集的重要工具。它们允许程序逐行处理结果,而不是一次性加载所有数据,这对于大型数据集尤其有用,因为它可以节省内存并提高性能。下面将详细解释游标的基本概念、分类以及如何在...

    PL/SQL听课笔记

    ### PL/SQL听课笔记 #### 一、PL/SQL简介 **PL/SQL**(Procedural Language for SQL)是一种专门为Oracle数据库设计的过程化语言扩展。它是在标准SQL基础上增加了一系列高级编程特性,如变量、控制结构、函数、...

    PL/SQL学习笔记7

    权限管理是PL/SQL中不可忽视的一部分。与表和视图的SELECT, INSERT, UPDATE, DELETE权限不同,过程具有EXECUTE权限。只有拥有EXECUTE权限的用户才能执行存储过程。例如,可以通过`GRANT`命令将执行权限授予特定用户...

    PL/SQL学习笔记5

    在PL/SQL的学习中,分区是数据库管理大型数据集的一种高效方法,特别是在处理大数据量时。本篇笔记主要探讨了何时应该使用分区以及Oracle支持的分区类型。 首先,当面对超过2GB的大数据表时,分区是十分必要的。这...

    sql,PL/SQl学习笔记

    本文将深入探讨从"SQL,PL/SQL学习笔记"中提取的关键知识点,帮助编程人员更好地理解和运用这两种语言。 首先,我们关注SQL并行查询。通过`ALTER SESSION ENABLE PARALLEL DMl`,我们可以开启会话的并行DML操作,这...

    oracle/SQL和PL/SQL课堂笔记

    这篇课堂笔记主要涵盖了基础的SQL查询语法和部分PL/SQL概念。 首先,SQL查询的基础是从数据库中选择数据。`SELECT`语句用于指定需要选取的列,如`SELECT ename, sal, job FROM emp;`。字段顺序可以自由调整,例如`...

    pl/sqle学习笔记

    ### PL/SQL 学习笔记知识点详解 #### 1. PL/SQL 基本结构 - **DECLARE**: 在此部分声明变量、常量、数据类型及游标。 - **BEGIN**: 主程序体开始,可以包含任何合法的PL/SQL语句。 - **EXCEPTION**: 异常处理部分,...

Global site tag (gtag.js) - Google Analytics