技术改变世界 阅读塑造人生! - shaogx.com

This string was altered by TechBlog\Plugins\Example.; This is an example to show the potential of an offcanvas layout pattern in Bootstrap. Try some responsive-range viewport sizes to see it in action.

第四章、PL/SQL基础

 1、PL/SQL概述2、PL/SQL块结构3、分支语句的使用4、循环语句的使用5、异常处理的使用6、记录的使用 PL/SQL块结构PL/SQL块结构如下DECLARE...BEGIN...EXCEPTION...END;/ 变量声明1、变量声明的内容赋予变量适当名称赋予变量正确的数据类型定义变量(标准、记录)控制变量范围2、命名规则变量由字符开头可以包含:数字、下划线、'$'、'#'等变量长度范围:1~30大小写不区分变量名不能是系统关键字 DECLAREx varchar2(10);BEGINx:='This is..';DBMS_OUTPUT.PUT_LINE('x的值为:'||x);END;/ ?SET --查询SET如何使用SET SERVEROUTPUT ON SIZE 10000 save c:\plsql_01.txt --plsql_01.txt中是PL/SQL语句 sqlplus中执行文件c:\plsql_01.txt:@ c:\plsql_01.txtsqlplus查看执行的文件的源码:l DECLAREx varchar2(10);BEGINx:='This is..';DBMS_OUTPUT.PUT('x的值为:'||x); --不显示END;/ DECLAREx varchar2(10);BEGINx:='This is..';DBMS_OUTPUT.PUT('x的值为:'||x);DBMS_OUTPUT.NEW_LINE; --显示END;/ SET SERVEROUTPUT ON SIZE 10000可以使任何一个PL/SQL的程序改变输出的数据量,使用时注意:1、最主要的空间总是和输出的行为行信息没有关系2、只有全部的数据行被取出的时候,才能显示3、PL/SQL程序执行结束之前,sqlplus不会从缓冲区中取出任何显示数据 注释行注释 --块注释 /*  */ 变量赋初值DECLAREx varchar2(10):='ABCDE';BEGINDBMS_OUTPUT.PUT_LINE('x的值为:'||x);END;/ DECLAREx varchar2(10):='ABCDE';y INTEGER:=123;BEGINDBMS_OUTPUT.PUT_LINE('x的值为:'||x||'y的值为:'||y);END;/ DECLAREx varchar2(10):='ABCDE';y STRING(10):='123';BEGINDBMS_OUTPUT.PUT_LINE('x的值为:'||x||'y的值为:'||y);END;/ 分支语句1、IF分支IF ... THEN...ELSIF ... THEN...ELSE...END IF2、CASE分支CASEWHEN ... THEN ...ELSEEND CASE DECLAREa number;b varchar2(10);BEGINa:=2; --改为53试试IF a=1 THENb:='A';ELSIF a=2 THENb:='B';ELSEb:='C';END IF;DBMS_OUTPUT.PUT_LINE('b的值是:'||b);END;/ save c:\plsql_02.txt DECLAREa number;b varchar2(10);BEGINa:=2;CASEWHEN a=1 THEN b:='A';WHEN a=2 THEN b:='B';WHEN a=3 THEN b:='C';ELSE b:='Others';END CASE;DBMS_OUTPUT.PUT_LINE('b的值是:'||b);END;/... 全文

Oracle PL/SQL PL/SQL块结构 PL/SQL分支语句 PL/SQL循环语句 PL/SQL异常处理 PL/SQL记录

10.PL_SQL——PL_SQL中的复合数据类型之RECORDS

一、记录和集合概述         目前为止所介绍的变量的数据类型都属于scalar,即标量,如整形,字符串,日期等等。任何一种编程语言都需要提供一些手段让用户创建更复杂的变量,PL/SQL也不例外,本章就来介绍一下PL/SQL中的复合型变量。 PL/SQL的复合型变量主要包括两类:               1. Records:记录              2. Collection:集合。Collection又可以分为三种,... 全文

