PLSQL语法介绍(有例子带注释)

合集下载

plsql建表 基本语句

plsql建表 基本语句

plsql建表基本语句在PL/SQL中,创建表的基本语句是使用CREATE TABLE命令。

以下是创建表的基本语法:sqlCREATE TABLEtable_name (column1 datatype[constraint],column2 datatype[constraint],column3 datatype[constraint],...);其中,table_name是表的名称,column1, column2, column3等是表中的列名,datatype是列的数据类型,constraint是可选的约束条件。

以下是一个示例,展示如何在PL/SQL中创建一个简单的表:sqlCREATE TABLE employees (employee_id NUMBER PRIMARYKEY,first_name VARCHAR2(50),last_name VARCHAR2(50),hire_date DATE,salary NUMBER(8,2) CHECK(salary > 0));在上面的示例中,我们创建了一个名为employees的表,包含了五个列:employee_id、first_name、last_name、hire_date和salary。

每个列都有相应的数据类型,并且为employee_id列设置了主键约束,为salary列设置了检查约束,确保工资大于0。

请注意,PL/SQL通常用于Oracle数据库的存储过程和函数,而创建表的语句实际上是在SQL部分执行的。

在Oracle SQL Developer 等工具中,可以直接执行上述SQL语句来创建表。

如果你需要在PL/SQL块中执行DDL语句(如CREATE TABLE),你可以使用动态SQL (例如EXECUTE IMMEDIATE语句)来实现。

PLSQL基本语法

PLSQL基本语法

PLSQL基本语法作者:gqk:1,什么是plsql: 是专⽤于Oracle服务器,在SQL基础之上,添加了⼀些过程化控制语句,叫PLSQL过程化包括有:类型定义,判断,循环,游标,异常或例外处理。

PLSQL强调过程2,Plsql语句块: PL/SQL程序都是以块(block)为基本单位,整个PL/SQL块分三部分:声明部分(⽤declare开头)执⾏部分(以 begin开头)其中执⾏部分是必须的,其他两个部分可选部分(以exception开头)结束:end--基本输出语句:BEGINdbms_output.put_line('hello,world');END;--基本输出语句BEGINdbms_output.put_line('hello,world');dbms_output.put_line(157);dbms_output.put_line(sysdate);dbms_output.put_line(true);--不能传⼊布尔值END;3,Plsql语句块分类: 匿名块:动态构造只执⾏⼀次(main)⼦程序:存储在数据库中的存储过程,函数及包等。

