oracle DB 11g编程实战读书笔记(1)

PL/SQL 基础
    1.PL/SQL块
        PL/SQL中的块分为两种类型:匿名块和命名块.
        匿名块具有有限的作用域,可以在脚本或其他程序单元中使用匿名块程序。其作用域仅限于包含匿名块程序的程序单元或脚本。不能按名称从其他块调用匿名块。匿名块程序单元可以引用外部或主调作用域中的任何变量。
        在定义或声明“命名块”程序时,共有4种可能的部署作用域,分别具有不同的行为和作用域。
        1.作为函数或过程直接保存在模式中,
            (1)可以从定义它们的模式中调用;
            (2)可以从另一个已被授权执行相应命名程序单元的模式中调用;
            (3)可以通过DB_LINK 调用模式级程序。
        2.将命名块程序保存在包中,
            (1)发布包函数或过程;
            (2)独占地将函数或过程保存在包主体。
        3.保存在用户定义类型内部。
        4.保存在匿名或命名块程序的声明块中。
    
    1.1基本结构
        ===================================
        [DECLARE]
            declaration_statements
        BEGIN
            execution_statements
        [EXCEPTION]
            exception_handling_statements
        END;
        /
        ===================================
    
    1.2最小单元
        ======================
        BEGIN
            NULL;
        END;
        /
        =====================
        
        Tips:
            '/' 符号表示执行单元。
        
    1.3输入输出
    1.3.1 替代变量
        ==============================================
        SQL> set serveroutput on;
        SQL> declare
          2  lv varchar2(30);
          3  begin
          4  lv := '&input';
          5  dbms_output.put_line('hello'||lv||'.');
          6  end;
          7  /
        Enter value for input: world -----by oracle
        old   4: lv := '&input';
        new   4: lv := 'world';
        helloworld.
    
        PL/SQL procedure successfully completed.
        
        SQL>
        ==============================================
        
        Tips:
            尽量在执行块中进行赋值或初始化,除非局部变量是常量或被视为常量。这样,可以消除许多运行时的赋值错误。
    
    EXTENDS:
        1.注意避免使用PL/SQL 中的保留字和关键字。可以使用命令:
        SQL> help reserved words (pl/sql)
        得到保留字。
        
        2.set serveroutput on;
            打开输出功能;
        
        3.SET VERIFY OFF;(SET VERIFY ON;)
                在设置为ON的时候,如果查询的sql语句中包含有变量的话,在用户输入变量值的时候,会在结果中将发生变化前后的语句输出来,而如果设置为OFF的话,则不展示这个。
    1.3.2 绑定变量
        绑定变量使用冒号作为前缀,例如 :id,可以在SQLPLUS会话的作用域内定义绑定变量。在此作用域内,只能使用 CHAR、CLOB、NCHAR、NCLOB、NUMBER、NVARCHAR2、REFCURSOR 和VARACHAR2 数据类型。
        可以使用 variable 关键字来创建 sqlplus 会话变量。不应该在声明块中对绑定变量赋值。
        SQL> variable lv varchar2(30)
        SQL> begin
      2  :lv := 'victor';
      3  end;
      4  /
        PL/SQL procedure successfully completed.

        SQL> set serveroutput on;
        SQL> declare
          2  lv_who varchar2(30);
          3  begin
          4  lv_who := :lv;
          5  dbms_output.put_line('hello'||lv_who||'!');
          6  end;
              7  /
        hellovictor!
        PL/SQL procedure successfully completed.

    EXTENDS:

  1.set define off;
            关闭替代变量功能;

    1.3.3 命名块
        上述使用的均为匿名块,下面介绍命名块的使用。
        1.过程块
            SQL>create or replace procedure hello (pv in varchar2) is
             2 begin
             3    dbms_output.put_line ('hello' ||pv||'!');
             4 end;
             5 /
            执行方法如下:
                SQL>EXECUTE hello ('victor');
                或
                SQL>begin
                 2 hello('victor');
                 3 end;
                 4 /
        2.函数块
            函数必须有返回值!
            SQL>create or replace FUNCTION hello (pv in varchar2) return varchar2 is
             2 begin
             3     return 'hello'||pv||'!';
             4 end;
             5 /
             执行方法如下:
                SQL>variable result varchar2(20)
                SQL>CALL hello('victor') into :result;
                SQL>print :result
                or sql>select :result from dual;
        3.嵌套块
            命名块还可以嵌套在其他命名块或匿名块中。但要注意调用顺序,因为嵌套命名块并不是已发布的,这意味着调用一个命名块的时候,被调用的命名块可能还没有定义。这种类型的设计问题也被称为“作用域错误”。

    例子:

Declare
    procedure a is 
    begin
        dbms_output.put_line(b||'hello world');
    end a;
    function b return varchar2 is
    begin
        return 'hello,';
    end b;
begin
    a;
end;
/

    此程序会产生超出作用域错误!而使用前向引用可以解决这个问题。

Declare
    procedure a ;
    function b return varchar2;       
    procedure a is 
    begin
        dbms_output.put_line(b||'hello world');
    end a;
    function b return varchar2 is
    begin
        return 'hello,';
    end b;
begin
    a;
end;
/

 

你可能感兴趣的:(oracle DB 11g编程实战读书笔记(1))