-- 定义部分BEGIN-- 执行部分EXCEPTION-- 异常处理部分END;-- 块结束标记
2.PL/SQL特征:
(1).有利于客户、服务器环境应用运行
(2).适合于客户环境
(3).模块化
(4).过程化
(5).提供大量内置程序包
(6).运行错误的可处理性
3.PL/SQL块的类型:匿名块、子程序、触发器
匿名块:指没有名称的PL/SQL块。可内嵌到应用程序(例如Java)中,也可以在交互环境(例如SQL*Plus)中直接使用。
子程序:包括存储过程(用于执行特定操作)、函数(用于返回特定数据)、包(用于逻辑组合相关的过程和函数)。
触发器:指隐含执行的存储过程。
4.数据类型与变量
例如:
-- 创建表create table DEPT -- 部门( id NUMBER(4) not null constraint PK_DEPT_ID primary key, name VARCHAR2(20));create table EMPLOYEE -- 员工( id NUMBER(4) not null constraint PK_EMP_ID primary key, name VARCHAR2(20) not null, birthday DATE, address VARCHAR2(100), did NUMBER(4), constraint FK_EMP_DEPT foreign key (DID) references DEPT (ID));-- 添加测试数据INSERT INTO DEPT VALUES(1, ‘财务部‘);INSERT INTO DEPT VALUES(2, ‘市场部‘);INSERT INTO DEPT VALUES(3, ‘综合部‘);INSERT INTO DEPT VALUES(4, ‘研发部‘);INSERT INTO DEPT VALUES(5, ‘网络部‘);INSERT INTO EMPLOYEE VALUES(1, ‘李飞‘, TO_DATE(‘1975.07.03‘,‘yyyy.mm.dd‘), ‘四川成都‘, 1);INSERT INTO EMPLOYEE VALUES(2, ‘刘兰‘, TO_DATE(‘1985.09.03‘,‘yyyy.mm.dd‘), ‘四川成都‘, 1);INSERT INTO EMPLOYEE VALUES(3, ‘张强‘, TO_DATE(‘1987.11.22‘,‘yyyy.mm.dd‘), ‘广东广州‘, 2);INSERT INTO EMPLOYEE VALUES(4, ‘刘武龙‘, TO_DATE(‘1979.07.18‘,‘yyyy.mm.dd‘), ‘陕西西安‘, 2);INSERT INTO EMPLOYEE VALUES(5, ‘向小梅‘, TO_DATE(‘1982.03.03‘,‘yyyy.mm.dd‘), ‘四川成都‘, 2);INSERT INTO EMPLOYEE VALUES(6, ‘周斌‘, TO_DATE(‘1985.11.08‘,‘yyyy.mm.dd‘), ‘四川成都‘, 4);INSERT INTO EMPLOYEE VALUES(7, ‘王强‘, TO_DATE(‘1985.01.25‘,‘yyyy.mm.dd‘), ‘四川成都‘, 4);
-- 定义变量DECLARE cnt NUMBER(4) := 5;BEGIN DBMS_OUTPUT.PUT_LINE(‘数字:‘ || CNT);END;-- %TYPEDECLARE emp_name employee.name%TYPE; -- emp_name类型与employee表中name列的类型一致BEGIN SELECT name INTO emp_name FROM employee WHERE id=&emp_id; -- &emp_id 从键盘接收输入 DBMS_OUTPUT.PUT_LINE(‘姓名:‘ || emp_name);END;-- %ROWTYPEDECLARE rec employee%ROWTYPE;BEGIN SELECT * INTO rec FROM employee WHERE id=1; DBMS_OUTPUT.PUT_LINE(‘姓名:‘ || rec.name || ‘, 生日:‘ || rec.birthday || ‘,地址:‘ || rec.address);END;-- 定义 RECORDDECLARE TYPE emp_type IS RECORD( ename employee.name%TYPE NOT NULL := ‘匿名‘, ebirth employee.birthday%TYPE, eaddr employee.address%TYPE ); emp emp_type;BEGIN SELECT name,birthday,address INTO emp FROM employee WHERE id=4; DBMS_OUTPUT.PUT_LINE(‘姓名:‘ || emp.ename || ‘, 生日:‘ || emp.ebirth || ‘,地址:‘ || emp.eaddr);END;-- 定义索引表DECLARE TYPE emp_name_type IS TABLE OF employee.name%TYPE -- INDEX BY BINARY_INTEGER; INDEX BY VARCHAR2(20); emp_names emp_name_type;BEGIN emp_names(‘lily‘) := ‘Lily‘; emp_names(‘lucy‘) := ‘Lucy‘; emp_names(‘tom‘) := ‘Tommy‘; -- SELECT name INTO emp_names(‘abc‘) FROM employee WHERE id=1; DBMS_OUTPUT.PUT_LINE(‘姓名:‘ || emp_names(‘lily‘) || ‘,‘ || emp_names(‘lucy‘) || ‘,‘ || emp_names(‘tom‘));END;-- 定义VARRAYDECLARE TYPE array_type IS VARRAY(5) OF VARCHAR2(20); arr array_type;BEGIN -- 为各元素赋初值 arr := array_type(‘a‘,‘b‘,NULL,‘c‘, ‘d‘); DBMS_OUTPUT.PUT_LINE(‘第一个:‘ || arr(1)); DBMS_OUTPUT.PUT_LINE(‘第三个:‘ || arr(3)); arr(3) := ‘张三‘; DBMS_OUTPUT.PUT_LINE(‘修改后第三个:‘ || arr(3));END;
PL/SQL编程基础
标签:
小编还为您整理了以下内容,可能对您也有帮助:
pl/sql是什么
PL/SQL(Proceral Language/Structured Query Language)是一种过程化的编程语言,特别用于Oracle数据库管理系统。
PL/SQL是Oracle数据库的内置语言,它结合了SQL语句和程序控制语句,可以用于编写存储过程、触发器、函数和包等数据库对象。
PL/SQL具有以下特点和功能:
过程化编程:PL/SQL支持过程化编程风格,允许开发人员编写具有顺序结构、条件语句、循环语句等的程序代码。这样可以实现复杂的业务逻辑和数据处理操作。
强大的数据处理能力:PL/SQL通过集成SQL语句,可以方便地进行数据库操作,如查询数据、插入、更新和删除记录等。同时,PL/SQL还提供了丰富的数据处理功能,如变量声明、数据类型定义、游标操作等,使开发人员能够灵活地处理和操作数据。
错误处理和异常处理:PL/SQL提供了异常处理机制,可以捕获和处理运行时的错误和异常情况。开发人员可以编写异常处理代码,定义处理异常的逻辑,从而保证程序的稳定性和可靠性。
可复用性和模块化:PL/SQL支持封装代码为存储过程、函数和包等可复用的模块。通过将相关的代码封装到模块中,可以提高代码的可维护性和重用性,减少代码冗余。
与数据库紧密集成:PL/SQL与Oracle数据库紧密集成,可以直接访问数据库对象和数据,执行事务管理和数据操作。PL/SQL可以在数据库服务器端执行,提高了性能和效率。
总之,PL/SQL是Oracle数据库的编程语言,用于编写存储过程、触发器、函数和包等数据库对象,具有强大的数据处理能力和丰富的程序控制语法,是开发和管理Oracle数据库的重要工具。
PL/SQL的基本概念
是Oracle对标准数据库语言SQL的过程化扩充,它将数据库技术和过程化程序设计语言联系起来,是一种应用开发语言,可使用循环,分支处理数据,将SQL的数据操纵功能与过程化语言数据处理功能结合起来.PL/SQL的使用,使SQL成为一种高级程序设计语言,支持高级语言的块操作,条件判断,循环语句,嵌套等,与数据库核心的数据类型集成,使SQL 的程序设计效率更高.
⒈1 PL/SQL的作用
使用PL/SQL可以编写具有很多高级功能的程序,虽然通过多个SQL语句可能也能实现同样的功能,但是相比而言,PL/SQL具有更为明显的一些优点:
⒈能够使一组SQL语句的功能更具模块化程序特点;
⒉采用了过程性语言控制程序的结构;
⒊可以对程序中的错误进行自动处理,使程序能够在遇到错误的时候不会被中断;
⒋具有较好的可移植性,可以移植到另一个Oracle数据库中;
⒌集成在数据库中,调用更快;
⒍减少了网络的交互,有助于提高程序性能。
通过多条SQL语句实现功能时,每条语句都需要在客户端和服务端传递,而且每条语句的执行结果也需要在网络中进行交互,占用了大量的网络带宽,消耗了大量网络传递的时间,而在网络中传输的那些结果,往往都是中间结果,而不是我们所关心的。
而使用PL/SQL程序是因为程序代码存储在数据库中,程序的分析和执行完全在数据库内部进行,用户所需要做的就是在客户端发出调用PL/SQL的执行命令,数据库接收到执行命令后,在数据库内部完成整个PL/SQL程序的执行,并将最终的执行结果反馈给用户。在整个过程中网络里只传输了很少的数据,减少了网络传输占用的时间,所以整体程序的执行性能会有明显的提高。
⒈2 PL/SQL程序的基本结构
PL/SQL块由四个基本部分组成:声明、执行体开始、异常处理、执行体结束。
下面是四个部分的基本结构:
DECLARE —— 可选部分
变量、常量、游标、用户定义异常的声明
……
BEGIN —— 必要部分
SQL语句和PL/SQL语句构成的执行程序
……
EXCEPTION —— 可选部分
程序出现异常时,捕捉异常并处理异常
……
END;—— 必须部分
在数据库执行PL/SQL程序时,PL/SQL语句和SQL语句是分别进行解析和执行的。PL/SQL块被数据库内部的PL/SQL引擎提取,将SQL语句取出送给Oracle的SQL引擎处理,两种语句分别在两种引擎中分析处理,在数据库内部完成数据交互、处理过程。
PL/SQL的基本语法
begin
? dbms_output.put_line(‘hello,world‘);
end;
???
但是在sqlplus里面就不一样了
首先输入
begin
dbms_output.put_line(‘hello,world‘);
end;
/
通过set serveroutput on
/
来调用输出语句
?
可以通过edit命令对过程语句进行修改
?
name [constrant]datatype[notnull]:=|default value
?
?
--pl/sql语句中的if语句
declare
? ? ?sal1 number(6,2);
begin
? select sal into sal1 from emp where lower(ename)=lower(‘&ename‘);
? if (sal1<2000) then
? ? dbms_output.put_line(‘less 2000‘);
? ? end if;
end;
?
--pl/sql 里面的 if else 语句
declare
? ? ?sal1 number(6,2);
begin
? select sal into sal1 from emp where lower(ename)=lower(‘&ename‘);
? if (sal1<2000) then
? ? dbms_output.put_line(‘less 2000‘);
? ? else
? ? ? dbms_output.put_line(‘more 2000‘);
? ? end if;
end;
?
--pl/sql语句中的if elsif语句
declare
? ? ?sal1 number(6,2);
begin
? select sal into sal1 from emp where lower(ename)=lower(‘&ename‘);
? ? if (sal1<2000) then
? ? dbms_output.put_line(‘less 2000‘);
? ? elsif (sal1>2000 and sal1<400) then
? ? dbms_output.put_line(‘between 2000 and 4000‘);
? ? elsif (sal1>400) then
? ? dbms_output.put_line(‘more 4000‘);
? ? else
? ? ? dbms_output.put_line(‘other...........‘);
? ? end if;
end;
?
--pl/sql语句里面的case语句
declare
? ? a number(2):=0;
begin
? ? a:=&a;
? ? case a
? ? ? when 10 then
? ? ? ? dbms_output.put_line(‘aaaaaaaaaaa‘);
? ? ? when 20 then
? ? ? ? dbms_output.put_line(‘bbbbbbbbbbbb‘);
? ? ? else
? ? ? ? dbms_output.put_line(‘other.....‘);
? ? end case; ? ?
end;
?
--pl/sql语句里面的loop语句
declare
? ? q number :=0;
begin
? ? loop
? ? ? q:=q+1;
? ? ? dbms_output.put_line(‘q=‘||q);
? ? ? exit when q=10;
? ? end loop;
end;
?
--使用if 结束的
declare
? ? q number :=0;
begin
? ? loop
? ? ? q:=q+1;
? ? ? dbms_output.put_line(‘q=‘||q);
? ? ? if q=10 then
? ? ? ? exit;
? ? ? end if;
? ? end loop;
end;
?
?
--使用 while 循环
declare
? ? ?q number :=0;
begin
? ? ?while(q<10)loop
? ? ? q:=q+1;
? ? ? dbms_output.put_line(‘q=‘||q);
? ? ?end loop;
end;
?
--使用 for循环 ?反向遍历 reverse
declare
begin
? ? ?for i in reverse 1..10 loop
? ? ? dbms_output.put_line(i); ?
? ? ?end loop;
end;
?
?
PLS_INTEGER和BINARY_INTENER唯一区别是在计算当中发生溢出时,BINARY_INTENER型的变量会被自动指派给一个NUMBER型而不会出错,PLS_INTEGER型的变量将会发生错误。
?
?
record ?定义类型
?
集合容器
index_by table
嵌套表
varray
type num_array is table of number(5) index by binary_integer;
?
?
单行单列 ?变量 varchar2 %type
单行多列 record
单列多行 集合 (type)
多行多列 集合(rowtype)
?
索引表的格式
type name is table of element_type index by key_type;
?
declare
? ? ?v_ename emp.ename%type;
? ? ?v_emp emp%rowtype;
begin
? ? ?select ename into v_ename from emp where empno=7369;
? ? ?select * into v_emp from emp where empno=7369;
? ? ?dbms_output.put_line(v_ename);
? ? ?dbms_output.put_line(v_emp.sal||‘ ?‘||v_emp.ename);
end;
?
--仅输出特殊的结构 ? 使用 record来定义
declare
? ??type emp_record is record(
? ? ? ? ?v_ename emp.ename%type,
? ? ? ? ?v_sal emp.sal%type,
? ? ? ? ?v_deptno emp.deptno%type
? ? );
? ? v_emp_record emp_record;
begin
? ? select ename,sal,deptno into v_emp_record from emp where empno=7369;
? ? --我也可以通过赋值语句修改里面的值
? ? v_emp_record.v_ename:=‘zhaan‘;
? ? dbms_output.put_line(v_emp_record.v_ename);
? ? dbms_output.put_line(v_emp_record.v_sal);
? ? dbms_output.put_line(v_emp_record.v_deptno);
end;
?
--
declare
? ? type num_array is table of number(5) index by binary_integer;
? ? a num_array;
begin
? ? for i in 1..10 loop
? ? ? a(i):=i;
? ? end loop;
? ? for i in 1..10 loop
? ? ? dbms_output.put_line(a(i));
? ? end loop;
end;
?
?
--例子一
declare
? ? type emp_array is table of emp%rowtype index by binary_integer;
? ? a emp_array;
begin
? ? select * bulk collect into a from emp;
? ? for i in a.first..a.last loop
? ? ? dbms_output.put_line(a(i).ename||‘ ?‘||a(i).job);
? ? end loop;
end;
--集合中装有集合
declare
? ? type record1 is record(
? ? ? ? ?vempno emp.empno%type,
? ? ? ? ?vename emp.ename%type,
? ? ? ? ?vsal ? emp.sal%type
? ? );
? ? type record2 is record(
? ? ? ? ?vdeptno emp.deptno%type,
? ? ? ? ?vrecord record1
? ? );
? ? a record1;
? ? b record2;
begin
? select empno,ename,sal into a from emp where empno=7369;
? b.vrecord:=a;
? dbms_output.put_line(b.vrecord.vempno);
? dbms_output.put_line(b.vrecord.vename);
? dbms_output.put_line(b.vrecord.vsal);
end;
--
declare
? ? type cc is table of varchar2(20) index by varchar2(20);
? ? a cc;
begin
? ? a(‘beijing‘):=‘china‘;
? ? a(‘dongjing‘):=‘japan‘;
? ? a(‘huashengdun‘):=‘usa‘;
? ? dbms_output.put_line(a(‘beijing‘));
end;
学习pl/sql之一
标签:
PL/SQL的基本语法
begin
? dbms_output.put_line(‘hello,world‘);
end;
???
但是在sqlplus里面就不一样了
首先输入
begin
dbms_output.put_line(‘hello,world‘);
end;
/
通过set serveroutput on
/
来调用输出语句
?
可以通过edit命令对过程语句进行修改
?
name [constrant]datatype[notnull]:=|default value
?
?
--pl/sql语句中的if语句
declare
? ? ?sal1 number(6,2);
begin
? select sal into sal1 from emp where lower(ename)=lower(‘&ename‘);
? if (sal1<2000) then
? ? dbms_output.put_line(‘less 2000‘);
? ? end if;
end;
?
--pl/sql 里面的 if else 语句
declare
? ? ?sal1 number(6,2);
begin
? select sal into sal1 from emp where lower(ename)=lower(‘&ename‘);
? if (sal1<2000) then
? ? dbms_output.put_line(‘less 2000‘);
? ? else
? ? ? dbms_output.put_line(‘more 2000‘);
? ? end if;
end;
?
--pl/sql语句中的if elsif语句
declare
? ? ?sal1 number(6,2);
begin
? select sal into sal1 from emp where lower(ename)=lower(‘&ename‘);
? ? if (sal1<2000) then
? ? dbms_output.put_line(‘less 2000‘);
? ? elsif (sal1>2000 and sal1<400) then
? ? dbms_output.put_line(‘between 2000 and 4000‘);
? ? elsif (sal1>400) then
? ? dbms_output.put_line(‘more 4000‘);
? ? else
? ? ? dbms_output.put_line(‘other...........‘);
? ? end if;
end;
?
--pl/sql语句里面的case语句
declare
? ? a number(2):=0;
begin
? ? a:=&a;
? ? case a
? ? ? when 10 then
? ? ? ? dbms_output.put_line(‘aaaaaaaaaaa‘);
? ? ? when 20 then
? ? ? ? dbms_output.put_line(‘bbbbbbbbbbbb‘);
? ? ? else
? ? ? ? dbms_output.put_line(‘other.....‘);
? ? end case; ? ?
end;
?
--pl/sql语句里面的loop语句
declare
? ? q number :=0;
begin
? ? loop
? ? ? q:=q+1;
? ? ? dbms_output.put_line(‘q=‘||q);
? ? ? exit when q=10;
? ? end loop;
end;
?
--使用if 结束的
declare
? ? q number :=0;
begin
? ? loop
? ? ? q:=q+1;
? ? ? dbms_output.put_line(‘q=‘||q);
? ? ? if q=10 then
? ? ? ? exit;
? ? ? end if;
? ? end loop;
end;
?
?
--使用 while 循环
declare
? ? ?q number :=0;
begin
? ? ?while(q<10)loop
? ? ? q:=q+1;
? ? ? dbms_output.put_line(‘q=‘||q);
? ? ?end loop;
end;
?
--使用 for循环 ?反向遍历 reverse
declare
begin
? ? ?for i in reverse 1..10 loop
? ? ? dbms_output.put_line(i); ?
? ? ?end loop;
end;
?
?
PLS_INTEGER和BINARY_INTENER唯一区别是在计算当中发生溢出时,BINARY_INTENER型的变量会被自动指派给一个NUMBER型而不会出错,PLS_INTEGER型的变量将会发生错误。
?
?
record ?定义类型
?
集合容器
index_by table
嵌套表
varray
type num_array is table of number(5) index by binary_integer;
?
?
单行单列 ?变量 varchar2 %type
单行多列 record
单列多行 集合 (type)
多行多列 集合(rowtype)
?
索引表的格式
type name is table of element_type index by key_type;
?
declare
? ? ?v_ename emp.ename%type;
? ? ?v_emp emp%rowtype;
begin
? ? ?select ename into v_ename from emp where empno=7369;
? ? ?select * into v_emp from emp where empno=7369;
? ? ?dbms_output.put_line(v_ename);
? ? ?dbms_output.put_line(v_emp.sal||‘ ?‘||v_emp.ename);
end;
?
--仅输出特殊的结构 ? 使用 record来定义
declare
? ??type emp_record is record(
? ? ? ? ?v_ename emp.ename%type,
? ? ? ? ?v_sal emp.sal%type,
? ? ? ? ?v_deptno emp.deptno%type
? ? );
? ? v_emp_record emp_record;
begin
? ? select ename,sal,deptno into v_emp_record from emp where empno=7369;
? ? --我也可以通过赋值语句修改里面的值
? ? v_emp_record.v_ename:=‘zhaan‘;
? ? dbms_output.put_line(v_emp_record.v_ename);
? ? dbms_output.put_line(v_emp_record.v_sal);
? ? dbms_output.put_line(v_emp_record.v_deptno);
end;
?
--
declare
? ? type num_array is table of number(5) index by binary_integer;
? ? a num_array;
begin
? ? for i in 1..10 loop
? ? ? a(i):=i;
? ? end loop;
? ? for i in 1..10 loop
? ? ? dbms_output.put_line(a(i));
? ? end loop;
end;
?
?
--例子一
declare
? ? type emp_array is table of emp%rowtype index by binary_integer;
? ? a emp_array;
begin
? ? select * bulk collect into a from emp;
? ? for i in a.first..a.last loop
? ? ? dbms_output.put_line(a(i).ename||‘ ?‘||a(i).job);
? ? end loop;
end;
--集合中装有集合
declare
? ? type record1 is record(
? ? ? ? ?vempno emp.empno%type,
? ? ? ? ?vename emp.ename%type,
? ? ? ? ?vsal ? emp.sal%type
? ? );
? ? type record2 is record(
? ? ? ? ?vdeptno emp.deptno%type,
? ? ? ? ?vrecord record1
? ? );
? ? a record1;
? ? b record2;
begin
? select empno,ename,sal into a from emp where empno=7369;
? b.vrecord:=a;
? dbms_output.put_line(b.vrecord.vempno);
? dbms_output.put_line(b.vrecord.vename);
? dbms_output.put_line(b.vrecord.vsal);
end;
--
declare
? ? type cc is table of varchar2(20) index by varchar2(20);
? ? a cc;
begin
? ? a(‘beijing‘):=‘china‘;
? ? a(‘dongjing‘):=‘japan‘;
? ? a(‘huashengdun‘):=‘usa‘;
? ? dbms_output.put_line(a(‘beijing‘));
end;
学习pl/sql之一
标签:
pl/sql是什么?是标准的sql语言?什么MySQL都支持?
PL/SQL也是一种程序语言,x0dx0a叫做过程化SQL语言(Proceral Language/SQL)。x0dx0aPL/SQL是Oracle数据库对SQL语句的扩展。x0dx0a在普通SQL语句的使用上增加了编程语言的特点,所以PL/SQL就是把数据操作和查询语句组织在PL/SQL代码的过程性单元中,通过逻辑判断、循环等操作实现复杂的功能或者计算的程序语言。x0dx0ax0dx0aPL/SQL 只有 Oracle 数据库有。 MySQL 目前不支持 PL/SQL 的。
OraclePL/SQL基础知识及其相关概念
结构化查询语言(Structured Query Language 简称SQL)是用来访问关系型数据库一种通用语言 属于*语言( GL) 其执行特点是非过程化 即不用指明执行的具体方法和途径 而是简单地调用相应语句来直接取得结果即可 显然 这种不关注任何实现细节的语言对于开发者来说有着极大的便利 然而 有些复杂的业务流程要求相应的程序来描述 这种情况下 GL就有些*为力了 Oracle L/SQL的出现正是为了解决这一问题 Oracle PL/SQL是一种过程化语言 属于第三代语言 它与C C++ Java等语言一样关注于处理细节 可以用来实现比较复杂的业务逻辑
一 编程基础知识
程序结构
Oracle PL/SQL程序都是以块(block)为基本单位 整个Oracle PL/SQL块分三部分 声明部分(用declare开头) 执行部分(以 begin开头)和异常处理部分(以exception开头) 其中执行部分是必须的 其他两个部分可选 无论Oracle PL/SQL程序段的代码量有多大 其基本结构就是由这三部分组成
控制结构
Oracle PL/SQL程序段中有三种程序结构 条件结构 循环结构和顺序结构
) 条件结构
与其它语言完全类似 语法结构如下
if condition then
statement
else
statement
end if ;
)循环结构
这一结构与其他语言不太一样 在PL/SQL程序中有三种循环结构
a loop … end loop;
b while condition loop … end loop;
c for variable in low_bound upper_bound loop … end loop;
其中的 … 代表循环体
)顺序结构
实际就是goto的运用 不过从程序控制的角度来看 尽量少用goto可以使得程序结构更加的清晰
变量声明与赋值
Oracle PL/SQL主要用于数据库编程 所以其所有的数据类型跟Oracle数据库里的字段类型是一一对应的 大体分为数字型 布尔型 字符型和日期型 这里简单介绍两种常用数据类型 number varchar
)number 用来存储整数和浮点数 范围为1e ~ e 其使用语法为 number[(precision scale)]
其中(precision scale)是可选的 precision表示所有数字的个数 scale表示小数点右边数字的个数
)varchar 用来存储变长的字符串 其使用语法为 varchar [(size)]
其中size为可选 表示该字符串所能存储的最大长度
在Oracle PL/SQL中声明变量与其他语言不太一样 它采用从右往左的方式声明 比如声明一个number类型的变量v_id 那其形式应为 v_id nunmer;
如果给上面的v_id变量赋值 不能用 = 应该用 := 即形式为:v_id := ;
SQL基本命令
PL/SQL使用的数据库操作语言还是基于SQL的 所以熟悉SQL是进行Oracle PL/SQL编程的基础 SQL语言的分类情况大致如下
) 数据定义语言(DDL) Create Drop Grant Revoke …
) 数据操纵语言(DML) Update Insert Delete …
) 数据控制语言(DCL) Commit Rollback Savapoint …
) 其他 Alter System Connect Allocate …
具体的语法结构可以参阅其他关于SQL语言的资料 这里不再赘述
二 过程与函数
Oracle PL/SQL中的过程和函数与其他语言的过程和函数一样 都是为了执行一定的任务而组合在一起的语句 过程无返回值 函数有返回值
其语法结构为
过程 Create or replace procere procname(参数列表) as PL/SQL语句块
函数 Create or replace function funcname(参数列表) return 返回值 as PL/SQL语句块
三 游标
游标的定义为 用游标来指代一个DML SQL操作返回的结果集 即当一个对数据库的查询操作返回一组结果集时 用游标来标注这组结果集 以后通过对游标的操作来获取结果集中的数据信息 这里特别提出游标的概念 是因为它在PL/SQL的编程中非常的重要 定义游标的语法结构如下 cursor cursor_name is SQL语句;
四 其他概念
Oracle PL/SQL中包的概念很重要 主要是对一组功能相近的过程和函数进行封装 类似于面向对象中的名字空间的概念
lishixin/Article/program/Oracle/201311/18883OraclePL/SQL基础知识及其相关概念
结构化查询语言(Structured Query Language 简称SQL)是用来访问关系型数据库一种通用语言 属于*语言( GL) 其执行特点是非过程化 即不用指明执行的具体方法和途径 而是简单地调用相应语句来直接取得结果即可 显然 这种不关注任何实现细节的语言对于开发者来说有着极大的便利 然而 有些复杂的业务流程要求相应的程序来描述 这种情况下 GL就有些*为力了 Oracle L/SQL的出现正是为了解决这一问题 Oracle PL/SQL是一种过程化语言 属于第三代语言 它与C C++ Java等语言一样关注于处理细节 可以用来实现比较复杂的业务逻辑
一 编程基础知识
程序结构
Oracle PL/SQL程序都是以块(block)为基本单位 整个Oracle PL/SQL块分三部分 声明部分(用declare开头) 执行部分(以 begin开头)和异常处理部分(以exception开头) 其中执行部分是必须的 其他两个部分可选 无论Oracle PL/SQL程序段的代码量有多大 其基本结构就是由这三部分组成
控制结构
Oracle PL/SQL程序段中有三种程序结构 条件结构 循环结构和顺序结构
) 条件结构
与其它语言完全类似 语法结构如下
if condition then
statement
else
statement
end if ;
)循环结构
这一结构与其他语言不太一样 在PL/SQL程序中有三种循环结构
a loop … end loop;
b while condition loop … end loop;
c for variable in low_bound upper_bound loop … end loop;
其中的 … 代表循环体
)顺序结构
实际就是goto的运用 不过从程序控制的角度来看 尽量少用goto可以使得程序结构更加的清晰
变量声明与赋值
Oracle PL/SQL主要用于数据库编程 所以其所有的数据类型跟Oracle数据库里的字段类型是一一对应的 大体分为数字型 布尔型 字符型和日期型 这里简单介绍两种常用数据类型 number varchar
)number 用来存储整数和浮点数 范围为1e ~ e 其使用语法为 number[(precision scale)]
其中(precision scale)是可选的 precision表示所有数字的个数 scale表示小数点右边数字的个数
)varchar 用来存储变长的字符串 其使用语法为 varchar [(size)]
其中size为可选 表示该字符串所能存储的最大长度
在Oracle PL/SQL中声明变量与其他语言不太一样 它采用从右往左的方式声明 比如声明一个number类型的变量v_id 那其形式应为 v_id nunmer;
如果给上面的v_id变量赋值 不能用 = 应该用 := 即形式为:v_id := ;
SQL基本命令
PL/SQL使用的数据库操作语言还是基于SQL的 所以熟悉SQL是进行Oracle PL/SQL编程的基础 SQL语言的分类情况大致如下
) 数据定义语言(DDL) Create Drop Grant Revoke …
) 数据操纵语言(DML) Update Insert Delete …
) 数据控制语言(DCL) Commit Rollback Savapoint …
) 其他 Alter System Connect Allocate …
具体的语法结构可以参阅其他关于SQL语言的资料 这里不再赘述
二 过程与函数
Oracle PL/SQL中的过程和函数与其他语言的过程和函数一样 都是为了执行一定的任务而组合在一起的语句 过程无返回值 函数有返回值
其语法结构为
过程 Create or replace procere procname(参数列表) as PL/SQL语句块
函数 Create or replace function funcname(参数列表) return 返回值 as PL/SQL语句块
三 游标
游标的定义为 用游标来指代一个DML SQL操作返回的结果集 即当一个对数据库的查询操作返回一组结果集时 用游标来标注这组结果集 以后通过对游标的操作来获取结果集中的数据信息 这里特别提出游标的概念 是因为它在PL/SQL的编程中非常的重要 定义游标的语法结构如下 cursor cursor_name is SQL语句;
四 其他概念
Oracle PL/SQL中包的概念很重要 主要是对一组功能相近的过程和函数进行封装 类似于面向对象中的名字空间的概念
lishixin/Article/program/Oracle/201311/18883plsql 如何在已有的表中再加一列
1、首先,在电脑中找到PLSQL Developer;
2、双击打开PLSQL Developer,账号登录;
3、登录之后,打开SQL窗口
4、在运行窗口执行SQL“alter table tb1 add aa varchar2(20);”给表tb1添加一个名为aa的字段
5、添加完就多出一列了
扩展资料:
plsql基本命令:
PL/SQL使用的数据库操作语言还是基于SQL的,所以熟悉SQL是进行PL/SQL编程的基础。SQL语言的分类情况大致如下:
1、数义语言(DDL):Create,Drop,Grant,Revoke,…
2、数据操纵语言(DML):Update,Insert,Delete,…
3、数据控制语言(DCL):Commit,Rollback,Savepoint,…
4、其他:Alter System,Connect,Allocate, …
参考资料来源:百度百科——plsql
PL/SQL基础的块结构
PL/SQL是一种块结构的语言,组成PL/SQL程序的单元是逻辑块,一个PL/SQL 程序包含了一个或多个逻辑块,每个块都可以划分为三个部分。与其他语言相同,变量在使用之前必须声明,PL/SQL提供了的专门用于处理异常的部分,下面描述了PL/SQL块的不同部分:
声明部分(Declaration section)
声明部分包含了变量和常量的数据类型和初始值。这个部分是由关键字DECLARE开始,如果不需要声明变量或常量,那么可以忽略这一部分;需要说明的是游标的声明也在这一部分。
执行部分(Executable section)
执行部分是PL/SQL块中的指令部分,由关键字BEGIN开始,所有的可执行语句都放在这一部分,其他的PL/SQL块也可以放在这一部分。
异常处理部分(Exception section)
这一部分是可选的,在这一部分中处理异常或错误,对异常处理的详细讨论我们在后面进行。
PL/SQL块语法
[DECLARE]
---declaration statements
BEGIN
---executable statements
[EXCEPTION]
---exception statements
END
PL/SQL块中的每一条语句都必须以分号结束,SQL语句可以使多行的,但分号表示该语句的结束。一行中可以有多条SQL语句,他们之间以分号分隔。每一个PL/SQL块由BEGIN或DECLARE开始,以END结束。注释由--标示。
PL/SQL块的命名和匿名
PL/SQL程序块可以是一个命名的程序块也可以是一个匿名程序块。匿名程序块可以用在服务器端也可以用在客户端。
命名程序块可以出现在其他PL/SQL程序块的声明部分,这方面比较明显的是子程序,子程序可以在执行部分引用,也可以在异常处理部分引用。
PL/SQL程序块可背编译并存储在数据库中,任何与数据库相连接的应用程序都可以访问这些存储的PL/SQL程序块。ORACLE提供了四种类型的可存储的程序:
. 函数
. 过程
. 包
. 触发器