当在数据库建⽴好后可以在其他⼦程序中调⽤触发器:当数据库发⽣操作时,会触发⼀些事件,从⽽⾃动执⾏相应的程序4,Plsql中的变量类型:5,变量的使⽤: plsql中声明和执⾏部分要严格分开,在java中时先声明后写变量plsql中相反先声明在写数据类型: 变量在声明后没有赋值输出结果为空: 变量的声明和初始化:(boolean中只能声明不能输出)DECLAREi NUMBER(4) := 157;j NUMBER(6);c VARCHAR2(200) := 'HELLO,WORLD';d DATE := sysdate;b BOOLEAN := TRUE;BEGINj := 1000;--只能写在执⾏部分dbms_output.put_line('i=' || i);dbms_output.put_line('j=' || j);dbms_output.put_line('c=' || c);dbms_output.put_line('d=' || d);END;在声明快中对常量的声明: 变量名称【constant】 type 【not null】【:value】DECLAREc CONSTANT NUMBER(4) := 100;c2 NUMBER(4) NOT NULL := 101;BEGIN--c := 101; --常量不能重复赋值dbms_output.put_line('c=' || c);dbms_output.put_line('c2=' || c2);END; --空语句 NULL 执⾏语句中必须写东西DECLAREc CONSTANT NUMBER(4) := 100;c2 NUMBER(4) NOT NULL := 101;BEGINNULL;--空语句,作为占位符使⽤END; 6,PLSQL中使⽤sql: --更新100员⼯,⼯资增加1块钱 :(不能再执⾏块中直接输出select语句)声明变量:员⼯的编号声明变量:⼯资追加的钱数DECLAREv_empid BINARY_INTEGER := 100;v_money BINARY_INTEGER := 1;BEGINUPDATE employees SET salary=salary+v_moneyWHERE employee_id=v_empid;COMMIT;END;PLSQL中使⽤SQL语句的⼏种情况:DML或DCL语句:直接执⾏ 查询语句:SELECT...INTO 或者游标DDL语句:动态SQL执⾏  7,SELECT...INTO...的使⽤:语法:SELECT 列1,列2,…… INTO 变量1,变量2,……--查询某个员⼯编号的姓名和⼯资:员⼯编号姓名⼯资 列和变量的顺序,个数必须保持⼀致(如果没有数据则会抛出异常,返回的结果超过⼀⾏也会有异常)DECLAREv_empid BINARY_INTEGER := 101;v_name VARCHAR2(50);v_salary NUMBER(8,2);BEGINSELECT last_name,salaryINTO v_name,v_salaryFROM employeesWHERE employee_id=v_empid;dbms_output.put_line(v_empid || ',' || v_name || ',' || v_salary);END;--查询某个员⼯编号的姓名,⼯资,⼊职⽇期,部门编号:(以上思路我们需要声明多个变量) DECLAREv_empid BINARY_INTEGER := 101;v_name VARCHAR2(50);v_salary NUMBER(8,2);v_hiredate DATE;v_deptid BINARY_INTEGER;BEGINSELECT last_name,salary,hire_date,department_idINTO v_name,v_salary,v_hiredate,v_deptidFROM employeesWHERE employee_id=v_empid;dbms_output.put_line(v_empid || ',' || v_name || ','|| v_salary || ',' || v_hiredate || ',' || v_deptid);END;java中处理多个数据我们可以封装为对象:plsql中可以声明记录类型:时把逻辑相关的数据作为⼀个单元存储起来:--记录类型record--查询某个员⼯编号的姓名,⼯资,⼊职⽇期,部门编号DECLARETYPE emp_record_type IS RECORD (empid BINARY_INTEGER := 102,ename VARCHAR2(50),salary NUMBER(8,2),hiredate DATE,deptid BINARY_INTEGER);e emp_record_type;BEGINSELECT employee_id,last_name,salary,hire_date,department_idINTO eFROM employeesWHERE employee_id=e.empid;dbms_output.put_line(e.empid);dbms_output.put_line(e.ename);dbms_output.put_line(e.salary);dbms_output.put_line(e.hiredate);dbms_output.put_line(e.deptid);END; --参照引⽤类型:参照已有的数据类型--参照引⽤类型--参照引⽤变量类型:变量名称%TYPE--参照引⽤表中的列类型:表名.列名%TYPE--参照引⽤表的记录类型:表名%ROWTYPE demo:DECLAREi NUMBER(4);j i%TYPE := 100;--参照i的类型k employees.employee_id%TYPE := 101;--参照员⼯表中员⼯编号的数据类型BEGINdbms_output.put_line('j=' || j);dbms_output.put_line('k=' || k);END;--查询某个员⼯编号的姓名,⼯资,⼊职⽇期,部门编号(参照类型)DECLARETYPE emp_record_type IS RECORD (empid employees.employee_id%TYPE := 102,ename st_name%TYPE,salary employees.salary%TYPE,hiredate employees.hire_date%TYPE,deptid employees.department_id%TYPE);e emp_record_type;BEGINSELECT employee_id,last_name,salary,hire_date,department_idINTO eFROM employeesWHERE employee_id=e.empid;dbms_output.put_line(e.empid);dbms_output.put_line(e.ename);dbms_output.put_line(e.salary);dbms_output.put_line(e.hiredate);dbms_output.put_line(e.deptid);END; --查询某个员⼯编号的姓名,⼯资,⼊职⽇期,部门编号(参照引⽤表的记录类型)DECLAREe employees%ROWTYPE;BEGINe.employee_id := 103;SELECT *INTO eFROM employeesWHERE employee_id=e.employee_id;dbms_output.put_line(e.employee_id);dbms_output.put_line(st_name);dbms_output.put_line(e.salary);dbms_output.put_line(to_char(e.hire_date,'yyyy-mm-dd'));dbms_output.put_line(e.department_id);END;--PLSQL表类型 /*TYPE ⾃定义类型名称 IS TABLE OF 元素类型INDEX BY BINARY_INTEGER;*/DECLARETYPE name_table_type IS TABLE OF VARCHAR2(50)INDEX BY BINARY_INTEGER;n name_table_type;BEGINn(-7) := 'tom';n(4) := 'jack';n(9) := 'rose';dbms_output.put_line('元素的长度:' || n.count);dbms_output.put_line(n(4));END; --表类型的常⽤属性DECLARETYPE name_table_type IS TABLE OF VARCHAR2(50)INDEX BY BINARY_INTEGER;n name_table_type;BEGIN--设置元素n(-5) := 'tom';n(3) := 'jack';n(17) := 'rose';n(23) := 'zhang';n(24) := 'wangwu';--删除指定下标的元素--n.delete(17);--删除⼀个范围的元素--n.delete(10,24);--删除所有元素--n.delete;--返回元素长度dbms_output.put_line('元素个数:' || n.count);--判断下标是否存在IF n.exists(17) THENdbms_output.put_line('true');ELSEdbms_output.put_line('false');END IF;--输出最⼩下标dbms_output.put_line(n.first);--输出最⼤下标dbms_output.put_line(st);--返回指定下标的元素dbms_output.put_line(n(3));--返回上⼀个或下⼀个存在的下标,如果没有,返回NULLdbms_output.put_line(n.next(10));dbms_output.put_line(n.prior(10));END;--BULK COLLECT INTO:把查询结果⼀次性赋给⼀个表类型的变量,下标⾃动从1开始递增 --查询所有的员⼯姓名,存储到⼀个表类型的变量中DECLARETYPE name_table_type IS TABLE OF VARCHAR2(50)INDEX BY BINARY_INTEGER;n name_table_type;BEGINSELECT last_name BULK COLLECT INTO nFROM employees;dbms_output.put_line('元素长度:' || n.count);dbms_output.put_line(n(2));END;--查询所有的员⼯信息,存储到⼀个表类型的变量中DECLARETYPE emp_table_type IS TABLE OF employees%ROWTYPEINDEX BY BINARY_INTEGER;e emp_table_type;BEGINSELECT * BULK COLLECT INTO eFROM employees;dbms_output.put_line('元素长度:' || e.count);dbms_output.put_line(e(2).last_name);dbms_output.put_line(e(3).salary);END; 8,DML语句返回值:--RETURNING语句:DML操作返回值赋给变量RETURN 列1,列2,... INTO 变量1,变量2,...--更新某个员⼯的⼯资,输出这个员⼯姓名,新⼯资DECLAREv_empid employees.employee_id%TYPE := 100;v_name st_name%TYPE;v_money employees.salary%TYPE := 1;v_salary employees.salary%TYPE;BEGINUPDATE employeesSET salary=salary+v_moneyWHERE employee_id=v_empidRETURNING last_name,salaryINTO v_name,v_salary;dbms_output.put_line('姓名:' || v_name);dbms_output.put_line('新⼯资:' || v_salary);END; --插⼊语句中使⽤RETURNING语句:DECLAREd dept%ROWTYPE;BEGININSERT INTO dept VALUES (50,'AA','BB')RETURN deptno,dname,loc INTO d;dbms_output.put_line(d.deptno);dbms_output.put_line(d.dname);dbms_output.put_line(d.loc);END; --删除语句中使⽤RETURNING语句DECLAREd dept%ROWTYPE;BEGINDELETE FROM deptWHERE deptno=50RETURN deptno,dname,loc INTO d;dbms_output.put_line(d.deptno);dbms_output.put_line(d.dname);dbms_output.put_line(d.loc);END; --DML操作返回多⾏数据--更新某个部门的员⼯的⼯资,返回被更新的员⼯姓名,新⼯资DECLARETYPE emp_record_type IS RECORD (ename st_name%TYPE,salary employees.salary%TYPE);TYPE emp_table_type IS TABLE OF emp_record_typeINDEX BY BINARY_INTEGER;e emp_table_type;BEGINUPDATE employeesSET salary=salary+1WHERE department_id=50RETURN last_name,salary BULK COLLECT INTO e; dbms_output.put_line('更新了' || e.count || '个员⼯'); dbms_output.put_line(e(1).ename || ',' || e(1).salary); END;。