Oracle PL/SQL RECORDS

9.PL_SQL——PL_SQL中的循环控制语句

循环是指在程序中重复执行一条或多条语句、PL/SQL中的循环主要有三种:                              1.Basic Loop                              2. FORLoop                              3.WHILE Loop 下面来逐一介绍这三种循环的用法。 一、BasicLoops        基本循环的格式如下:                           LOOP... 全文

Oracle PL/SQL 循环 LOOP

8.PL_SQL——PL_SQL中的条件控制语句

    和大多数程序语言一样,PL/SQL也有控制语句执行的结构,主要包括:             1、顺序结构:程序从上往下执行逐条语句,就是顺序结构;             2、分支条件判断:分支条件判断主要是指的IF语句和CASE语句。             3、循环语句:循环结构主要指的是REPEAT、LOOP和DO WHILE语句。    本章节主要讲解条件判断语句的用法。 一、 IF 语句的用法                IF 语句的基本格式为:             ... 全文

条件判断 Oracle PL/SQL CASE IF

7.PL_SQL——在PL_SQL程序中内嵌查询语句、DML语句、事物处理语句和游标属性

    在PL/SQL中可以使用的SQL语句主要有以下几类:       SELECT 查询语句,DML语句,Transaction 事物处理语句以及游标的属性,本文将对这几类语句在PL/SQL中的用法逐一介绍。一、查询语句—SELECT      SELECT 语句用来查询一条或多条语句。虽然SELECT 语句也属于DML语句,但SELECT是只读的,所以单独列出。在PL/SQL中使用SELECT 语句的格式如下 SELECT select_list... 全文

Oracle 内嵌 PL/SQL

PL/SQL实例笔记

