PLSQL learning by self
10-PLSQL语法及使用技巧

10
SQL使用技巧
ROWID物理地址 SELECT rowid,t.* FROM train_service_tab t ; 利用rowid 进行光标定位
返回参数一年中的第几天的写法: SELECT TO_CHAR(SYSDATE,'DDD') FROM DUAL;
返回参数中一年的第几周的写法: SELECT TO_CHAR(SYSDATE,'WW') FROM DUAL;
增加月份的写法: SELECT ADD_MONTHS(SYSDATE,2) FROM DUAL;
取当前的序列值 SELECT seq_service_id.currval FROM DUAL;
取下一个序列值 SELECT seq_service_id.nextval FROM DUAL;
具体的使用 INSERT INTO train_service_tab(city_id,service_id)
第十章
PLSQL语法及使用技巧
介绍
• SQL是一种ANSI标准类型的描述语言,使用该语言 可以处理数据库中的数据;而PL/SQL则是Oracle 公司开发的一种对SQL语言进行了扩充的专门语言 。PL/SQL是以SQL语句为基础,所以先介绍SQL, 然后介绍PL/SQL。
• 这里我把在几年使用Oracle过程中积累的经验共 享给大家,和大家做个交流,交流的层面就不从 SQL或PL/SQL的基本语法入手,而是直接跃入使用 技巧。
6
SQL使用技巧
两个结果集之间的操作 --合并、加 SELECT * FROM train_service_tab UNION SELECT * FROM gw_service_tab; SELECT * FROM gw_service_tab UNION all SELECT * FROM gw_service_tab;--建议使用union all --交集 SELECT * FROM train_service_tab intersect SELECT * FROM gw_service_tab; --减 SELECT * FROM train_service_tab minus SELECT * FROM gw_service_tab;8SQ Nhomakorabea使用技巧
plsql高级应用技巧

plsql高级应用技巧PL/SQL Advanced Application TechniquesPL/SQL is a very powerful tool for developers to work with Oracle databases. It allows for the creation of stored procedures, functions, triggers, and packages, and provides the ability to write complex business logic within the database itself. This can greatly improve the performance and maintainability of an application, as well as provide better security by keeping sensitive data close to the source.PL/SQL高级应用技巧对于数据库开发人员来说是非常重要的。
通过PL/SQL,可以创建存储过程、函数、触发器和包,并在数据库中编写复杂的业务逻辑。
这可以极大地提高应用程序的性能和可维护性,同时通过将敏感数据保持在源头附近,提供更好的安全性。
One of the key benefits of using PL/SQL is the ability to encapsulate complex logic into reusable components. By creating functions and procedures, developers can abstract away the details of the implementation and expose only the necessary interface to other parts of the application. This not only makes the code easier to readand understand but also reduces the chances of bugs and inconsistencies in the logic.使用PL/SQL的一个关键好处是能够将复杂逻辑封装为可重用的组件。
PLSQL系列培训之一:基本语法(幻灯说明稿)

PL/SQL系列培训之一:基本语法第一讲分四个部分:SQL基本语法、基本逻辑控制、事务和异常SQL基本语法SQL分类数据定义语言DDL:CREATE/DROP/ALTER/COMMENT/TRUNCATE等数据操作语言DML:UPDA TE/DELETE/INSERT/CALL/SELECT FOR UPDA TE等数据控制语言DCL:GRANT/REVOKE/COMMIT/ROLLBACK等SELECT FOR UPDATESELECT FOR UPDA TE锁住某个表的相关行。
如果是多表查询:SELECT FOR UPDA TE of table.column----用来表连接时锁住其中一个表的相关行;----否则将锁住所有表(包括from子查询,不包括条件子查询)的相关行举例:SELECT t1.id, FROM test_table1 t1, test_table2 t2WHERE t1.id = t2.idFOR UPDA TE of t1.idLOCK TABLELOCK TABLE table_name IN lockmode MODE (NOWAIT)LOCK TABLE tanjie21 IN SHARE UPDATE MODE; --同下LOCK TABLE tanjie21 IN ROW SHARE MODE; --行共享锁,其他会话无法获得排他锁LOCK TABLE tanjie22 IN ROW EXCLUSIVE MODE; --行排他锁,禁止SHARE锁定--UPDATE/DELETE/INSERT自动获得LOCK TABLE tanjie23 IN SHARE MODE; --表共享锁LOCK TABLE tanjie24 IN EXCLUSIVE MODE; --表排他锁LOCK TABLE tanjie25 IN SHARE ROW EXCLUSIVE MODE; --表级共享行级排他W AIT/NOW AITNOWAIT --报ora-00054WAIT integer(秒) --报ora-30006EXECUTE IMMEDIATE处理动态SQL的两种方式:(1)EXECUTE IMMEDIA TE(2)OPEN-FOR, FETCH, and CLOSE性能优化(以后再讲):BULK EXECUTE IMMEDIA TEEXECUTE IMMEDIA TE的完整语法:EXECUTE IMMEDIATE dynamic_SQL_string[INTO defined_variable1, defined_variable2, ...][USING [IN | OUT | IN OUT] bind_argument1, bind_argument2, ...] [RETURNING INTO | RETURN bind_argument1, bind_argument2, ...]使用INTO子句确定返回的是单行查询结果(与SELECT INTO类似)SUB QUERY标准子查询:和主查询没有直接联系,在ORACLE中首先执行且只执行一次关联子查询:在执行过程中需要与主查询发生联系,如子查询的条件依赖于主查询传递的条件。
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加以限制。
Oracle数据库培训-PLSQL编程

