6.PL_SQL——注释、数据类型的转换、变量的范围和限定词标签

一、PL/SQL块的词法

PL/SQL中可以使用字母、数字、空格和特殊符号等,主要包括:

标识符——变量、关键字、保留字

分隔符——分号,逗号,加号或减号等

常量——字符串,数字,布尔型变量

注释——单行注释、多行注释

编写PL/SQL程序时,需要注意以下两点:

1. 字符和日期必须使用单引号引用,单引号中间可以引用双引号。

2. 数字可以是单独的数字,也可以使科学计数法。

为了养成良好的编程,最好使用tab键对代码进行缩进,有关键字的行回车另起一行,以使程序更加易读,逻辑结构更加清晰。

二、注释

PL/SQL和其他编程语言一样,也经常需要用到注释。注释部分程序执行时会自动忽略。它的注释主要有两种:

1. 单行注释:使用-- 表示,注释的范围仅限于-- 所在的行;

2. 多行注释:使用/* */表示,注释的范围是/* */所包含的所有行。

如下面这个例子,就同时用到了单行注释和多行注释:

SQL> edit

DECLARE
        v_annual_sal NUMBER (9,2);
        monthly_sal NUMBER;
BEGIN
        /*
        Compute the annual salary based on themonthly salary
        input from the user
        */
                -- 使用了多行注释
        monthly_sal := 3000;
        v_annual_sal := monthly_sal * 12;
        -- The following line displays theannual salary
                -- 使用了单行注释
        DBMS_OUTPUT.PUT_LINE(v_annual_sal);
END;
/

SQL> /

36000
PL/SQL procedure successfullycompleted.

三、SQL函数在PL/SQL中的应用

PL/SQL和SQL是无缝衔接的,因此SQL的很多函数可以在PL/SQL中直接引用,比如SQL中的单行函数可以直接使用;但是一些GROUP函数和DECODE函数则无法在PL/SQL中使用。不过PL/SQL有自己的条件控制语句,可以做更为灵活的操作。

下面举几个SQL函数在PL/SQL中使用的例子:

SQL> edit

DECLARE
        v_desc_size INTEGER(5);
        v_prod_description VARCHAR2(70) := ‘Youcan use this product with your radios for higher frequency‘;
BEGIN
        v_desc_size :=LENGTH(v_prod_description);
                -- 这里使用了SQL的函数LENGTH()
        DBMS_OUTPUT.PUT_LINE(v_desc_size);
END;
/

SQL> /

62
 PL/SQL procedure successfully completed.

需要注意的是,Oracle11g之前,PL/SQL中使用递增函数(Sequences)的方法是:

DECLARE
        v_new_id NUMBER;
BEGIN
        SELECT my_seq.NEXTVAL INTO v_new_idFROM Dual;
                -- 需要写成完整的形式
END;

但是在Oracle11g之后,递增函数简化成如下的形式:

DECLARE
        v_new_id NUMBER;
BEGIN
        v_new_id := my_seq.NEXTVAL;
                -- 可以写成简化的形式了
END;

四、数据类型的转换

PL/SQL中要进行转换的数据必须是相似的,比如数字123和字符串’123’是可以互相转换的,但是’abc’则不能转换为数字。

PL/SQL中数据类型的转换主要分两类:

1. 隐式转换——隐式转换是指数据会自动转换。但是需要注意的是,自动转换受制于NLS环境变量,如果环境变量没有进行相应的配置,则有可能无法转换,因此不推荐这种方式。

下面看一个数据类型转换的例子:

SQL> edit

DECLARE
        a_number NUMBER;
BEGIN
        a_number := ‘125‘;
                                -- ‘125‘是个字符串
        a_number := a_number + 3;
                                --‘125‘自动转换成了数字
        DBMS_OUTPUT.PUT_LINE(to_char(a_number,‘9999‘));
                                -- 使用了to_char这个函数进行显示转换
END;
/

SQL> @notes/s1.sql

128
PL/SQLprocedure successfully completed.

2. 显式转换——使用专用的函数来转换。如TO_CHAR,TO_DATE, TO_NUMBER, TO_TIMESTAMP等函数。

如要进行日期转换:

SQL> edit

DECLARE
        v_date_of_joining DATE;