create or replace procedure add_ord(v_ordid number,v_orddate date,v_custid number,v_shipdate date,v_total number)ise_integrity exception;e_shipdate  exception;pragma exception_init(e_integrity,-2291);beginif v_shipdate>v_orddate then insert into ord values(v_ordid ,v_orddate ,v_custid ,v_shipdate date,v_total);elseraise e_shipdate;end if;exceion when dup_val_on_index thenraise_application_error(-20001,'该订单已存在');when e_integrity then raise_application_error(-20002,'该客户不存在');when e_shipdate then raise_application_error(-20003,'交付日期不能早于预订日期');end;/-------------------------------set serveroutput on begin     dbms_output.put_line('Hello world');end ;/--当使用dbms_output时,需将sql*plus的环境变量serveroutput设置为on-------------------------------declare   type c1 is ref cursor;  emp_cursor c1;  v_ename emp.ename%type;  v_sal emp.sal%type;begin   open emp_cursor for    select ename,sal from emp where deptno=10;  loop     fetch emp_cursor into v_ename,v_sal;    exit when emp_cursor%notfound;    dbms_output.put_line(v_ename);  end loop;  close emp_cursor;end ;/------------------------------变量v_*常量c_*游标*_cursor例外e_*表类型*_table_type表变量*_table记录类型*_record_type记录变量*_record-----------------------------sql关键字、pl/sql关键字、数据类型  -》大写标识符、参数、数据库对象和列       -》小写------------------------------只读事务:会话Aset transaction read only ; <1>select sal from emp where ename='SMITH';  --结果:2000  <3>会话Bupdate emp set sal=3000 where ename='SMITH'; commit ; <2>------------------------------declare   type emp_record_type is record(    ename emp.ename%type ,    sal   emp.sal%type  );  emp_record emp_record_type;begin   select ename ,sal into emp_record  from emp where empno=&no;  dbms_output.put_line('name:'||emp_record.ename);  dbms_output.put_line('sal: '||emp_record.sal);end;/---------------------------------在PL/SQL块中直接使用select into语句是,该语句必须要返回一条数据,并且只能返回一条数据,否则会触发PL/Sql例外或错误信息。NO_DATA_FOUND例外,TOO_MANY_ROWS例外,Where子句变量名不能与列名相同--------------------------------declare   v_sal number(6,2);begin   select sal into v_sal from emp   where lower(ename)=lower('&&name');  if v_sal<2000 then     dbms_output.put_line('<2000');  end if;end;/--------------------------------create table temp(cola int);declare   i int:=1;begin   loop    insert into temp values(i);    exit when i=10;    i:=i+1;  end loop;end;/------------------------------declare   i int :=1;begin   while i<=10 loop    insert into temp values(i);    i:=i+1;  end loop;end ;/-------------------------------for counter in [reverse]lower_bound .. upper_bound loop  statement1;  statement2;  ...end loop;eg:begin   for i in reverse 1..10 loop     insert into temp values(i);  end loop;end;/------------------------------set serveroutput ondeclare   result int;begin  <<outer>>  for i in 1..100 loop  <<inner>>    for j in 1..100 loop      result := i*j;      exit outer when result>=1000;      exit when result=500;    end loop inner;    dbms_output.put_line(result);  end loop outer;  dbms_output.put_line(result);end;/-------------------------------type type_name is record(  field_declaretion[,  field_declaration]...);identifier type_name;eg:type emp_record_type is record(  name   emp.ename%type,  salary emp.sal%type,  dno    emp.deptno%type);emp_record emp_record_type ;...-----------------------------set serveroutput on declare  type emp_record_type is record(    name   emp.ename%type,    salary emp.sal%type,    dno    emp.deptno%type  );  emp_record emp_record_type;begin   select ename,sal,deptno into emp_record  from emp where empno=&no;  dbms_output.put_line(emp_record.name);end;/set serveroutput on declare  type emp_record_type is record(    name   emp.ename%type,    salary emp.sal%type,    dno    emp.deptno%type  );  emp_record emp_record_type;begin   select ename,sal,deptno into emp_record.name,emp_record.salary,emp_record.dno  from emp where empno=&no;  dbms_output.put_line(emp_record.name);end;/--------------------------------declare   dept_record dept%rowtype;begin  dept_record.deptno:=50;  dept_record.dname:='ZMC';  dept_record.loc:='YIYANG';  insert into dept values dept_record;end;/declare   dept_record dept%rowtype;begin  dept_record.deptno:=60;  dept_record.dname:='ZMC2';  insert into dept(deptno,dname) values (dept_record.deptno,dept_record.dname);end;/---------------------------------set serveroutput on declare   cursor emp_cursor is    select ename,sal from emp where deptno=10;  v_ename emp.ename%type;  v_sal   emp.sal%type;begin  open emp_cursor ;  loop      fetch emp_cursor into v_ename,v_sal;     exit when emp_cursor%notfound;     dbms_output.put_line(v_ename||': '||v_sal);  end loop;  close emp_cursor;end;/  set serveroutput on declare   cursor emp_cursor is    select ename from emp where deptno=10;  type ename_table_type is table of varchar2(10);  ename_table ename_table_type;begin  open emp_cursor ;  fetch emp_cursor bulk collect  into ename_table;  for i in 1..ename_table.count loop     dbms_output.put_line(ename_table(i));  end loop;  close emp_cursor;end;/  set serveroutput on declare   type name_array_type is varray(5) of varchar2(10);  cursor emp_cursor is select ename from emp ;  name_array name_array_type;  rows int:=5;  v_count int:=0;begin  open emp_cursor ;  loop  fetch emp_cursor bulk collect  into name_array limit rows;    dbms_output.put('雇员名:');    for i in 1..emp_cursor%rowcount-v_count  loop       dbms_output.put(name_array(i)||'  ');    end loop;    dbms_output.new_line;    v_count:=emp_cursor%rowcount;    exit when emp_cursor%notfound;  end loop;  close emp_cursor;end;/  set serveroutput on declare   type emp_cursor_type is ref cursor;  emp_cursor emp_cursor_type;  emp_record emp%rowtype;begin   open emp_cursor for select * from emp where deptno=10;  loop     fetch emp_cursor into emp_record;    exit when emp_cursor%notfound;    dbms_output.put_line('第'||emp_cursor%rowcount    ||'个雇员:'||emp_record.ename);  end loop;  close emp_cursor;end;/set serveroutput on declare   type emp_record_type is record(     name varchar2(10),     salary number(6,2)  );  type emp_cursor_type is ref cursor    return emp_record_type;  emp_cursor emp_cursor_type;  emp_record emp_record_type;begin   open emp_cursor for select ename,sal from emp where deptno=20;  loop     fetch emp_cursor into emp_record;    exit when emp_cursor%notfound;    dbms_output.put_line('第'||emp_cursor%rowcount    ||'个雇员:'||emp_record.name);  end loop;  close emp_cursor;end;/-------------------------------------declare   e_integrity exception;  pragma exception_init(e_integrity ,-2291);begin  update emp set deptno=&dno where empno=&eno;exception  when e_integrity then    dbms_output.put_line('该部门不存在');end ;/----------------------------------create or replace procedure out_timeisbegin   dbms_output.put_line(systimestamp);end;/1.  SQL> setserveroutput on    SQL> exec out_time2.  SQL> setserveroutput on    SQL> call out_time--------------------------------create or replace procedure add_employee(  eno  number,  name varchar2,  sal  number,  job  varchar2 default 'CLERK',  dno  number)is   e_integrity exception;  pragma exception_init(e_integrity ,-2291);begin   insert into emp(empno,ename,sal,job,deptno)  values(eno,name,sal,job,dno);exception   when dup_val_on_index then    raise_application_error(-20000,'雇员号不能重复');  when e_integrity then    raise_application_error(-20001,'部门号不存在');end;/exec add_employee(1111,'MARY',2000,'MANAGER',10);-----------------------------------------create or replace procedure query_employee(  eno    number,  name   out varchar2,  salary out number)is begin   select ename,sal into name,salary from emp   where empno=eno;exception  when no_data_found then     raise_application_error(-20000,'该雇员不存在');end;/SQL> var name varchar2(10)SQL> var salary numberSQL> exec query_employee(7788,:name,:salary);PL/SQl 过程已成功完成SQL> print name salaryname------------scott   salary------------     3000--------------------------------参数传值:位置传递、名称传递、组合传递查看子程序源码(数据字典:USER_SOURCE):select text from user_source where name='query_employee';--------------------------------drop procedure query_employee;---------------------------------create or replace function get_userreturn varchar2is   v_user varchar2(100);begin   select username into v_user from user_s;  reuturn v_user;end;/1.  使用变量接收函数返回值    SQL> var v1 varchar2(100);    SQL> exec :v1:=get_user    SQL> print v12.  在Sql语句中直接调用函数    SQL> select getuser from dual;3.  使用包DBMS_OUTPUT调用函数    SQL> set serveroutput on    SQL> exec dbms_output.put_line('当前用户:'get_user);-------------------------create or repalce function get_sal(name in varchar2)return numberas  v_sal emp.sal%type;begin   select sal into v_sal from emp   where upper(ename)=upper(name);  return v_sal;exception  when no_data_found then     raise_appliction_error(-20000,'该雇员不存在');end;/SQL> var sal numberSqL> exec :sal:=get_sal('scott');SQL> print sal------------------------------函数可在以下SQL语句部分调用:SELECT命令的选择列表;WHERE和HAVING子句中;CONNECT BY ,START WITH,ORDER BY以及GROUP BY子句中;INSERT命令的VALUES子句中;UPDATE命令的SET子句中。注:函数在SQL中调用的限制:SQL调用的函数只能调存储函数(服务器端),而不能调客户端的函数;SQL调用的函数只能带输入参数(IN),而不能带输出参数(OUT)和输入输出参数(IN OUT);SQL调用的函数只能使用SQL支持的标准数据类型,而不能是PL/Sql特有的数据类型(如BOOLEAN,TABLE和RECORD等);SQL调用的函数不能包含Insert,update和delete语句。-----------------------------------查看函数源码(数据字典:USER_SOURCE):select text from user_source where name='query_employee';drop function result;----------------------------------col object_name format a20select object_name,created,status from user_objectswhere object_type in('PROCEDURE','FUNCTION');----------------------------------触发器只能包含SELECT\INSERT\UPDATE和DELETE语句,而不能包含DDL语句(CREATE,ALERT,DROP)和事务控制语句(COMMIT,ROLLBACK和SAVEPOINT)CTEATE [OR REPLACE] TRIGGER trigger_nametiming event1[OR event2 OR event3]ON table_namePL/SQL block;timing触发时机:before/afterevent触发事件:insert/update/deletecreate or replace trigger tr_sec_empbefore insert or update or delete on empbegin  if to_char(sysdate,'DY','nls_date_language=AMERICAN')    in('SAT','SUN') then     raise_application_error(-20001,'不能在休息日改变雇员信息');  end if;end;/     本文出自 “寻禾” 博客,请务必保留此出处http://xunhe.blog.51cto.com/4714945/974432... 全文