plsql + 的用法

plsql + 的用法

plsql + 的用法==========PlSql,全称为PL/SQL,是Oracle数据库中一种常用的编程语言。

本篇文章将详细介绍PlSql的用法,包括其基本语法、开发环境设置、常用函数和语句等。

一、基本语法-----PlSql的基本语法包括声明、赋值和执行语句。

以下是一个简单的PlSql程序示例:```sqlDECLAREv_name VARCHAR2(50);v_age NUMBER;BEGINv_name := '张三';v_age := 25;DBMS_OUTPUT.PUT_LINE('姓名: ' || v_name || ', 年龄: ' || v_age);END;```上述代码中,我们声明了两个变量v_name和v_age,并分别赋值为字符串和数字类型。

然后使用DBMS_OUTPUT.PUT_LINE语句输出结果。

在PlSql中,可以使用Oracle提供的输出函数来输出变量的值。

二、开发环境设置要编写和运行PlSql程序,需要安装Oracle数据库客户端,并配置开发环境。

具体步骤如下:1. 安装Oracle数据库客户端,并确保数据库服务已启动。

2. 打开Oracle SQL Developer或其他Oracle数据库管理工具。

3. 创建一个数据库连接,并选择要使用的数据库。

4. 在工具中打开一个新的PlSql编辑器窗口或创建一个新的PlSql文件。

