变量的使用
PL/SQL变量
变量的作用:
(在DECLARE阶段被声明)
(*每一行只声明一个变量)
(在执行阶段被赋予新值)
(可以在PL/SQL之间传递值)
(通过标准输出包可以看到结果)
变量初始化和关键字:
identifier [CONSTANT] datatype [NOT NULL] [:= | DEFAULT expr];
[CONSTANT] 必须初始化,并且其值不能改变
[NOT NULL] 必须初始化,不能被赋予NULL值
:= 赋值操作符
DEFAULT 赋值
1.标量类型
declare
v_city varchar2(30) NOT NULL := 'Beijing';
v_location varchar2(13) := 'Atlanta';
v_deptno number(2) NOT NULL := 10;
v_mgr number(6) DEFAULT 100;
v_hiredate date;
v_date date := to_date('20110117','yyyymmdd');
v_rowid rowid;
b_flag boolean;
begin
null;
end;
/
使用PL/SQL变量的注意事项:
PL/SQL变量和数据库标量的长度有区别:
CHAR 32767BYTE O8DATABASE 2000BYTE O7DATABASE 256BYTE
VARCHAR2 32767BYTE O8DATABASE 4000BYTE O7DATABASE 2000BYTE
LONG 32760BYTE 2G
LONG RAW 32760BYTE 2G
列名的优先级别高于变量!
declare
ename varchar2(20) :='KING';
begin
delete emp where ename=ename;
end;
/
变量输出测试:
例题1:创建一个匿名PL/SQL块,将下列字符输出到屏幕:"today is : 在此处显示当前时间"
set serveroutput on
begin
dbms_output.put_line('today is : '||sysdate);
end;
/
2.复合类型变量
数组:
declare
type no_list is varray (3) of number;
x no_list :=no_list(1990,2010,1995);
begin
dbms_output.put_line('no_list 2 is:'||x(2));
dbms_output.put_line('no_list 1 is:'||x(1));
dbms_output.put_line('no_list 3 is:'||x(3));
end;
/
记录(record):
declare
--第一个变量声明
v_sal number(7,2);
--第二个变量声明
TYPE emp_record_type IS RECORD
(ename VARCHAR2(25),
job VARCHAR2(10),
sal NUMBER(7,2));
emp_record emp_record_type;
begin
emp_record.ename := 'Alvin';
emp_record.job := 'clerk';
emp_record.sal := 1000;
dbms_output.put_line(emp_record.ename||' '||emp_record.job||' '||emp_record.sal);
end;
/
声明一个变量用来保存dept表的所有列的数据!
PL/SQL表(INDEX BY表):
declare
type emp_table_type is table of varchar2(20)
index by binary_integer;
emp_table emp_table_type;
begin
emp_table(0) :='Alex';
emp_table(-1) :='X1';
emp_table(2) :='hello';
dbms_output.put_line('index 0 : '||emp_table(0));
dbms_output.put_line('index -1 : '||emp_table(-1));
dbms_output.put_line('index 2 : '||emp_table(2));
end;
/
操作集合类型变量的方法:
declare
type emp_table_type is table of varchar2(10)
index by varchar2(10);
emp_table emp_table_type;
begin
emp_table('A') := 'KING';
emp_table('B') := 'zjz';
dbms_output.put_line('PL/SQL table elements numbers : '||emp_table.count);
dbms_output.put_line('The first element index --> '||emp_table.first);
dbms_output.put_line('The last element index --> '||emp_table.last);
dbms_output.put_line('The index ''B'' prior element is --> '||emp_table.prior('B'));
dbms_output.put_line('The index ''A'' next element is --> '||emp_table.next('A'));
if emp_table.exists('A') then
dbms_output.put_line('Index value ''A'' exists');
dbms_output.put_line('Index A --> '||emp_table('A'));
end if;
dbms_output.put_line('Index B --> '||emp_table('B'));
end;
/
PL/SQL表+record :
declare
TYPE emp_record_type IS RECORD
(ename VARCHAR2(25),
job VARCHAR2(10),
sal NUMBER(7,2));
type emp_table_type is table of emp_record_type
index by binary_integer;
emp_table emp_table_type;
begin
select ename,job,sal into emp_table(0) from emp where empno=7369;
dbms_output.put_line('index 0 : '||emp_table(0).ename);
emp_table(1).ename:='x';
dbms_output.put_line('index 1 : '||emp_table(1).ename);
end;
/
主机变量
第二类:非PL/SQL变量(来源于环境或宿主语言如C,java)
VARIABLE return_code NUMBER
variable g_message VARCHAR2(30)
begin
:g_message := 'My First PL/SQL Block!';
end;
/
--在SQLPUS中用print命令可以显示主机变量的值
print g_message