oracle pl/sql

Oracle PL/SQL编程规范指南

一、PL/SQL编程规范之大小写就像在SQL中一样,PL / SQL中是不区分大小写的。其一般准则如下:... 全文

PL SQL编程规范

PL/SQL记住登陆密码

1、PL/SQL Developer记住登陆密码 在使用PL/SQL Developer时,为了工作方便希望PL/SQL Developer记住登录Oracle的用户名和密码; 设置方法:PL/SQL Developer 7.1.2 ->tools->Preferences->Oracle->Logon History , “Store history”是默认勾选的,勾上“Store with password” 即可,重新登录在输入一次密码则记住了。本文出自 “我的JAVA世界” 博客,请务必保留此出处http://hanchaohan.blog.51cto.com/2996417/1294740... 全文

PL/SQL记住登陆密码

PL/SQL Developer导入导出数据库方法及说明

PL/SQL DeveloperOracle数据库中用于导入或导出数据库的主要工具,本文主要介绍了利用PL/SQL Developer导入和导出数据库的过程,并对导入或导出时的一些注意事项进行了说明,接下来我们就一一介绍。导出步骤:1 tools ->export user object 选择选项,导出.sql文件。2 tools ->export tables-> Oracle Export 选择选项导出.dmp文件。导入步骤:... 全文