三、常用函数和语句---------PlSql提供了许多内置函数和语句,用于处理数据、执行操作和生成结果。

以下是一些常用的函数和语句:* 数据类型转换函数:TO_CHAR、TO_NUMBER等。

* 字符串操作函数:SUBSTR、LENGTH、REPLACE等。

* 日期操作函数:YEAR、MONTH、DAY等。

* 控制语句:BEGIN...END、LOOP、WHILE、CASE等。

* 异常处理语句:EXCEPTION、RAISE等。

plsql用法,操作介绍

plsql用法,操作介绍

plsql用法,操作介绍PL/SQL是Oracle数据库中一种重要的编程语言,它提供了强大的数据处理和数据库操作能力。

本文将向大家介绍PL/SQL的用法和操作。

一、PL/SQL基础PL/SQL是一种过程化的编程语言,它可以在Oracle数据库中执行存储过程、函数、触发器和包等对象。

这些对象可以由用户自定义,并在数据库中存储,以供其他用户调用。

PL/SQL提供了丰富的数据类型、控制结构、函数和过程,使得开发者可以方便地编写复杂的数据库操作程序。

二、PL/SQL语法1. 声明语句:在PL/SQL中,需要先声明变量和常量,常见的声明语句有:变量声明(如:变量类型数据类型;),常量声明(如:CONST 常量名数据类型 = 值)。

2. 条件语句:PL/SQL支持多种条件语句,如IF-THEN-ELSE,CASE表达式等。

3. 循环语句:PL/SQL支持FOR循环、WHILE循环和LOOP循环等。

4. 异常处理:PL/SQL提供了异常处理机制,可以捕获和处理运行时出现的错误。

5. 函数和过程:PL/SQL支持定义函数和过程,可以对数据进行操作并返回结果。

三、PL/SQL操作1. 创建存储过程:可以使用CREATE PROCEDURE语句创建存储过程,指定过程的名称、参数和执行逻辑。

2. 调用存储过程:可以使用CALL语句调用存储过程,并传递参数。

3. 创建函数:可以使用CREATE FUNCTION语句创建函数,指定函数的名称、参数和返回值类型。

4. 调用函数:可以使用直接调用函数的方式或通过存储过程调用函数。

5. 创建触发器:可以使用CREATE TRIGGER语句创建触发器,用于在数据插入、更新或删除时触发特定的操作。

6. 修改和删除对象:可以使用ALTER PROCEDURE、DROP PROCEDURE、DROP FUNCTION等语句修改或删除已存在的PL/SQL对象。

四、示例以下是一个简单的PL/SQL程序示例,用于将输入的字符串转换为大写并输出:```plsqlDECLAREv_str VARCHAR2(100);v_upper VARCHAR2(100);BEGIN-- 获取输入字符串:in_str := 'hello world';v_str := :in_str;-- 将字符串转换为大写并输出v_upper := UPPER(v_str);DBMS_OUTPUT.PUT_LINE('转换后的字符串为: ' || v_upper);END;```在上述示例中,我们使用了DECLARE语句声明了两个变量v_str 和v_upper,分别用于存储输入的字符串和转换后的结果。

PLSQL语法

PLSQL语法

PLSQL语法Procedural Language和SQL的结合体。

通过增加变量、控制语句,使我们可以写些逻辑更加复杂的数据库操作语句框架组成declare – 可选声明各种变量或游标的地⽅。

begin – 必要开始执⾏语句。

--单⾏注释语句⽤两个连在⼀起的‘-’表⽰。

/*多⾏注释语句,可以换⾏*/exception – 可选出错后的处理。

end; – 必要(请注意end后⾯的分号)简单helloworld程序1declare2 v_temp number(6):=123; /* := 是⼀个赋值符号 */3begin4 dbms_output.put_line('middle');5 dbms_output.put_line(v_temp);6end;注意要想显⽰程序的东西需要设置环境set serveroutput off -->关闭输出(默认关闭)set serveroutput on -->打开输出基本数据类型Number 数字型Int 整数型Pls_integer 整数型,产⽣溢出时出现错误Binary_integer 整数型,表⽰带符号的整数Char 定长字符型,最⼤255个字符Varchar2 变长字符型,最⼤2000个字符Long 变长字符型,最长2GBDate ⽇期型Boolean 布尔型(TRUE、FALSE、NULL三者取⼀)%type 表⽰不需要知道具体的⼀个字段类型,与指定的字段类型⼀致即可。