BEGIN
        v_date_of_joining := TO_DATE(‘February02,2000‘,‘Month DD, YYYY‘);
                -- 使用TO_DATE这个函数进行显式转换
       DBMS_OUTPUT.PUT_LINE(v_date_of_joining);
END;
/

SQL> /

02-FEB-00
PL/SQLprocedure successfully completed.

五、块的嵌套

 A. 嵌套块可以放的位置

PL/SQL可以嵌套其他的块,被嵌套的块可以放在以下两个部分:

1. 可执行部分,即BEGIN处;

2. 异常处理部分,即EXCEPTION部分。

需要注意的是,嵌套块最多不要超过3层。

      B. 变量的范围(SCOPE):

内层嵌套块可以引用外层块中声明的变量;

但是外层块不可以引用内层块中声明的变量。

下面来看一个变量引用范围的例子:

SQL> edit

DECLARE
        v_outer_variable VARCHAR2(20) :=‘GLOBAL _VARIABLE‘;
                                -- 声明在外层块中的变量
BEGIN
        DECLARE
                v_inner_variable VARCHAR2(20):= ‘LOCAL VARIABLE‘;
                                -- 声明在内层块中的变量
        BEGIN
               DBMS_OUTPUT.PUT_LINE(v_inner_variable);
                                -- 内层块中的函数可以引用内层块声明的变量
               DBMS_OUTPUT.PUT_LINE(v_outer_variable);
                                -- 内层块的函数也可以引用外层块声明的变量
        END;
                                DBMS_OUTPUT.PUT_LINE(v_outer_variable);
                                -- 外层块只能引用声明在外层块的变量
 END;

SQL> /

LOCALVARIABLE
GLOBAL_VARIABLE
GLOBAL_VARIABLE
PL/SQLprocedure successfully completed.

如果修改一下,在外层块里引用一下内层块的变量:

 SQL> edit

DECLARE
        v_outer_variable VARCHAR2(20) :=‘GLOBAL _VARIABLE‘;
BEGIN
        DECLARE
                v_inner_variable VARCHAR2(20):= ‘LOCAL VARIABLE‘;
        BEGIN
               DBMS_OUTPUT.PUT_LINE(v_inner_variable);
               DBMS_OUTPUT.PUT_LINE(v_outer_variable);
        END;
        DBMS_OUTPUT.PUT_LINE(v_outer_variable);
        DBMS_OUTPUT.PUT_LINE(v_inner_variable);
END;
/

SQL> /

        DBMS_OUTPUT.PUT_LINE(v_inner_variable);
                             *