pl/sql

PL/SQL编程的简单学习

PL/SQL简单学习1.PL/SQL块的组成部分:① 声明部分:该部分包含了变量和常量的定义,以及变量和常量的初始值定义,这部分由关键字declare开始,如果PL/SQL块中不需要声明变量或常量,该部分可以省略。② 执行部分:执行部分是PL/SQL的执行指定部分,由关键字begin开始,关键字end结尾。   所有可执行的SQL都放在这一部分,该部分不能省略,end关键字后面使用分号结尾。③ 异常处理部分:该部分是可选的,该部分使用exception关键字将可执行部分分为两个部分,   一部分是正常运行的程序,一旦出现异常就跳转到异常部分执行。2.PL/SQL中符号的声明:① := → 赋值运算符;   --  → 单行注释;... 全文

SQL PL 编程的简单学习

Oracle PL/SQL过程调试的输出方法

1.最基本的DBMS_OUTPUT.PUT_LINE()方法。随便在什么地方,只要是BEGIN和END之间,就可以使用DBMS_OUTPUT.PUT_LINE(output);然而这会有一个问题,就是使用该函数一次最多只可以显示255个字符,否则缓冲区会溢出。此外,函数DBMS_OUTPUT.ENABLE(20000)这种函数,仅仅是设置整个过程的全部输出缓冲区大小,而非DBMS_OUTPUT.PUT_LINE()的缓冲区大小。... 全文