例如:v_empno emp.empno%type;%rowtype 与表结构完全⼀致 %rowtype 举例:1declare2 v_tt emp%rowtype;3begin4select*into v_tt from emp where empno=7521;5 dbms_output.put_line(v_tt.job);6 dbms_output.put_line(v_tt.sal);7end;89输出:SALESMAN101250varray定义语法TYPE VARRAY NAMEIS VARRAY(SIZE) OF ELEMENT TYPE [NOT NULL];其中,varray name是VARRAY数据类型的名称,size是正整数,表⽰可以容纳的成员的最⼤数量,每个成员的数据类型是element typeo默认时,成员可以取空值,否则需要使⽤NOT NULL加以限制。

plsql loop用法-概述说明以及解释

plsql loop用法-概述说明以及解释

plsql loop用法-概述说明以及解释1.引言1.1 概述PL/SQL循环是编程语言PL/SQL中非常重要的一个概念。

在编写程序时,经常会遇到需要重复执行某些代码块的情况,这时就需要使用循环语句来实现。

PL/SQL循环提供了多种类型的循环结构,可以根据具体的需求选择合适的循环方式。

循环结构可以帮助程序实现重复执行的需求,提高了代码的可复用性和效率。

通过循环,可以反复执行一段代码,直到满足某个条件退出循环或达到循环执行的次数上限。

PL/SQL循环的语法和用法非常灵活,可以根据不同的需求选择不同的循环方式,如FOR循环、WHILE循环和LOOP循环等。

每种循环方式都有其特殊的应用场景,可以根据具体的编程需求选择最适合的循环结构。

本文将详细介绍PL/SQL循环的基本概念、语法和用法,并举例说明不同类型循环的具体应用场景。

我们将深入探讨循环结构在程序中的重要性,以及如何灵活运用循环语句来解决实际编程中的问题。

在进一步研究和学习PL/SQL循环的过程中,我们建议读者通过阅读相关文献和教程,参与实际的编程实践,以加深对循环结构的理解和掌握。

只有深入学习并不断实践,才能在编程中熟练运用循环语句,提高代码的可维护性和可扩展性。

总之,PL/SQL循环是编程中不可或缺的一部分,理解和掌握循环结构的基本概念和用法对于开发高效、可靠的程序至关重要。

在接下来的正文部分,我们将详细介绍PL/SQL循环的相关内容,帮助读者深入了解和运用循环语句。

1.2 文章结构本文将介绍PL/SQL循环的用法,包括循环的基本概念、语法和用法。

文章分为三个主要部分:引言、正文和结论。

在引言部分,我们将概述本文的主题和目的。

PL/SQL循环作为PL/SQL语言中的重要概念之一,对于程序的控制流非常关键。

通过深入探讨PL/SQL循环的用法,我们可以提高代码的效率,增强程序的可读性和可维护性。

在正文部分,将首先介绍PL/SQL循环的基本概念。

我们将解释什么是循环以及循环的作用和优势。

PLSQL语法总结

PLSQL语法总结