(3)FOR..LOOP循环控制语句 FOR..LOOP循环控制语句的格式如下: FOR counter IN [REVERSE] start_range..end_range LOOP statements; END LOOP; LOOP和WHILE循环的循环次数都是不确定的,FOR循环的循环次数是固 定的,counter是一个隐式声明的变量,初始值是start_range,第二个值是 start_range+1,直到end_range,如果start_range等于end _range,那么循环 将执行一次。如果使用了REVERSE关键字,那么范围将是一个降序。
2.1 PL/SQL简介
2.1.1 PL/SQL特点 PL/SQL特点
2.1.2 开发及运行环境
2.1.1 PL/SQL特点 特点
1. PL/SQL的优点
(1)PL/SQL是一种高性能的基于事务处理的语言,能运行在任何Oracle 环境中,支持所有数据处理命令。通过使用PL/SQL程序单元处理SQL的 数据定义和数据控制元素。 (2)PL/SQL支持所有SQL数据类型和所有SQL函数,同时支持所有 Oracle对象类型。 (3)PL/SQL块可以被命名和存储在Oracle服务器中,同时也能被其他的 PL/SQL程序或SQL命令调用,任何客户/服务器工具都能访问PL/SQL程 序,具有很好的可重用性。 (2)可以使用Oracle数据工具管理存储在服务器中的PL/SQL程序的安全 性。可以授权或撤销数据库其他用户访问PL/SQL程序的能力。 (5)PL/SQL代码可以使用任何ASCII文本编辑器编写,所以对任何 Oracle能够运行的操作系统都是非常便利的。
PL/SQL编程 编程
第二章 PL/SQL编程 PL/SQL编程
PLSQL界面中英文对照

