Oracle PL/SQL编程之变量

郑大钱呀】【】【】【】,我们一起交流,一起学习。

关于Oracle变量中的点

  1. 变量必须要声明后才能使用,不能提前使用
  2. 变量可以再任何程序块中、子程序(函数、存储过程)中使用
  3. 变量的命名有规则:
1. 变量必须是英文字母开头,支持字母、数字、下划线、美元符号、#
2. 变量的名称最多30个字符
3. 变量名不能与数据库的表或列同名
4. 不能使用Oracle中的关键字
5. 变量不区分大小写,`v_id` 与`v_Id`是同一个变量

变量的声明与初始化

declare
  v_id       number(20) not null := 1;
  v_address  varchar2(50) :='发财市发财路88888';
  v_name     constant varchar2(10) :='郑大钱';
  v_birthday date;
begin
  dbms_output.put_line('v_id:'||v_id);
  dbms_output.put_line('v_address:'||v_address);
  dbms_output.put_line('v_name:'||v_name);
  dbms_output.put_line('v_birthday:'||v_birthday);
end;

输出结果如下:

v_id:1
v_address:发财市发财路88888
v_name:郑大钱
v_birthday:
  1. := 为赋值的符号,当然还有其它为变量赋值的方式,我们后面再说
  2. not null 表示这个变量不能为空,必须在定义的时候就要为其赋值,相当于加了一个约束
  3. constant 关键字限制变量的值不能更改,也就是相当于定义了一个常量
  4. 变量可以声明后,当没有not null约束的时候,不赋值也不会报错,不赋值的变量,Oracle会默认将其初始值设置为空。

建议在声明变量的时候,就为其初始化,否则如果在涉及计算的时候,任何的值与NULL计算的时候,结果都是NULL

值得注意的是,声明的变量每一行结束,都需要加;

变量的声明后重新赋值

declare
  v_id      number(20) not null := 1;
  v_address varchar2(50) := '发财市发财路88888';
  v_name constant varchar2(10) := '郑大钱';
  v_birthday date;
begin
  -- 对v_id 重新赋值
  v_id := '2022';
  dbms_output.put_line('v_id:' || v_id);
  dbms_output.put_line('v_address:' || v_address);
  dbms_output.put_line('v_name:' || v_name);
  dbms_output.put_line('v_birthday:' || v_birthday);
end;

执行结果如下:

v_id:2022
v_address:发财市发财路88888
v_name:郑大钱
v_birthday:

q’操作符

我们在之前说过,Oracle字符串都要放在两个单引号中,但是如果我们字符串中,包含单引号,这个时候该怎么办呢?此时就可以使用q'操作符,示例如下:

declare
  v_id      number(20) not null := 1;
  v_address varchar2(50) := q'@China'Tang@';
  v_name constant varchar2(10) := q'[Magic'C]';
  v_birthday date;
begin
  dbms_output.put_line('v_id:' || v_id);
  dbms_output.put_line('v_address:' || v_address);
  dbms_output.put_line('v_name:' || v_name);
  dbms_output.put_line('v_birthday:' || v_birthday);
end;

输出结果:

v_id:1
v_address:China'Tang
v_name:Magic'C
v_birthday:

我们从上面的中发现,q限bi定符后,一个使用了@,一个使用[,其实不限与这两个,这个定界符,可以指定任意的字符,只要它没有在字符中出现,都可以。

变量的常用基本数据类型

我们在声明变量的时候,需要指定变量的数据类型和长度,在Oracle中,数据的常用基本数据类型如下:

  1. varchar2(size): 不定长字符串类型,size为数据长度,最大32767个字符
  2. char(size): 定长字符串,size为数据长度,最大32767个字符
  3. number(p,s):数值类型,p为数值的位数,s为数值的精度。
  4. boolean: 布尔数据类型,一共三个值: TRUE、FALSE、NULL
  5. date: 日期类型
  6. timestamp:时间戳

char、varchar 和varchar2三者之间的区别:

  1. varchar是标准sql中定义的,而varchar2是oracle所提供的独有的数据类型,varchar对于汉字、全角等字符占两个字节,对于数字,英文字符是一个字节,占的内存小,对于空串,varchar仍按空串处理。
  2. varchar2一般情况下把所有字符都占两字节处理,具体要看字符集情况。比如GBK,汉字就会占两个字节,英文1个;如果是UTF-8,汉字一般占3个字节,英文还是1个,此外varchar2是存放可变长度的字符串,VARCHAR2把空串等同于null处理。
  3. char是一种固定长度的类型,无论存储的数据多少都会固定长度,如果插入的长度小于定义长度,则可以用空格进行填充。所以char可能更会浪费空间。

%TYPE数据类型

在编程中,我们变量最常用的是保存数据库里数据,这就要求数据库中数据要和变量的类型,如果我们通过去查询表结构去定义,就太麻烦了,Oracle提供了一种简便的方式,不需要查询表结构,只需要指定表的字段即可,示例如下:

declare
  -- 声明一个%Type类型的变量用来接收ename数据
  v_emp_name emp.ename%TYPE;
begin
  -- 使用select ... into ... 方式为emp赋值
  select ename into v_emp_name from emp where empno='7369';
  dbms_output.put_line('v_emp_name:' || v_emp_name);
end;

执行结果如下:

v_emp_name:SMITH

我们也可以使用%Type,引用自己的定义的变量,示例如下:

declare
  v_name varchar2(20):='郑大钱';
  v_name2 v_name%TYPE:='张三';
begin
  dbms_output.put_line('v_name:' || v_name);
  dbms_output.put_line('v_name2:' || v_name2);
end;

执行结果如下:

v_name:郑大钱
v_name2:张三

%Type属性的变量,不受限于NOT NULL约束

绑定变量(了解)

绑定变量又叫宿主变量,我们之前在语句块声明的变量,在程序运行后,就在内存中释放了,但是绑定变量不一样,在程序块执行完成后,变量依然可以访问,我们也可以理解成全局变量,示例代码如下:

SQL> variable v_name varchar2(20);
SQL> 
SQL> begin
  2    :v_name :='2022';
  3  end;
  4  /

PL/SQL procedure successfully completed

v_name
---------
2022

SQL> print v_name
v_name
---------
2022

SQL> 

引用绑定变量,需要在变量名前加上:

大对象变量

当要存储大量的数据时候,就需要大对象数据类型,主要为两种数据类型:BLOB、CLOB.

  1. CLOB:主要存储单字节的大对象
  2. BLOB:用于存储大的二进制对象

变量名称Oracle官方规范

  1. v_变量名:普通变量
  2. c_变量名:常量
  3. p_变量名:替代变量
  4. g_变量名:全局变量
  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Oracle 数据库中,可以使用包(package)或者会话(session)级别的上下文(context)来定义全局变量。 1. 使用包(package)定义全局变量: 首先,在包中声明一个变量,并将其设置为公共(public)的,这样其他包或过程可以访问它。然后,可以在包的任何过程或函数中使用该变量。 以下是一个示例代码: ```sql CREATE OR REPLACE PACKAGE my_package IS -- 声明一个全局变量 g_variable NUMBER; END my_package; / CREATE OR REPLACE PACKAGE BODY my_package IS -- 初始化全局变量 PROCEDURE init_variable IS BEGIN g_variable := 10; END init_variable; -- 使用全局变量 PROCEDURE use_variable IS BEGIN DBMS_OUTPUT.PUT_LINE(g_variable); END use_variable; END my_package; ``` 在上述示例中,"my_package" 包中声明了一个名为 "g_variable" 的全局变量,并在 "init_variable" 过程中初始化为 10。在 "use_variable" 过程中,可以访问并使用该全局变量。 2. 使用会话(session)级别的上下文(context)定义全局变量Oracle 还提供了一种使用会话级别的上下文(context)来定义全局变量的方式。这种方式允许在会话内共享和访问全局变量,但对于其他会话来说是隔离的。 以下是一个示例代码: ```sql -- 创建上下文(context) CREATE OR REPLACE CONTEXT my_context USING my_package; -- 设置全局变量的值 EXECUTE IMMEDIATE 'BEGIN DBMS_SESSION.SET_CONTEXT(''my_context'', ''g_variable'', 10); END;'; -- 在过程中使用全局变量 CREATE OR REPLACE PROCEDURE use_variable IS v_variable NUMBER; BEGIN v_variable := SYS_CONTEXT('my_context', 'g_variable'); DBMS_OUTPUT.PUT_LINE(v_variable); END use_variable; ``` 在上述示例中,首先创建了一个名为 "my_context" 的上下文,其中使用了之前创建的包 "my_package"。然后,通过使用 `DBMS_SESSION.SET_CONTEXT` 过程,将全局变量 "g_variable" 的值设置为 10。最后,在过程 "use_variable" 中使用 `SYS_CONTEXT` 函数来获取并使用该全局变量的值。 这些是在 Oracle 数据库中定义全局变量的两种常见方法。根据具体的需求和场景选择适合的方式。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

郑大钱呀

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值