PLSQL语法总结1.PL/SQL块:Declare——可选变量、常量、游标、用户自定义的特殊类型Begin——必须SQL语句PL/SQL语句Exception——可选错误发生时的处理动作End;——必须2.Identifier [constant] datatype [not null] [:=|default expr];声明PL/SQL变量3.Set serveroutput on:显示由DBMS_OUTPUT.PUT_LINE输出的结果4.Variable_name table.column_name%type;:由表中已存在的列定义新数据类型v_sal emp.sal%type;5.Identifier:=expr;:变量的赋值6.SELECT select_listINTO {variable_name[, variable_name]…| record_name}FROM tableWHERE condition;从数据库中获取数据7.IF no>0 THENStatements;[ELSIF no=0 THENStatements;][ELSEStatements;]END IF;条件判断语句8.LOOPStatement1;…EXIT[WHEN condition];END LOOP;基本LOOP循环语句9.FOR counter in [REVERSE]Lower_bound..upper_bound LOOPStatement1;Statement2;…END LOOP;FOR循环语句declarev emp%rowtype;beginfor i in 7000..8000 loopbeginselect * into v from empwhere empno = i and sal > 1300 ;dbms_output.put_line(v.ename||' is '||v.sal);exceptionwhen no_data_found then null;end;end loop;end;10.TYPE type_name IS RECORD (组合类型之record)(field_declaration[,field_declaration]…);Field_name{field_type|variable%TYPE|table.column%TYPE|table%ROWTYPE}[[NOT NULL]{:= | DEFAULT}expr]Recordtype type_name定义一个记录declaretype mrec is record(name emp.ename%type,sal emp.sal%type);r mrec;beginselect ename, sal into rfrom emp where empno = 7839;dbms_output.put_line( || ' has sal: ' || r.sal);end;/11.TYPE type_name IS TABLE OF (组合类型之index by table)(column_type | variable%type| table.column%type)[NOT NULL][INDEX BY BINARY_INTEGER];Identifier type_name;创建一个PL/SQL表DECLARETYPE ibt IS TABLE OFVARCHAR2(32)INDEX BY BINARY_INTEGER;v ibt;BEGINV(-12) := 'aaa';V(2) := 'BBB';V(0) := 'C';DBMS_OUTPUT.PUT_LINE(V(-12));DBMS_OUTPUT.PUT_LINE(V(0));DBMS_OUTPUT.PUT_LINE(V(2));END;12.CURSOR cur_name IS Select_statementFROM TABLE WHERE ...;声明游标13.OPEN cur_name;打开游标14.FETCH cur_name INTO v;|record_name];从游标中提取数据15.CLOSE cur_name;关闭游标DECLARECURSOR CRS IS SELECT ENAME, SAL, DNAMEFROM EMP JOIN DEPT USING(DEPTNO)WHERE DEPTNO !=10AND SAL BETWEEN 1500 AND 3000;V CRS%ROWTYPE;BEGINOPEN CRS;LOOPFETCH CRS INTO V;EXIT WHEN CRS%NOTFOUND;DBMS_OUTPUT.PUT_LINE(V.ENAME || ' ' || V.SAL || ' ' || V.DNAME);END LOOP;CLOSE CRS;END;16.FOR record_name IN cur_name LOOPStatement1;Statement2;…END LOOP;游标式的FOR循环DECLARECURSOR C IS SELECT * FROM EMPWHERE SAL BETWEEN 1500 AND 3000AND DEPTNO = 30;BEGINFOR V IN C LOOPDBMS_OUTPUT.PUT_LINE(V.ENAME || ' HAS SAL: ' || V.SAL);END LOOP;END;17.SELECT…FROM…FRO UPDATE [OF column_reference][NOWAIT];在事务执行期间显示锁定以拒绝访问,在更新或删除时锁定该行18.WHERE CURRENT OF cursor;更新或删除游标中当前行的数据19.CREATE [OR REPLACE] PROCEDURE procedure_name[(parameter1 [mode1] datatype1,Parameter2 [mode2] datatype2,…)]IS|ASPL/SQL Block;创建一个过程20.DROP PROCEDURE procedure_name删除过程21.CREATE [OR REPLACE] FUCTION function_name[(parameter1 [mode1] datatype1,Parameter2 [mode2] datatype2,…)]RETURN datatypeIS|ASPL/SQL Block;创建函数22.DROP FUNCTION function_name删除函数23.CREATE [OR REPLACE] PACKAGE Package_nameIS|AS公共变量,异常,游标,子程序声明END package_name;创建一个包声明24.CREATE OR REPLACE PACKAGE BODY package_nameIS私有的变量,静态变量,游标,异常,类型,子程序,子程序体 END package_name;创建包体25.DROP PACKAGE package_name;删除包26.DROP PACKAGE BODY package_name;只删除包主体27.。

plsql用法

plsql用法

plsql用法PL/SQL是一种过程化编程语言,它是Oracle数据库的一部分,用于编写存储过程、触发器、函数和包等数据库对象。

PL/SQL具有与SQL相同的数据类型和语法,同时还具有流程控制语句、异常处理和面向对象编程的特性。

在Oracle数据库中,PL/SQL是一种非常重要的编程语言,它可以提高数据库的性能和安全性。

PL/SQL的基本语法PL/SQL的基本语法与SQL相似,但它还包括了一些额外的语法元素。