PLSQL界⾯中英⽂对照PL/SQL界⾯中英⽂对照File:⽂件New 新建Program Window 程序窗⼝Blank 空⽩Function 函数Java source Java源代码Package 包Package body 主体包Package specification 包说明Procedure 过程Trigger 触发器Type 类型Type body 类型主体Type specification 类型说明Test Window 测试窗⼝SQL Window SQL窗⼝Report Window 报告窗⼝Command Window 命令窗⼝Explain Plan Window 解释计划窗⼝Diagram Window 图标窗⼝View 视图Materialized view 物化窗⼝Table 表Sequence 序列Synonym 同义词Library 库Directory ⽬录Job 作业Queue 队列Queue table 队列表User ⽤户Role ⾓⾊Profile 概要⽂件Database link 数据库连接Open 打开Program File 程序⽂件Test Script 测试脚本SQL Script SQL脚本Report File 报告⽂件Command File 命令⽂件Diagram File 图标⽂件Reopen 重新打开Save 保存Save as 另存为Save all 全部保存E-mail 电⼦邮件Close 关闭Close All 全部关闭Print 打印Print Setup 打印设置Page Setup 页⾯设置New Instance 新建实例Authorization 授权Exit 退出VCS:Open Project 打开⼯程Close Projcet 关闭⼯程Check Out 签出Check in 签⼊Undo Check Out 撤销签出Get 获取Add 添加Remove 移除Properties 属性Differences 差异History 历史Check Out Files 签出⽂件Check In Files 签⼊⽂件Undo Check Out Files 撤销签出⽂件Get Files 获取⽂件Add Files 添加⽂件Run Version Control System 运⾏Version Control System Preferences ⾸选项Available Version Control Systems 可⽤的版本控制系统Show Comment for 显⽰注释Show Options for 显⽰选项Reopen Project on refresh 刷新时重新打开⼯程Query file status on refresh 刷新时查询⽂件状态Allow version control over DB objectsAdd Spec and Body as a Single fileAutomatically open last used project ⾃动打开最近使⽤过的⼯程Project:⼯程New 新建Open 打开Save 保存Save As 另存为Save All 全部保存Close 关闭Add to Project 添加到⼯程Remove from Project 从⼯程中移除Project Items ⼯程项⽬Make ⽣成Build 建⽴Find 查找To-Do Items 任务项⽬Options 选项Edit:编辑Undo 撤销Redo 重做PL/SQL Beautifier PL/SQL美化器PL/SQL Beautifier Options PL/SQL美化器选项Cut 剪切Copy 复制Paste 粘贴Append 附加Clear 清除Select All 全选Recall Statement 重新调⽤语句Special Copy 专⽤复制Selection 选择Indent 缩进Unindent 撤销缩进Uppercase ⼤写Lowercase ⼩写Comment 注释Uncomment 取消注释Apply Syntax Case 英语语法⼤⼩写Sort 排序Color Mark ⾊标To-Do Items 任务选项Find&Replace 查找Find Next 重复上次查找Find Previous 之前找到的Replace Next 替换下⼀个Search Bar 搜索栏Find Matches 查找拼配Full Screen 全屏Show Special Characters 显⽰特殊字符Code Folding 代码折叠Set Bookmark 设置书签Go to Bookmark 转到书签Bookmark List 书签列表Go to Line 转到⾏Next Tab Page 下⼀标签页Previous Tab Page 上⼀标签页Session:回话Log on 登录Log off 注销Set Main ConnectionImported Fixed UsersImported HistoryRecentExecute 执⾏Break 中断Kill 关闭Commit 提交Rollback 回滚SQL Trace SQL跟踪Debug:调试Toggle Breakpoint 切换断点Modify Breakpoint 更改断点Start 开始Run 运⾏Step Into 单步进⼊Step Over 单步跳过Step Out 单步退出Run to Exception 运⾏到异常Set Variable 设置变量Tools:⼯具Preferences ⾸选项Configure Plug-Ins 配置插件Configure Tools 配置⼯具Configure Documents 配置⽂档Configure Reports 配置报告PlsqldocMarco 宏Connections 连接Define Connections 定义连接Object Browser 浏览器Object Browser Folders 浏览器⽂件夹Object Browser Filters 浏览器过滤器File Browser ⽂件浏览File Browser Locations ⽂件浏览位置Template List 模板列表Window List 窗⼝列表Toolbar ⼯具栏Explain Plan 解释计划Code Assistant 代码助⼿Code Contents 代码⽬录Show Compiler Hints 显⽰编译器提⽰Query Builder 查询设计器Find Database Objects 查找数据库对象Compile Invalid Objects 编译⽆效对象Export User Object 到处⽤户对象Compare User Objects ⽐较⽤户对象Event Monitor 事件监视器Sessions 回话Test Manager 测试管理器DBMS Scheduler DBMS调度程序Export Tables 导出表Import Tables 引⼊表Compare Table Date ⽐较表数据Text Importer ⽂本导⼊器ODBC Importer ODBC导⼊器Data Generator 数据⽣成器Deployment:部署Macro:宏Documents:⽂档Reports:报告Window:窗⼝Help:帮助Preferences:OracleConnectionSession Mode 会话⽅式Multi session 多路会话Dual session 双路会话Single session 单路会话Logoff with open transaction 注销(有打开的事务)Check connection 检查链接Oracle Home(empty is autodetect) Oracle主⽬录名(⾃动检测为空)OCI library (empty is autodetect) Oracle库(⾃动检测为空)Force OCI7 mode on OCI8 在OCI8上强制使⽤OCI7Multiple Connections 多路连接Allow multiple connection 允许多路连接Store recent history 保存最近历史Store with password 带密码保存OptionsAllow editing of database source 允许编辑数据路远Ask to save edited database source 询问师傅保存刚变异过的数据库源Allow compilation of read-only source files 允许编译只读源⽂件Confirm commit & rollback 确认提交与回滚Use DBA Views if available 若可以⽤,则使⽤DBA查看Automatic statistics ⾃动统计Unicode enabled 允许UnicodeCheck for client & server character set mismatch 检查哭户机与服务器字符集是否匹配Add column alias list for View DDL 查看DDL的地址栏别名列表CompilerPL/SQL Optimize level 优化等级PL/SQL Code type 编码类型PL/Scope identifiers 标识符PL/SQL Conditional Compilation Flags 条件编译标志PL/SQL Warnings 警告PL/SQL Substitution Variables 替换变量Debugger 调试器Show variable values in a popup 在弹出式菜单⾥显⽰变量值Step over SYS objects 单步跳过SYS对象Update watches after each step 在每步之前更新监视器Update call stack after each step 在每步之后更新堆栈Add debug information when compiling 编译时添加调试信息NEVER add debug info for connections (user@db) 从来不连接添加调试信息(⽤户@数据库)ALWAYS add debug info for connections (user@db) 总是为连接添加调试信息(⽤户@数据库)NEVER add debug info for objects ([owner,] name) 从不为对象添加调试信息([所有者.]名称)Output 输出Trace 跟踪Available Columns可⽤按钮Selected Columns 以选按钮Event kind 时间种类Comment注释Event sequence 时间序列Event time事件时间Exception 异常Unit name单元名Proc line 过程⾏Unit line text 单元⾏⽂本Proc name 过程名Proc params过程参数Proc type 过程类型Unit line 单元⾏Unit type 单元类型Profiler 概览图User Interface ⽤户界⾯Options选项Autosave username⾃动保存⽤户名Autosave desktop⾃动保存桌⾯Use internal HTML viewer使⽤内置HTML阅览器HTML help window:”stay on top”HTML帮助窗⼝“固顶”Use multi-row tabs使⽤多⾏制表符Show complete file path in window titles 在窗⼝标题⾥⾯实现完成的⽂件路径Use projects 使⽤⼯程Position messageboxes near mouse pointer定位信息框靠近⿏标指针Show file dialogs with details view显⽰带详细内容的⽂件对话框Notify end of long running queries通知结束长时间运⾏的查询Delay(s)延迟Sound file声⾳⽂件DSA Dialogs:DSA对话框Shows a list of dialogs that have the “Don’t show this message again” option checked. You can delete lines for the messages you want you enable. 显⽰含有“不再显⽰这个信息”的对话框,你可以删除⽤于你要启⽤的信息⾏。
PLSQL循序渐进全面学习教程
课程一 PL/SQL 基本查询与排序本课重点:1、写SELECT语句进行数据库查询2、进行数学运算3、处理空值4、使用别名ALIASES5、连接列6、在SQL PLUS中编辑缓冲,修改SQL SCRIPTS7、ORDER BY进行排序输出。
8、使用WHERE 字段。
一、写SQL命令:不区分大小写。
SQL语句用数字分行,在SQL PLUS中被称为缓冲区。
最后以;或 / 结束语句。
也可以用RUN来执行语句二、举例例1:例2:对于数值或日期型的字段,可以进行相应的四则运算,优先级与标准的高级语言相同。
三、列的别名ALIASES:计算的时候特别有用;紧跟着列名,或在列名与别名之间加“AS”;如果别名中含有SPACE,特殊字符,或大小写,要用双引号引起。
例:四、连接符号:||连接不同的列或连接字符串使结果成为一个有意义的短语:五、管理NULL值:此函数使NULL转化为有意义的一个值,相当于替换NULL。
六、SQL PLUS的基本内容,请参考《SQL PLUS 简单实用精髓篇》七、ORDER BY 操作:与其他SQL92标准数据库相似,排序如:从Oracle7 release 7.0.16开始,ORDER BY 可以用别名。
另:通过位置判断排序:这样就避免了再写一次很长的表达式。
另:多列排序:八、限制选取行:例1:例2:例3:如果有列为NULL优先级:Order Evaluated Operator1 All comparison operators (=, <>, >, >=, <, <=, IN, LIKE, IS NULL, BETWEEN)2 AND3 OR总结:我们今天主要学习了如何进行查询SELECT操作,具体的组合查询与子查询将在以后的课堂中学习,同时希望大家可以工作、学习中多多摸索,实践!课程二 PL/SQL查询行函数本课重点:1、掌握各种在PL/SQL中可用的ROW函数2、使用这些函数的基本概念3、SELECT语句中使用函数4、使用转换函数注意:以下实例中标点均为英文半角一、FUNCTION的作用:进行数据计算,修改独立的数据,处理一组记录的输出,不同日期显示格式,进行数据类型转换函数分为:单独函数(ROW)和分组函数注意:可以嵌套、可以在SELECT, WHERE, 和 ORDER BY中出现。
plsql sql语句参数
plsql sql语句参数英文回答:SQL Statements with Parameters in PL/SQL.In PL/SQL, you can use parameters in SQL statements to pass values from your program to the database. This can be useful for a number of reasons, such as:Enhancing security: Parameters help prevent SQL injection attacks by separating the SQL statement from the data being passed into it.Improving performance: By using prepared statements, which are cached by the database, you can improve the performance of your SQL statements.Simplifying code: Parameters can make your code more readable and maintainable.There are two ways to use parameters in SQL statements in PL/SQL:1. Positional parameters: Positional parameters are specified using a question mark (?) as a placeholder for the parameter value. The values for the parameters are then passed to the statement in the order in which they appear. For example:DECLARE.v_emp_id NUMBER;v_salary NUMBER;BEGIN.v_emp_id := 100;v_salary := 10000;EXECUTE IMMEDIATE 'SELECT FROM employees WHEREemp_id = ? AND salary = ?'。
Oracle_Plsql个人学习笔记总结
备注:以下是个人学习笔记总结,其实是本人容易忘记,工作中碰到的一些知识点,记录下来整理成笔记了,序号之间并不是按照某种类型划分的,都是随意的标记一下,希望对大家有所帮助。
昵称:阿杜笑傲江湖(其实就是个名字而已,并不江湖…)name:杜立鸿(不要冒充,万一哪天中奖了呢?)sex:爷们---------------------------废话不多说,GO,GO,Go……1.允许修改分区建(有时候分区键更新不了,需要以下这样处理,当然了分区键本来是不允许更新的,都得根据实际情况)alter table t1 enable row movement;2. 获取某一时间最近的时间sqlselect *from t_datetime twhere t.f_time - to_date('2018-09-06 10:10:00','yyyy-mm-ddhh24:mi:ss') =(select min(t.f_time - to_date('2018-09-06 10:10:00','yyyy-mm-ddhh24:mi:ss'))from t_datetime t);3. 1.创建一个object类型的数据库类型对象。
表示学生实体类型。
(注意:此类型必须定义为数据库对象级别的类型,而不能定义成包、函数级别的类型。
否则,函数外部代码是无法识别该类型的)。
CREATE OR REPLACE TYPE student_obj_type AS OBJECT(stu_no NUMBER, --学号stu_name VARCHAR2(255), --姓名stu_sex VARCHAR2(2),--性别score NUMBER--成绩);4.创建一个嵌套表类型的数据库类型对象。
表示学生实体集合类型。
该类型也将用作函数中定义的返回类型。
(注意:此类型必须定义为数据库对象级别的类型,而不能定义成包、函数级别的类型。
PLSQL程序设计(基础篇)
PL/SQL的基本结构如下:
Declare
在这里可以定义变量、常量、异常等。
Begin
在这儿可以写一些执行SQL或PL/SQL语句。
源码:
说明:源码都是由PL/SQL Developer 8开发,于Oracle10g测试
-- Created on 2010-4-27 by Quasar
/*
这就是
你的第一个程序了,也是我的,哈哈
*/
declare
msg varchar2(15);--定义变量
begin
msg := 'Hello World';--赋值
from emp left outer join dept-- 1确定表
using(deptno)
where deptno > 0-- 2确定行(记录)
group by dname-- 3将行分组
having max(comm) is null or max(comm) > 0-- 4对组筛选
order by dname-- 6对结果集排序
dbms_output.put_line('Oracle第一个员工的信息:');
dbms_output.put_line('员工号:'||eno);
dbms_output.put_line('员工姓名:'||empname);
dbms_output.put_line('职位:'||empjob);
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
//author 满晨晨//time 2009 4 20上午字符型charvarchar2long 2000个非汉字字符1000汉字ncharnvarchar2数值型number方案schema用户名:表空间(表索引视图)lob 大对象blob 4g初始化init emp_blobcdml存二进制clob 4g存字符初始化init emp_clobcdml{insert delete update}使用%type定义变量定义记录类型变量使用&rowtype定义变量定义一维表类型变量定义多维表类型变量delcarev_empno EMP.empno%TYPE;v_ename EMP.ename%TYPE;beginselect sex into v_sexfrom t_demo;end;file:///E|/满晨晨的文档/培训/ORACLE/plsql/课堂记录/SQL课堂记录2009.4.20.txt2009-4-27 9:11:38 file:///E|/满晨晨的文档/培训/ORACLE/plsql/课堂记录/SQL课堂记录2009.4.21.txt//author 满晨晨//time 2009 4 21上午sql>conn scott/tiger/@oraclesql>ed 0421sqlupper()全规范为大写lower()全规范为小写set serveroutput ondeclaretype deptrec//部门表is record 声明记录类型部分字段(v_deptno dept.deptno%type,v_dname dept.dname%type);deptrec1 deptrec;beginselect deptno,dname into deptrec1 from dept where deptno=30;dbms_output.put_line(deptrec1.v_dname);dbms_output.put_line(deptrec1.v_deptno);end;create table t_empasselect * from scott.empwhere 1=1 全部复制过来%rowtype可以使变量获得字段的数据类型使用%rowtype可以使变量获得整个记录的数据类型比较两者不同:变量名数据表名.列名%type,变量名数据表名%rowtpye定义名字为mytable的复合类型变量,与testtable数据表结构相同set serveroutput ondeclaremytable testtable%rowtype;beginselect * into mytable from tempuser.testtablewhere recordnumber=88;doms_output_put.line(mytable.currentdate);end;表类型变量用来表示一维或多维数组一维表类型type 表类型is table of 类型index by binary_integer;表变量名表类型;//使用表类型变量类型可以使前面的类型的定义,index by binary_integer子句代表以符号整数为索引,这一访问表类型变量中的数据方法就是file:///E|/满晨晨的文档/培训/ORACLE/plsql/课堂记录/SQL课堂记录2009.4.21.txt(第1/4 页)2009-4-27 9:11:39file:///E|/满晨晨的文档/培训/ORACLE/plsql/课堂记录/SQL课堂记录2009.4.21.txt‘表变量名(索引符号整数)’sqlplusw /nogondeclaretype tabletype1 is table of varchar2(8) index by binary_integer;type tabletpye2 is table of tempuser.testtable.recordnumber%tpye index by binary_integer; table1 tabletype1;table2 tabletype2;begintable1(1):='大学';table1(2):='大专';table2(1):=88;table2(2):=55;dbms_output.put_line(table1(1)||table2(1));dbms_output.put_line(table1(2)||table2(2));end;||使连接字符串的运算符控制结构条件结构if switch循环结构loop exit for while循环结构goto null作业count first next lasy priror 函数<1000 显示工资太低>1000 <3000 显示工资中等>3000 显示工资较高实践从客户端输入一字符如果字符为A 输出信息‘A的标准是90分以上’如果字符为B 输出信息‘B的标准是80分至90分之间’如果字符为C输出信息‘C的标准是60之80分之间’否则输出信息不及格declarev_empno emp.empno%type:=&empno;v_ename emp.ename%type;beginselect empno, ename into v_empno,v_ename from emp where empno=v_empno; dbms_output.put_line(v_ename);exceptionwhen others thendbms_output.put_line(' your empno is null,ename is null');end;declarev_grade char(1):=upper(&p_grade);v_result varchar2(20);file:///E|/满晨晨的文档/培训/ORACLE/plsql/课堂记录/SQL课堂记录2009.4.21.txt(第2/4 页)2009-4-27 9:11:39 file:///E|/满晨晨的文档/培训/ORACLE/plsql/课堂记录/SQL课堂记录2009.4.21.txtbeginv_result:=case v_gradewhen 'A' then '90 分以上'when 'B' then '80分到90分之间'when 'C' then '60分到80分之间'else '不及格'end;dbms_output.put_line('grade'||v_grade||'result'||v_result);end;declarev_name emp.ename%type;v_sal emp.sal%tpye:=&sal;//显示输入sal的值&为输入接入点赋给v_salv_char varchar2(30);select ename,sal into v_name,v_sal from emp where sal=v_sal;if v_sal<1000 thenv_char:='sal is low';elsif v_sal>=1000 and v_sal<=3000 thenv_char:='sal is normal';else v_sal>3000 thenv_char:='sal is high';else v_char:='lost data';end if;dbms_output.put_line('name'||v_name||'sal'||v_char);end;if thenelseelsif thenend ifcase selectorwhen thenwhen thenend case;loop执行语句exit when 退出条件end loopfor count in 1..10000 loop执行语句file:///E|/满晨晨的文档/培训/ORACLE/plsql/课堂记录/SQL课堂记录2009.4.21.txt(第3/4 页)2009-4-27 9:11:39 file:///E|/满晨晨的文档/培训/ORACLE/plsql/课堂记录/SQL课堂记录2009.4.21.txtend loop;file:///E|/满晨晨的文档/培训/ORACLE/plsql/课堂记录/SQL课堂记录2009.4.21.txt(第4/4 页)2009-4-27 9:11:39 file:///E|/满晨晨的文档/培训/ORACLE/plsql/课堂记录/SQL课堂记录2009.4.22.txt//author 满晨晨//time 2009 4 22上午conn scott/tiger@STUF1DB查询表结构和表空间SHOW USERDESC USER_TABLES查询表的结构不显示内容select 查询表的内容SELECT TABLE_NAME,TABLESPACE_NAME FROM USER_TABLES table 不能用or replace 只能先删除再给重新建个表视图view1 查询速度快只做一次编译2 调用简单虚表不占物理内存空间视图名称以vi开头create view vi_depttempasselect e.empno,,d.dname from emo e join dept de.deptno=d.deptno;建立了view 虚表只是建立查询view虚表只存在内存里一关机就没了select* from vi_deptemp 查询具体内容更新视图update vi_demptemp set ename='张学友'where empno='7788'commit 提交对视图有影响对实际数据也更改delete from vi_的皮特名片where empno=7788commit 提交对视图有影响对实际数据也更改复制别人的表create table t_empasselect * from scott.emp where 1=1 或者1!=1create table t_deptasselect * from scott.deptfile:///E|/满晨晨的文档/培训/ORACLE/plsql/课堂记录/SQL课堂记录2009.4.22.txt(第1/5 页)2009-4-27 9:11:40file:///E|/满晨晨的文档/培训/ORACLE/plsql/课堂记录/SQL课堂记录2009.4.22.txtupdate 更新视图时候视图来源多个表时候无法更新必须使用触发器instead of 类型触发器而视图只有一个单表时候可以更新select job,sum(sal) as totalsal from t_emp group by job having job='clerk'视图查询时候聚合函数要给它重新命名;wheregroup byhavingorder bygroup by having 分组查询是将查询结果按照字段分组HAVING相当与WHERE的限制条件查询select empno,ename,job,salfrom scott.empgroup by job,empno,ename,sal ---按字段分组having sal<=2000 --分组后是否符合条件where 检查每条记录是否符合条件having检查分组后的各组是否满足条件having 只能配合group by 使用在使用join ,group by时候要使用视图结构触发器使特定事件出现的时候自动执行的代码块类似于存储过程但是用户不能直接调用他们当insert emp时候记录此操作过程到emp_log中业务逻辑自动执行功能1 允许/限制对表的修改2 自动生成派生列比如自增字段3 提供审计和日志记录4防止无效的事务处理5 启用复杂的业务逻辑触发器不会通知用户便改变了用户的输入值】语法create or replace trigger name tri_前缀_emp表明_insert事件tri_emp_insertafter /before /instead of(视图时候多表) 执行时机insert/update/delete 表之前之后替换视图什么事件on 表明视图名declarebeginfile:///E|/满晨晨的文档/培训/ORACLE/plsql/课堂记录/SQL课堂记录2009.4.22.txt(第2/5 页)2009-4-27 9:11:40file:///E|/满晨晨的文档/培训/ORACLE/plsql/课堂记录/SQL课堂记录2009.4.22.txtdml语句要commit,ddl语句end 触发器名称(也可以不写)create table t_emp_log(who varchar2(10) not null,action varchar2(10) not null,actime date);create or replace trigger tri_emp_insertbefore inserton t_empbegininsert into t_emp_log(who,action,actime)values(user,'insert',sysdate);end;raise_application_error(-20001,'你不能访问或修改这个表')ora-20001:你不能访问或修改这个表往里面插入东西如果是你这个用户的话可以操作如果不是弹出一个错误create or replace trigger tri_emp_insert1before inserton t_empbeginif user!='scott' thenraise_application_error(-20001,'你不能访问或修改这个表');end if;删除两条记录file:///E|/满晨晨的文档/培训/ORACLE/plsql/课堂记录/SQL课堂记录2009.4.22.txt(第3/5 页)2009-4-27 9:11:40file:///E|/满晨晨的文档/培训/ORACLE/plsql/课堂记录/SQL课堂记录2009.4.22.txt删除t_emp表中的数据同时把删除的数据保存到新的表a_emp中去create table a_empasselect * from t_emp where 1!=1;CREATE OR REPLACE TRIGGER TRI_t_empbefore delete ON T_empREFERENCING NEW AS NEWROWFOR EACH ROWdeclareBEGININSERT INTO a_empVALUEE(:NEWROW.empno,:NEWROW.ename,:NEWROW.job,:NEWROW.MGR,:NEWROW.HI REDATE,:NEWROW.Sal,:M,:NEWROW.deptno);END TRI_t_emp;触发器;statement trrow trend;delete 删除段drop删除表视图触发器行级触发器new -insert oid 无效old-delete new 无效dne rowfile:///E|/满晨晨的文档/培训/ORACLE/plsql/课堂记录/SQL课堂记录2009.4.22.txt(第4/5 页)2009-4-27 9:11:40file:///E|/满晨晨的文档/培训/ORACLE/plsql/课堂记录/SQL课堂记录2009.4.22.txtnew old -updatefor each row 循环遍历每一行带业务逻辑的触发器如插入T_DEMO3数据同时插入T_DEMO2,条件是工资要大于4500rmb的记录CREATE OR REPLACE TRIGGER TRI_TDEMO3AFTER INSERT ON T_DEMO3REFERENCING NEW AS NEWROWFOR EACH ROWWHEN(NEWROW.SALARY>=4500)BEGININSERT INTO T_DEMO2VALUEE(:NEWROW.ID,:NEWROW.TYPE,:,:NEWROW.SALARY,:NEWROW. C_DATE);END TRI_TDEMO3;file:///E|/满晨晨的文档/培训/ORACLE/plsql/课堂记录/SQL课堂记录2009.4.22.txt(第5/5 页)2009-4-27 9:11:40file:///E|/满晨晨的文档/培训/ORACLE/plsql/课堂记录/SQL课堂记录2009.4.23.txt//author 满晨晨//time 2009 4 23上午系级trigger监听到系统发生事件之后自动执行的代码块所以是after!!!!deleting 当向一个表执行delete动作时出发deleting事件inserting 当向一个表执行insert动作时出发inserting事件updating 当向一个表执行update动作时出发updating事件都是返回true或者falseif deleting thenelsif inserting thenelsif updating thenelse raise_application_errorcreate table t_emp_log2(who varchar2(10) not null,action varchar2(10) not null,actime date);create or replace trigger tri_emp2after insert or update or deleteon t_empbeginif updating theninsert into t_emp_log2(who,action,actime)values(user,'update',sysdate);elsif deleting theninsert into t_emp_log2(who,action,actime)values(user,'delete',sysdate);elsif inserting theninsert into t_emp_log2(who,action,actime)values(user,'insert',sysdate);end if;end;对操作行为进行表述时候不涉及数据正常写假如对操作行为更改的数据进行数据操作时候referencing new as newrowfor each row行级触发器修改的是行的所有列的数据的时候referencing new as newrowfor each row列级触发器修改的是某个列的数据的时候file:///E|/满晨晨的文档/培训/ORACLE/plsql/课堂记录/SQL课堂记录2009.4.23.txt(第1/3 页)2009-4-27 9:11:40file:///E|/满晨晨的文档/培训/ORACLE/plsql/课堂记录/SQL课堂记录2009.4.23.txtafter insert or update of enameon t_empreferencing new as newrowfor each rowcreate or replace trigger tri_emp2after insert or updateon t_empbeginif updating theninsert into t_emp_log2(who,action,actime)values(user,'update',sysdate);elsif deleting theninsert into t_emp_log2(who,action,actime)values(user,'delete',sysdate);elsif inserting theninsert into t_emp_log2(who,action,actime)values(user,'insert',sysdate);end if;end;更新的数据保存到新表中用newrow把删除的数据保存到列触发器只能针对update 因为insert 插入数据的时候肯定是更改了行的所有列create or replace trigger tri_emp4after update of enameon t_empreferencing new as newrowfor each rowbeginif updating theninsert into t_emp_log2(who,action,actime)values(user,'update',sysdate);INSERT INTO temp_new(ename,empno)VALUEE(:newrow.ename,:newrow.empno);elsif inserting theninsert into t_emp_log2(who,action,actime)values(user,'insert',sysdate);INSERT INTO temp_new(ename,empno)VALUEE(:newrow.ename,:newrow.empno);end if;end;行级触发器new保存更改后的数据old 保存删除之前的数据update delete insert列级触发器只能update更改某列视图如果是多表的话不能用update更新触发器instead只能用于更新视图时候用file:///E|/满晨晨的文档/培训/ORACLE/plsql/课堂记录/SQL课堂记录2009.4.23.txt(第2/3 页)2009-4-27 9:11:40file:///E|/满晨晨的文档/培训/ORACLE/plsql/课堂记录/SQL课堂记录2009.4.23.txt当update更新视图时候同时要更新基表(如果视图时单表的时候用update直接就可以更新更新视图同时也更新基表可当视图时多表的时候用update就不可以直接更新了必须用触发器)/**create view t1_t2asselect e.empno,e.ename,e.job,d.dname from t_emp e,t_dept d where d.deptno=e.deptno;**/create or replace view t1_t2asselect e.empno,e.ename,e.job,d.dname from t_emp e,t_dept d where d.deptno=e.deptno;create or replace trigger t1_t2instead of update on t1_t2referencing new as newrowfor each rowbeginupdate t_emp e set empno=:newrow.empno,ename=:newrow.ename,job=:newrow.job where empno=:newrow.empno;/**where指的是假如视图更新一个人的名字了那么也要更改基表怎么更改了不加where全部都改了加了where 假如视图更改的是1号为刘德华基表也要变成刘德华那么更改到基表用where判断基表号为1号更新ename**/update t_dept d set dname=:newrow.dname where deptno=(select deptno from t_emp where empno=:newrow.empno);end;old 和newcreate or replace trigger tir_t_emp2before update on t_empreferencing new as newrow old as oldrowfor each rowbeginINSERT INTO emp_NEW(EMPNO,ENAME,JOB,DEPTNO) update set对某一个数据进行更新更新之前的数据存在一个表里更新后的数据也放在一个表里values(:NEWROW.empno,:NEWROW.ename,:NEWROW.job,:NEWROW.deptno);更新后的数据保存在一个新的表中INSERT INTO emp_OLD(EMPNO,ENAME,JOB,DEPTNO)values(:OLDROW.empno,:OLDROW.ename,:OLDrow.job,:OLDROW.deptno);更新前的数据保存在一个新的表中end tir_t_emp2;file:///E|/满晨晨的文档/培训/ORACLE/plsql/课堂记录/SQL课堂记录2009.4.23.txt(第3/3 页)2009-4-27 9:11:40file:///E|/满晨晨的文档/培训/ORACLE/plsql/课堂记录/SQL课堂记录2009.4.24.txt//author 满晨晨//time 2009 4 24上午clob初始化为empty-clob()blob初始化为empty-clob()sequence序列序列号每次读取它会自动增加一般用在需要序列号排序的地方create sequence 序列名称increment by 增量start with 起始数字nomaxvalue/maxvalue 数字nocycle/cyclecache 数字;nomaxvaue 只能搭配nocycle 用maxvaue cycle 或者nocycle搭配用序列命名规则seq_数据库名称create sequence seq_dbstart withincrement by 1maxvalue 10nocyclecache 2;dual是经常用来系统测试的表序列名字.currval nextvalcreate sequence seq_1start with 1increment by 1maxvalue 100cycle/nocyclecache 2;创建序列1到100 然后再回到1到100declaresname number(3):=1;beginloopinsert into emp(empno,ename,hiredate,deptno)values(seq_1.nextval,'aa'||sname,sysdate,30); sname:=sname+1;exit when sname>1000;file:///E|/满晨晨的文档/培训/ORACLE/plsql/课堂记录/SQL课堂记录2009.4.24.txt(第1/4 页)2009-4-27 9:11:41file:///E|/满晨晨的文档/培训/ORACLE/plsql/课堂记录/SQL课堂记录2009.4.24.txtend loop;end;无法例程化石因为到了最大值了改改序列的循环maxvalue同一个语句多此调用nextvalue是同样的数值代理主键统一为ID没有实际含义只起到唯一标志一条记录的作用主键因为一般不能更改起到唯一标志的作用可是有些主键可以被更改如学号等等作主键代理主键就来作为唯一标志一定要选没有实际含义id varchar2(32) 一般用户max地址系统时间来定义存储过程把beginend之间的业务逻辑存下来好直接被引用procedurecreate or replace procedure 名称(para1 in/out datetype, in传入的参数(insert时候)在过程中不能被修改out 返回值在过程中可以被修改para1 in/out datetype)as /isbegindoend 过程名称;exec 存储过程的名字:调用存储过程存储过程不能用declare声明变量要想用声明变量()如上面的file:///E|/满晨晨的文档/培训/ORACLE/plsql/课堂记录/SQL课堂记录2009.4.24.txt(第2/4 页)2009-4-27 9:11:41file:///E|/满晨晨的文档/培训/ORACLE/plsql/课堂记录/SQL课堂记录2009.4.24.txtcreate or replace procedure p_b(v_id in varchar2,v_name in varchar2,v_psw in varchar2,v_address in varchar)asbegininsert into t_user(id,name,psw,address)values(v_id,v_name,v_psw,v_address);end;插入数据对内的所以用in如果对外输出的话变量用outexec p_b(354,546,'456sd','srf5');procedure变量中不能声明变量类型的大小create or replace procedure p_c(v_id in number(12))错误的这是自动扩展的12不能用定义大小也不能给它赋值in是给它赋值的出来的时候exec的时候给它赋值的create or replace procedure p_c(v_id in number:=1,v_name in number:=1,v_psw in number:=1,v_address in number:=1)asfile:///E|/满晨晨的文档/培训/ORACLE/plsql/课堂记录/SQL课堂记录2009.4.24.txt(第3/4 页)2009-4-27 9:11:41file:///E|/满晨晨的文档/培训/ORACLE/plsql/课堂记录/SQL课堂记录2009.4.24.txtbeginloopinsert into t_user(id,name,psw,address)values('id'||v_id,'name'||v_name,'psw'||v_psw,'address'||v_address);v_id:=v_id+1;v_name:=v_name+1;v_psw:=v_psw+1;v_address:=v_address+1;exit when v_id>200,v_name>200,v_psw>200,v_address>200;end loopend;删除存储过程drop procedure 过程名();file:///E|/满晨晨的文档/培训/ORACLE/plsql/课堂记录/SQL课堂记录2009.4.24.txt(第4/4 页)2009-4-27 9:11:41file:///E|/满晨晨的文档/培训/ORACLE/plsql/课堂记录/SQL课堂记录2009.4.25.txt//author 满晨晨//time 2009 4 25上午游标存储过程视图触发器数据库实际应用中非常重要的四部分cursor 是系统为用户开设的一个数据缓冲区存放sql语句的执行结果每个游标都有自己的名字用户可以用sql语句逐以从游标中获取记录并赋给主变量交给主语言进一步处理主语言是面向记录的一组主变量一次只能存放一条记录仅用主变量并不能完全满足sql语句向应用程序输出数据的要求嵌入式sql引入了游标的概念用来协调这两种不同的处理方式cursor :resultsset 结果集recordposi 记录位置本质上游标实际上时一种从包括多条数据记录的结果集中每次提取一条记录的机制游标总是与一条sql选择语句相关联因为游标由结果集(可以使零条或者一条或者由相关的选择语句检索出的多条记录)和结果集中指向特定记录的游标位置组成当决定对结果集进行处理时必须声明一个指向该结果集的游标游标分类显示游标用户自己声明操作隐式游标oracle为所有操作语言自动声明和操作的一种游标显示游标声明cursor 游标名(变量名数据类型,...)return 返回类型selectstatement;打开open 游标名(实参列表)提取fetch 游标名into(variable_list,record_variable)关闭close%isopen%found %notfound%rowcount 返回当前位置为止游标读取的记录行数set serveroutput on;declaret_empno emp.empno%type;cursor mycursor isselect e.empno,e.ename from emp e where empno>t_empno;cursored mycursor%rowtype;beginfile:///E|/满晨晨的文档/培训/ORACLE/plsql/课堂记录/SQL课堂记录2009.4.25.txt(第1/5 页)2009-4-27 9:11:42file:///E|/满晨晨的文档/培训/ORACLE/plsql/课堂记录/SQL课堂记录2009.4.25.txtt_empno:=10;open mycursor;if mycursor%isopen thenfetch mycursor into cursored;dbms_output.put_line(to_char(cursored.ename));elsedbms_output.put_line('no open!!');end if;close mycursor;end;set serveroutput on;declareeno emp.empno%type;e_name emp.ename%type;cursor mycurs1(var_name varchar2) isselect e.empno,e.ename from emp e where e.ename like var_name//like '%'||var_name||'%'; beginif mycurs1%isopen=false thenopen mycurs1('%A%');end if;fetch mysurs1 into eno,e_ename;while mysurs1%found loopdbms_output.put_line(eno||':'||e_name);if mycurs1%rowcount=4 thenexit;end if;fetch mycurs1 into eno,e_ename;end loop;close mycurs1;end;set serveroutput on;declaret_empno t_emp.empno%type;cursor mycursor isselect e.empno,e.ename from t_emp e where empno>t_empno;cursored mycursor%rowtype;begint_empno:=1000;open mycursor;if mycursor%isopen thenfetch mycursor into cursored;file:///E|/满晨晨的文档/培训/ORACLE/plsql/课堂记录/SQL课堂记录2009.4.25.txt(第2/5 页)2009-4-27 9:11:42file:///E|/满晨晨的文档/培训/ORACLE/plsql/课堂记录/SQL课堂记录2009.4.25.txtdbms_output.put_line(to_char(cursored.ename));elsedbms_output.put_line('no open!!');end if;while mycursor%foundloopdbms_output.put_line(t_empno||':'||to_char(cursored.ename));if mycursor%rowcount=4 thenexit;end if;fetch mycursor into t_empno,cursored.ename;end loop;close mycursor;end;set serveroutput on;declarecursor mycurs1 isselect e.empno,e.ename,e.deptno from t_emp e where e.deptno=20;beginfor employee in mycurs1loopif mycurs1%isopen thendbms_output.put_line('学号:'||employee.empno||'姓名:'||employee.ename||'部门:'||employee.deptno); end if;end loop;end;/**for游标**/创建包包一般是过程和函数的集合,对过程和函数进行更好的封装,一般不针对字段包的构成包括包头和包体包头仅仅是针对包中过程或者函数进行说明而没有实现create or replace package pack_t1is procedure sayhello(vname ,vachars);声明包的一个过程;end;file:///E|/满晨晨的文档/培训/ORACLE/plsql/课堂记录/SQL课堂记录2009.4.25.txt(第3/5 页)2009-4-27 9:11:42file:///E|/满晨晨的文档/培训/ORACLE/plsql/课堂记录/SQL课堂记录2009.4.25.txt包体是对包头中定义的过程函数的具体实现create or replace package body pack_t1isprocedure sayhello(vname varchar2);声明包的一个过程isdbms_output.put_line('hello'||vname);end;end;set serveroutput on;declaret_empno emp.empno%type;cursor mycursor isselect e.empno,e.ename from emp e where empno>t_empno;cursored mycursor%rowtype;begint_empno:=10;open mycursor;if mycursor%isopen thenfetch mycursor into cursored;dbms_output.put_line(to_char(cursored.ename));elsedbms_output.put_line('no open!!');end if;close mycursor;end;set serveroutput on;declareeno emp.empno%type;e_name emp.ename%type;cursor mycurs1(var_name varchar2) isselect e.empno,e.ename from emp e where e.ename like var_name//like '%'||var_name||'%'; beginif mycurs1%isopen=false thenopen mycurs1('%A%');end if;fetch mysurs1 into eno,e_ename;while mysurs1%found loopdbms_output.put_line(eno||':'||e_name);if mycurs1%rowcount=4 thenexit;file:///E|/满晨晨的文档/培训/ORACLE/plsql/课堂记录/SQL课堂记录2009.4.25.txt(第4/5 页)2009-4-27 9:11:42file:///E|/满晨晨的文档/培训/ORACLE/plsql/课堂记录/SQL课堂记录2009.4.25.txtend if;fetch mycurs1 into eno,e_ename;end loop;close mycurs1;end;set serveroutput on;declaret_empno t_emp.empno%type;cursor mycursor isselect e.empno,e.ename from t_emp e where empno>t_empno;cursored mycursor%rowtype;begint_empno:=1000;open mycursor;if mycursor%isopen thenfetch mycursor into cursored;dbms_output.put_line(to_char(cursored.ename));elsedbms_output.put_line('no open!!');end if;while mycursor%founddbms_output.put_line(t_empno||':'||to_char(cursored.ename)); if mycursor%rowcount=4 thenexit;end if;fetch mycursor into t_empno,cursored.ename;end loop;close mycursor;end;。