ERRORat line 11:
ORA-06550:line 11, column 23:
PLS-00201:identifier ‘V_INNER_VARIABLE‘ must be declared
ORA-06550:line 11, column 2:
PL/SQL:Statement ignored
-- 报错了,说明无法引用内层块声明的变量

                C.变量的可见性(visibility

如果声明变量时出现了重名的情况,则采用就近原则,优先采用本地的变量,而在外层块中的变量会被覆盖(invisibility)。

下面来看一个变量名重名的例子:

SQL> edit

--Example about variable scope and visibility in nest blocks
 
DECLARE
        v_father_name VARCHAR2(20) :=‘Patrick‘;
        v_date_of_birth DATE := ‘20-Apr-1972‘;
              -- 定义了父亲的名字和生日
BEGIN
        DECLARE
                v_child_name VARCHAR2(20) :=‘Mike‘;
                v_date_of_birth DATE :=‘12-Dec-2002‘;
              -- 定义了儿子的名字和生日
        BEGIN
                DBMS_OUTPUT.PUT_LINE(‘Father‘‘sName: ‘ || v_father_name);
                DBMS_OUTPUT.PUT_LINE(‘Date ofBirth: ‘ || v_date_of_birth);
              -- 这里引用了父亲的名字
              --但是根据就近原则,引用了儿子的生日
                DBMS_OUTPUT.PUT_LINE(‘Child‘‘sName: ‘ || v_child_name);
              -- 引用了儿子的名字
        END;
        DBMS_OUTPUT.PUT_LINE(‘Date of Birth: ‘|| v_date_of_birth);
              -- 内层块执行结束后内存被释放,此时引用的是父亲的生日
END;
/

SQL> /

Father‘sName: Patrick
Dateof Birth: 12-DEC-02
-- 父亲的名字,儿子的生日
Child‘sName: Mike
Dateof Birth: 20-APR-72
 --儿子的名字,父亲的生日
PL/SQLprocedure successfully completed.

D.使用限定词标签引用变量

如果要内层块一定要引用外层块的变量,在声明时使用标签,引用时指定标签作为修饰语,则可以避免变量覆盖的情况。

看下面这组例子:

SQL> edit

BEGIN<<outer>>
--使用了标签<<outer>>
DECLARE
        v_father_name VARCHAR2(20) :=‘Patrick‘;
        v_date_of_birth DATE := ‘20-Apr-1972‘;
BEGIN
        DECLARE
                v_child_name VARCHAR2(20) :=‘Mike‘;
                v_date_of_birth DATE :=‘12-Dec-2002‘;
        BEGIN
                DBMS_OUTPUT.PUT_LINE(‘Father‘‘sName: ‘ || v_father_name);
                DBMS_OUTPUT.PUT_LINE(‘Date ofBirth: ‘ || outer.v_date_of_birth);
                                -- 引用变量时指明该变量是外层块中的变量。
                DBMS_OUTPUT.PUT_LINE(‘Child‘‘sName: ‘ || v_child_name);
                DBMS_OUTPUT.PUT_LINE(‘Date ofBirth: ‘ || v_date_of_birth);
                                -- 这里引用的变量是内层块的变量
        END;
 
END;
END outer;

SQL> /

Father‘sName: Patrick
Dateof Birth: 20-APR-72
Child‘sName: Mike
Dateof Birth: 12-DEC-02
--这一次父亲的名字和生日、孩子的名字和生日能够匹配了
PL/SQLprocedure successfully completed.

当然,也可以同时使用outer和inner标签

SQL> edit

BEGIN<<outer>>
-- 使用outer标签
DECLARE
        v_father_name VARCHAR2(20) :=‘Patrick‘;
        v_date_of_birth DATE := ‘20-Apr-1972‘;
BEGIN<<inner>>
-- 使用inner标签
        DECLARE
          v_child_name VARCHAR2(20) :=‘Mike‘;
          v_date_of_birth DATE :=‘12-Dec-2002‘;
        BEGIN
          DBMS_OUTPUT.PUT_LINE(‘Father‘‘sName: ‘ || v_father_name);
          DBMS_OUTPUT.PUT_LINE(‘Date ofBirth: ‘ || outer.v_date_of_birth);
                       -- 引用时指明是outer的变量
          DBMS_OUTPUT.PUT_LINE(‘Child‘‘sName: ‘ || v_child_name);
          DBMS_OUTPUT.PUT_LINE(‘Date ofBirth: ‘ || inner.v_date_of_birth);
                -- 引用时指明是inner的变量
        END;
END;
ENDouter;
/

SQL> /

Father‘sName: Patrick
Dateof Birth: 20-APR-72
Child‘sName: Mike
Dateof Birth: 12-DEC-02
 -- 和上一次的执行结果是一致的
PL/SQLprocedure successfully completed.

限定词除了可以明确指定外,还可以使用包名、Procedure的名字。使用限定词来引用变量,是一个很好的编程习惯,可以防止混淆和冲突。

6.PL_SQL——注释、数据类型的转换、变量的范围和限定词标签,布布扣,bubuko.com

时间: 2024-11-10 01:10:54

6.PL_SQL——注释、数据类型的转换、变量的范围和限定词标签的相关文章

day02_变量_基本数据类型_数据类型的转换_Scanner_20150731

回顾: 昨天主要讲了3个方面的内容: 1.Linux 操作系统.开源的.免费 服务器端 目录.挂载点.安全级别高 /:根目录 /home/soft01:主目录/家 2.java开发环境 1).java源文件,经过编译,生成.class字节码文件 JVM加载.class并运行.class 跨平台.一次编程到处使用 2)JVM:java虚拟机 加载并运行.class JRE:java运行环境 除了包含JVM以外还包含运行java程序所需要的必须的环境 JRE=JVM+java系统类库 JDK:jav

java笔记------(变量、基本数据类型、数据类型的转换)