以下是PL/SQL的基本语法:1. 声明变量和常量DECLAREvariable_name datatype [NOT NULL := value];constant_name CONSTANT datatype := value;BEGIN-- PL/SQL code goes hereEND;2. 控制流语句IF condition THEN-- code to execute if condition is trueELSIF condition THEN-- code to execute if the first condition is false and this condition is trueELSE-- code to execute if all conditions are falseEND IF;CASE variableWHEN value1 THEN-- code to execute if variable equals value1WHEN value2 THEN-- code to execute if variable equals value2ELSE-- code to execute if variable does not equal any of the specified valuesEND CASE;FOR variable IN [REVERSE] lower_bound..upper_bound LOOP -- code to execute for each value of variable betweenlower_bound and upper_boundEND LOOP;WHILE condition LOOP-- code to execute while condition is trueEND LOOP;3. 异常处理BEGIN-- PL/SQL code goes hereEXCEPTIONWHEN exception1 THEN-- code to execute if exception1 is raisedWHEN exception2 THEN-- code to execute if exception2 is raisedELSE-- code to execute if any other exception is raised END;4. 存储过程和函数CREATE [OR REPLACE] PROCEDURE procedure_name(parameter1 datatype, parameter2 datatype, ...)AS-- PL/SQL code goes hereBEGIN-- code to execute when the procedure is calledEND;CREATE [OR REPLACE] FUNCTION function_name(parameter1 datatype, parameter2 datatype, ...)RETURN return_datatypeAS-- PL/SQL code goes hereBEGIN-- code to execute when the function is calledEND;PL/SQL的优点1. 提高数据库性能PL/SQL可以在数据库中执行,这意味着它可以利用数据库的优化器和缓存机制来提高性能。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

PLSQL语法介绍(有例子带注释)关键字: oracle/plsql/游标/存储过程/触发器--最简单的语句块set serveroutput on; //用于输出显示begindbms_output.put_line('HeloWorld');end;--一个简单的PL/SQL语句块declare //声明变量,必须 v_ 开头v_name varchar2(20);beginv_name := 'myname'; //变量的赋值格式dbms_output.put_line(v_name);end;--语句块的组成declarev_num number := 0;beginv_num := 2/v_num;dbms_output.put_line(v_num);exception //如果没有这部分,当出现异常的时候,就执行过不去when others thendbms_output.put_line('error');end;--变量声明的规则1): 变量名不能够使用保留字,如from、select等2): 第一个字符必须是字母3): 变量名最多包含30个字符4): 不要与数据库的表或者列同名5): 每一行只能声明一个变量--常用变量类型1): binary_integer: 整数,主要用来计数而不是用来表示字段类型2): number: 数字类型3): char: 定长字符串4): varchar2: 变长字符串5): date: 日期6): long: 长字符串,最长2GB7): boolean: 布尔类型,可以取值为 true、false和null--变量声明,可以使用 %type 属性declarev_empno number(4);v_empno2 emp.empno%type;//表示该变量的类型和emp表中的empno字段保持一致。