PL SQL Oracle 过程调试

oracle client及pl/sql远程连接配置

-----------------------------------一、前言二、环境三、oracle client安装四、oracle client配置五、pl/sql连接-----------------------------------一、前言... 全文

oracle client pl/sql

13.PL_SQL——异常处理

==================== Example 1==================== SQL> create table emp_tmp as select * from employees; Table created. SQL> select last_name from emp_tmp wherefirst_name='John'; LAST_NAME-------------------------ChenSeoRussell SQL> edit DECLARE    v_lnameVARCHAR2(15);BEGIN    SELECT last_nameINTO v_lname    FROM emp_tmp... 全文

Oracle PL/SQL Exception Handling

PL/SQL开发中动态SQL的使用与过程分页

所谓静态SQL指在PL/SQL块中使用的SQL语句在编译时是明确的,执行的是确定对象。而动态SQL是指在PL/SQL块编译时SQL语句是不确定的,如根据用户输入的参数的不同而执行不同的操作。编译程序对动态语句部分不进行处理,只是在程序运行时动态地创建语句、对语句进行语法分析并执行该语句。Oracle中动态SQL可以通过本地动态SQL来执行,也可以通过DBMS_SQL包来执行。一、本地动态SQL... 全文

PL SQL 动态SQL

在Oracle中使用PL/SQL操作COM对象(1)

PL/SQL是由Oracle公司对标准SQL进行扩展,专用于Oracle数据库中程序设计的专用语言,属第三代过程式程序设计语言。从Oracle8开始提供了直接从PL/SQL中调用外部C语言过程,允许开发人员用PL/SQL进行使用C语言编制的程序模块。从Oracle8i开始,又引入了Java程序。在本文中主要介绍外部例程的基本原理以及使用条件,介绍如何通过引用外部例程来操作Windows中的COM对象,并做了一个操作Excel对象的示例。... 全文

Oracle PL SQL

使用PL/SQL Developer连接oracle数据库

第一步,工具准备需要PL/SQL Developer工具和oracle客户端第二步,配置plsql将下载的oracle客户端zip文件解压到E:\Program Files\instantclient\,接着打开PLSQL工具,弹出登陆界面后点击cancel进入PL/SQL主界面,然后依次操作Tools–>preferences–>Connection,找到Oracle  Home和OCI library并填入名称,然后点击OK,退出PLSQL。第三步,修改oracle配置文件在解压下来的oracle客户端软件下新建tnsnames.ora文件(路径为:"E:\Program Files\instantclient\network\admin\tnsnames.ora"),加入以下内容(我要连接的IP为192.168.0.90,数据库实例为orcl)ORCL=(DESCRIPTION =(ADDRESS_LIST =(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.0.90)(PORT = 1521)))(CONNECT_DATA =(SERVICE_NAME = orcl)))第四步,设置环境变量   1) 变量名:ORACLE_HOME      变量值:E:\Program Files\instantclient   2) 变量名:TNS_ADMIN      变量值:E:\Program Files\instantclient\network\admin   3) 变量名:NLS_LANG      变量值:SIMPLIFIED CHINESE_CHINA.ZHS16GBK   4) 修改Path变量,在后面添加 E:\Program Files\instantclient... 全文

oracle PL/SQL Instant_Client

从头安装及配置PL/SQL Developer

    因为自己安装及配置中走了不少弯路,搜索网上的文档大部分没有包含oralce client的安装及相应的配置,所以单独写一次吧。    本例适用于不需要安装Oralce client,以instantclient basic包来代替。    --需要的软件包:    -PL/SQL Developer    下载地址可以自己去google。    -instantclient-basic-nt-11.2.0.3.0    --下载地址(需要使用oracle账号登录,自己注册的即可):... 全文

PL/SQL oracle Developer 连接工具

1 2 3