一.变量:变量即在程序运行过程中它的值是允许改变的量.(存数据的,代词,指代它所存的那个数) 1)声明: int a; //声明整型变量,名为a int b,c,d; //声明三个整型变量,名为b,c,d 2)命名: 2.1)只能包含字母.数字._.$符,并且不能以数字开头 2.2)严格区分大小写 2.3)不能使用关键字 2.4)可以中文命名,但不建议 2.5)建议:见名知意.驼峰命名法 3)初始化:第一次赋值 3.1)声明同时初始化 nt a = 250; 3.2)先声明后初始化 int a;

2 Java基础语法(keyword,标识符,凝视,常量,进制转换,变量,数据类型,数据类型转换)

1:keyword(掌握) (1)被Java语言赋予特定含义的单词 (2)特点: 所有小写. (3)注意事项: A:goto和const作为保留字存在. B:类似于Notepad++这种高级记事本会对keyword有特殊颜色标记 2:标识符(掌握) (1)就是给类,接口.方法,变量等起名字的字符序列 (2)组成规则: A:英文大写和小写字母 B:数字 C:$和_ (3)注意事项: A:不能以数字开头 B:不能是java中的keyword C:区分大写和小写 (4)常见的命名规则(见名知意) A:

语言基础:C#输入输出与数据类型及其转换

今天学习了C#的定义及特点,Visual Studio.Net的集成开发环境和C#语言基础. C#语言基础资料——输入输出与数据类型及其转换 函数的四要素:名称,输入,输出,加工 输出 Console.Write("这是我的第一个程序");//不换行,(不要漏掉:)(所有的符号全都用英文)(方法,也就是函数后面必须跟括号) Console.WriteLine("第二句");//输出这句后会换行 “这是我的第一个程序”后不换行,紧跟“第二句”,“第二句”换行,光标进入

黑马程序员——Java基础语法(一) --- 关键字、标识符、注释、常量和变量、运算符

------<a href="http://www.itheima.com" target="blank">Java培训.Android培训.iOS培训..Net培训</a>.期待与您交流! ------- 本篇博文主要总结java的基础语法,主要的内容包括:关键字.标识符.注释.常量和变量.运算符几部分. 一.关键字 关键字是被Java语言赋予了特殊含义的单词.关键字中所有的字母都是小写. java中的关键字主要包括如下几部分: 1.用于定

JavaSE:命名规则、进制转换、原码补码反码、数据类型以及转换

1:关键字(掌握) (1)被Java语言赋予特定含义的单词 (2)特点: 全部小写. (3)注意事项: A:goto和const作为保留字存在. B:类似于Notepad++这样的高级记事本会对关键字有特殊颜色标记 2:标识符(掌握) (1)就是给类,接口,方法,变量等起名字的字符序列 (2)组成规则: A:英文大小写字母 B:数字 C:$和_ (3)注意事项: A:不能以数字开头 B:不能是java中的关键字 C:区分大小写 (4)常见的命名规则(见名知意) A:包 全部小写 单级包:小写 举

Java中数据类型的转换

Java中的数据类型在定义时其实就已经确定了,所以是不能随意转换成其它的数据类型的.我们只能在一定程度上对其做类型转换的处理.转换的方式有 “自动类型转换”和“强制类型转换”两种. ①数据类型的自动转换: 假若在程序中定义好数据类型变量以后,又想用另一种数据类型来表示.Java只有在下列的条件都满足的情况下,才会做出数据类型的转换: 1.转换前的数据类型与转换后的类型兼容,也就是说只能是同一种数据类型,要么都是数值型,要么都是字符类型的: 2.转换后的数据类型表示范围比转换前的类型表示的范围大.

Java数据类型的转换

Java数据类型的转换,基本类型的相互转换 1如何将字串 String 转换成整数 int? A. 有2个方法: 1). int i = Integer.parseInt([String]); 或 i = Integer.parseInt([String],[int radix]); 2). int i = Integer.valueOf(my_str).intValue(); 注: 字串转成 Double, Float, Long 的方法大同小异. 2 如何将整数 int 转换成字串 Stri

黑 马 程 序 员_视频学习总结&lt;c语言&gt;----01 关键字、标识符、注释、 常量、变量

---------------------- ASP.Net+Unity开发..Net培训.期待与您交流! ---------------------- 一.关键字 1.关键字就是C语言提供的有特殊含义的符号,有些地方也叫做“保留字”. 2.C语言一共提供了32个关键字,这些关键字都被C语言赋予了特殊含义. auto double int struct break else long switch case enum register typedef char extern return uni