v_empno3 v_empno2%type;begindbms_output.put_line('Test');--Table变量类型 //类似于java中的数组declaretype type_table_emp_empno is table of emp.empno%type index by binary_integer; //声明一个类型v_empnos type_table_emp_empno;beginv_empnos(0) := 100;v_empnos(2) := 200;v_empnos(-1):= 300;dbms_output.put_line(v_empnos(-1));end;--Record变量类型 //类似于java中的类,可以表示一整条记录declaretype type_record_dept is record(deptno dept.deptno%type,dname dept.dname%type,loc dept.loc%type);v_temp type_record_dept;beginv_temp.deptno := 50;v_temp.dname := 'aaa';v_temp.loc := 'bj';dbms_output.put_line(v_temp.deptno || '' || v_temp.dname); end;不过当表增加了一个字段之后它就不管用了,可以选用下面的这种: %rowtype --使用%rowtype声明Record类型变量declarev_temp dept%rowtype;beginv_temp.deptno := 50;v_temp.dname := 'aaa';v_temp.loc := 'bj';dbms_output.put_line(v_temp.deptno || '' || v_temp.dname);--SQL语句的运用1:declarev_ename emp.ename%type;v_sal emp.sal%type;beginselect ename,sal into v_ename,v_sal from emp where empno = 7369;//必须返回记录,并且只能返回一条dbms_output.put_line(v_ename || '' || v_sal);end;2:declarev_emp emp%rowtype;beginselect * into v_emp from emp where empno = 7396;dbms_output.put_line(v_emp.ename);end;3:declarev_deptno dept.deptno%type := 50;v_dname dept.dname%type := 'aaa';v_loc dept.loc%type := 'bj';begininsert into dept2 values (v_deptno,v_dname,v_loc); //insert、delete、update和sql是一样的,只是可以用变量commit;end;4:declarev_deptno emp2.deptno%type := 10;v_count number;beginupdate emp2 set sal = sal/2 where deptno = v_deptno;dbms_output.put_line(sql%rowcount || '条记录被影响');commit;end;sql%rowcount 表示:刚执行的最后一句sql影响到了多少条记录--执行DDL语句beginexecute immediate 'create table T (nnn varchar2(20) default ''aaa'')';end;--if语句--取出7369的薪水,如果<1200,则输出'low',如果<2000则输出'middle',否则'high'declarev_sal emp.sal%type;beginselect sal into v_sal from emp where empno = '7369'; if(v_sal < 1200) thendbms_output.put_line('low');elsif(v_sal < 2000) thendbms_output.put_line('middle');elsedbms_output.put_line('high');end if;end;--循环(1):相当于 do .. while 循环declarei binary_integer := 1;beginloopdbms_output.put_line(i);i := i + 1;exit when (i >= 11); //循环结束的条件end loop;end;(2):while循环declarej binary_integer := 1;beginwhile j < 11 loopdbms_output.put_line(j);j := j + 1;end loop;end;(3):for循环beginfor k in 1..10 loopdbms_output.put_line(k);end loop;for k in reverse 1..10 loop //表示 k 的值从 10 到 1 dbms_output.put_line(k);end loop;end;--错误处理 (too_many_rows、no_data_found 等等)declarev_temp number(4);beginselect empno into v_temp from emp where empno = 10; exceptionwhen too_many_rows thendbms_output.put_line('太多记录了');when no_data_found thendbms_output.put_line('没数据');when others thendbms_output.put_line('error');end;--将错误信息存储到一张日志表中(1):create table errorlog(id number primary key,errcode number,errmsg varchar2(1024),errdate date);(2):create sequence seq_errorlog_id start with 1 increment by 1;(3):declarev_deptno dept.deptno%type := 10;v_errcode number;v_errmsg varchar2(1024);begindelete from dept where deptno = v_deptno;commit;exceptionwhen others thenrollback;v_errcode := SQLCODE; //是关键字,错误代码v_errmsg := SQLERRM; //是关键字,错误信息insert into errorlogvalues(seq_errorlog_id.nextval,v_errcode,v_errmsg,sysdate); commit;end;--游标1:用游标取一条记录cursor c is //声明一个游标,这时候不会真正执行后面的查询语句,要等到打开游标的时候才执行select * from emp;v_emp c%rowtype;beginopen c;fetch c into v_emp;dbms_output.put_line(v_emp.ename);close c;end;2:结合循环取出多条记录(1):do..while循环declarecursor c isselect * from emp;v_emp c%rowtype;beginopen c;loopfetch c into v_emp;exit when (c%notfound); //当最近一次 fetch 没有返回记录dbms_output.put_line(v_emp.ename);end loop;close c;end;(2):while循环declarecursor c isselect * from emp;v_emp emp%rowtype;beginopen c;fetch c into v_emp;while (c%found) loopdbms_output.put_line(v_emp.ename);fetch c into v_emp;end loop;close c;end;(3):for循环declarecursor c isselect * from emp;for v_emp in c loop //for循环会自动打开和关闭游标,还会自动fetch..intodbms_output.put_line(v_emp.ename);end loop;end;--带参数的游标declarecursor c(v_deptno emp.deptno%type,v_job emp.job%type)isselect ename,sal from emp where deptno = v_deptno and job = v_job;beginfor v_temp in c (30,'clerk') loopdbms_output.put_line(v_temp.ename);end loop;end;--可更新的游标declarecursor cisselect * from emp2 for update;beginfor v_temp in c loopif(v_temp.sal < 2000) thenupdate emp2 set sal = sal * 2 where current of c;elsif(v_temp.sal = 5000) thendelete from emp2 where current of c;end if;end loop;commit;end;--存储过程存储过程:带有名字的PL/SQL的程序块,没有返回值create or replace procedure pis //用它代替了 declarecursor c isselect * from emp2 for update;beginfor v_emp in c loopif(v_emp.deptno = 10) thenupdate emp2 set sal = sal + 10 where current of c; elsif(v_emp.deptno = 20) thenupdate emp2 set sal = sal + 20 where current of c;elseupdate emp2 set sal = sal + 50 where current of c; end if;end loop;commit;end;上面的程序只是定义了一个存储过程,并没有真正执行。

相关文档
最新文档