declare v_statement varchar2(500); begin v_statement:='create table zjx_temp( id number)'; execute immediate v_statement; end;
二、PL/SQL 块结构和组成元素
PL/SQL 程序由三个块组成,即声明部分、执行部分、异常处理部分
set serveroutput on 先要执行这个id
1 、PL/SQL 块的结构如下:
DECLARE
/* 声明部分: 在此声明 PL/SQL 用到的变量,类型及游标,以及局部的存储过程和函数 */
BEGIN
/* 执行部分: 过程及 SQL 语句 , 即程序的主要部分 */
EXCEPTION
/* 执行异常部分: 错误处理 */
END;
2、PL/SQL 块可以分为三类:
1. 无名块:动态构造,只能执行一次。
2. 子程序:存储在数据库中的存储过程、函数及包等。当在数据库上建立好后可以在其它程序中调用它
们。
3. 触发器:当数据库发生操作时,会触发一些事件,从而自动执行相应的程序。
declare
v_sal varchar2(20);
begin
select 20 into v_sal from dual ;
dbms_output.put_line(v_sal);
end;
declare
v_orgcode varchar2(20);
v_name varchar2(255);
begin
select c.user_name,c.inside_org_code into v_name,v_orgcode from cafs_user c where c.id=125;
dbms_output.put_line(v_name);
dbms_output.put_line(v_orgcode);
dbms_output.put_line(v_name||','||v_orgcode);
end;
declare
v_emp_record cafs_user%rowtype;
v_ann_name cafs_announcement.ann_name%type;
begin
select * into v_emp_record from cafs_user where id =125;
dbms_output.put_line(v_emp_record.user_name);
update cafs_announcement a set a.ann_name = 'aaa' where a.id = 77;
select a.ann_name into v_ann_name from cafs_announcement a where a.id = 77;
dbms_output.put_line(v_ann_name);
end;
3、标识符
建议的命名方法:
4、记录类型
记录类型是把逻辑相关的数据作为一个单元存储起来,称作 PL/SQL RECORD 的域(FIELD),其作用是存 放互不相同但逻辑相关的信息。
定义记录类型语法如下:
TYPE record_type IS RECORD(
Field1 type1 [NOT NULL] [:= exp1 ],
Field2 type2 [NOT NULL] [:= exp2 ],
. . . . . .
Fieldn typen [NOT NULL] [:= expn ] ) ;
两种方式:一种是%rowtype,一种是定义type record_record is record(...)
declare
v_emp_record cafs_user%rowtype;
begin
select * into v_emp_record from cafs_user where id =125;
dbms_output.put_line(v_emp_record.user_name);
end;
declare
--定义一个记录类型
type user_record is record(
v_orgcode varchar2(20),
v_name cafs_user.user_name%type
);
--定义一个记录类型的成员变量
v_user_record user_record;
begin
select c.inside_org_code,c.user_name into v_user_record from cafs_user c where c.id=125;
dbms_output.put_line(v_user_record.v_name);
dbms_output.put_line(v_user_record.v_orgcode);
dbms_output.put_line(v_user_record.v_name||','||v_user_record.v_orgcode);
end;
declare
type user_record is record(
v_orgcode cafs_user.inside_org_code%type ,
v_name cafs_user.user_name%type
);
v_user_record user_record;
v_temp varchar2(22) :='abc';
begin
select c.inside_org_code,c.user_name into v_user_record from cafs_user c where c.id=125;
dbms_output.put_line(v_user_record.v_name);
dbms_output.put_line(v_user_record.v_orgcode);
dbms_output.put_line(v_user_record.v_name||','||v_user_record.v_orgcode);
dbms_output.put_line(v_temp);
end;
declare
type user_record is record(
v_orgcode cafs_user.inside_org_code%type ,
v_name cafs_user.user_name%type
);
v_user_record user_record;
v_temp varchar2(22) :='abc';
begin
v_temp :='刘德华';
select c.inside_org_code,c.user_name into v_user_record from cafs_user c where c.id=125;
dbms_output.put_line(v_user_record.v_name);
dbms_output.put_line(v_user_record.v_orgcode);
dbms_output.put_line(v_user_record.v_name||','||v_user_record.v_orgcode);
dbms_output.put_line(v_temp);
end;
2) 在使用上述过程之前必须将 SQL * PLUS 的环境参数 SERVEROUTPUT 设置为 ON, 否则将看不
到输出结果: set serveroutput on
5、使用%TYPE
定义一个变量,其数据类型与已经定义的某个数据变量的类型相同,或者与数据库表的某个列的数据类型
相同,这时可以使用%TYPE。
declare
v_orgcode varchar2(20);
v_name cafs_user.user_name%type;
begin
select c.user_name,c.inside_org_code into v_name,v_orgcode from cafs_user c where c.id=125;
dbms_output.put_line(v_name);
dbms_output.put_line(v_orgcode);
dbms_output.put_line(v_name||','||v_orgcode);
end;
declare
v_emp_record cafs_user%rowtype;
begin
select * into v_emp_record from cafs_user where id =125;
dbms_output.put_line(v_emp_record.user_name);
end;
数据库赋值是通过 SELECT into 语句来完成的,每次执行 SELECT语句就赋值一次,一般要求被赋值的变量与 SELECT中的列名要一一对应。
不能将SELECT语句中的列赋值给布尔变量。
三、PL/SQL 流程控制语句
1 条件判断
方式一:if ... then ... elseif ...then ... else ... end if; 方式二:case ... when ...then ..when ... then .... end; 注意:case when 语法有多种,如果then 后面是执行语句要加分号结果,并且最后用end case结束 如果是结果那么不用分号,并且结果是end结束。
if<布尔表达式> then ... end if;
if<布尔表达式> then ... else ... end if;
if<> then ... elsif <> then .... else ... end if;
如果是结果那么不用分号,并且结果是end结束。 1 case 变量|字段 when 比对值 then 执行语句; when 比对值 then 执行语句; else 执行语句; end case; 2 case 变量|字段 when 比对值 then 结果 when 比对值 then 结果 else 结果 end ; 3 case when 表达式 then 执行语句; when 表达式 then 执行语句; else 执行语句; end case; 4 case when 表达式 then 结果 when 表达式 then 结果 else 结果 end ;
declare
v_emp_record cafs_user%rowtype;
v_ann_name cafs_announcement.ann_name%type;
begin
select * into v_emp_record from cafs_user where id =125;
dbms_output.put_line(v_emp_record.user_name);
select a.ann_name into v_ann_name from cafs_announcement a where a.id = 77;
if v_ann_name = 'aaa' then
dbms_output.put_line('aaa');
else
dbms_output.put_line('bbb');
end if;
end;
declare
v_emp_record cafs_user%rowtype;
v_ann_name cafs_announcement.ann_name%type;
begin
select * into v_emp_record from cafs_user where id =125;
dbms_output.put_line(v_emp_record.user_name);
select a.ann_name into v_ann_name from cafs_announcement a where a.id = 77;
if v_ann_name = 'aaa' then dbms_output.put_line('aaa');
elsif v_ann_name ='bbb' then dbms_output.put_line('bbb');
else dbms_output.put_line('ccc');
end if;
end;
declare
v_emp_record cafs_user%rowtype;
v_ann_name cafs_announcement.ann_name%type;
v_ann_number number(4,2);
v_dname varchar2(20) ;
v_deptno number(4,2) :=10;
begin
select * into v_emp_record from cafs_user where id =125;
dbms_output.put_line(v_emp_record.user_name);
select a.ann_name into v_ann_name from cafs_announcement a where a.id = 77;
if v_ann_name = 'aaa' then dbms_output.put_line('aaa');
elsif v_ann_name ='bbb' then dbms_output.put_line('bbb');
else dbms_output.put_line('ccc');
end if;
case v_ann_name
when 'aaa' then dbms_output.put_line('aaa');
when 'bbb' then dbms_output.put_line('bbb');
else dbms_output.put_line('ccc');
end case;
case when v_ann_name = 'aaa' then dbms_output.put_line('aaa');
when v_ann_name = 'bbb' then dbms_output.put_line('bbb');
else dbms_output.put_line('ccc');
end case;
v_ann_number := case v_ann_name when 'aaa' then 0
when 'bbb' then 1
else 2
end;
dbms_output.put_line('v_ann_number='||v_ann_number);
v_dname := case when v_deptno = 10 then '总经办'
when v_deptno = 20 then '综管部'
when v_deptno=30 then '市场部'
else '其他'
end;
dbms_output.put_line(v_dname);
end;
2 循环语句三种方式
方式一:loop... exit when ... end loop; 方式二:while...loop .. end loop; 方式三:for i in ... loop ... end loop;
*****loop exit when end loop事例** v_nu:= v_nu+1; 可以写在exit when前面也可以在下面****
declare
v_nu number(30,2) :=1;
begin
loop
dbms_output.put_line(v_nu);
exit when v_nu >=100;
v_nu:= v_nu+1;
end loop;
end;
declare
v_nu number(30,2) :=1;
begin
loop
dbms_output.put_line(v_nu);
v_nu:= v_nu+1;
exit when v_nu >100;
end loop;
end;
******while loop end loop 循环******
declare
v_nu number(30,2) :=1;
begin
while v_nu <=100 loop
dbms_output.put_line(v_nu);
v_nu := v_nu+1;
end loop;
end;
**********for循环 **循环变量自动累加**reverse反转***
begin
for v_nu in 1..100 loop
dbms_output.put_line(v_nu);
end loop;
end;
begin
for v_nu in reverse 1..100 loop
dbms_output.put_line(v_nu);
end loop;
end;
CURSOR cursor_name[(parameter[, parameter]…)] IS select_statement;
open cursor_name[(parameter,parameter...)]
fetch cursor_name into (varable_list|record_varable)
close cursor
示例:
declare
----查询ann_type为1 的消息名称
cursor ann_cursor is select ann_name from cafs_announcement where ann_type='1';
v_ann_name cafs_announcement.ann_name%type;
begin
open ann_cursor;
fetch ann_cursor into v_ann_name;
--遍历获取数据
loop
dbms_output.put_line(v_ann_name);
exit when ann_cursor%notfound;
fetch ann_cursor into v_ann_name;
end loop;
/*while ann_cursor%found loop
dbms_output.put_line(v_ann_name);
fetch ann_cursor into v_ann_name;
end loop;
*/
close ann_cursor;
end;
*******游标的使用:用for循环的话自动open和close以及提取数据************
declare
----查询ann_type为1 的消息名称
cursor ann_cursor is select ann_name from cafs_announcement where ann_type='1';
begin
for c in ann_cursor loop
dbms_output.put_line(c.ann_name);
end loop;
end;
2 带参数的游标
2.1 不使用for循环使用游标
CURSOR cursor_name(parameter_name datatype) IS select_statement; --只能制定类型,不能指定具体大小 OPEN cursor_name(参数值);-- open emp_cursor(v_sal=>1000,delete_flag =>'0');传值可以按照=>这样传值 FECTH cursor_name INTO variable,...; CLOSE cursor_name;
declare
-- 更新人的名称
-- 0-5000 5%
-- 5000-10000 3%
-- 10000 -15000 2%
-- 15000 - 20000 1%
v_id employee.id%type;
v_emp_name employee.last_name%type;
v_sal employee.last_name%type;
v_temp number(14,2) :=0;
cursor emp_cursor(delete_flag char,v_sal number) is select id,last_name,sal from employee
where delete_flag=delete_flag and sal > v_sal;
begin
dbms_output.put_line(v_temp);
open emp_cursor(v_sal=>1000,delete_flag =>'0');
fetch emp_cursor into v_id,v_emp_name,v_sal;
while emp_cursor%found loop
if v_sal <5000 then v_temp:= 0.05;
elsif v_sal<10000 then v_temp:= 0.03;
elsif v_sal<15000 then v_temp:= 0.02;
else v_temp:= 0.01;
end if;
dbms_output.put_line(v_temp);
update employee set sal = sal*(1+v_temp) where id =v_id;
fetch emp_cursor into v_id,v_emp_name,v_sal;
end loop;
close emp_cursor;
end;
2.2 带参数的游标for循环传递参数方式,定义游标使用用default指定默认值
游标的 FOR 循环:
PL/SQL 语言提供了游标 FOR 循环语句,自动执行游标的 OPEN、FETCH、CLOSE 语句和循环语句的功能; 当进入循环时,游标 FOR 循环语句自动打开游标,并提取第一行游标数据,当程序处理完当前所提取的数 据而进入下一次循环时,游标 FOR 循环语句自动提取下一行数据供程序处理,当提取完结果集合中的所有 数据行后结束循环,并自动关闭游标。
格式:
FOR index_variable IN cursor_name[value[, value]…] LOOP
-- 游标数据处理代码
END LOOP;
index_variable 为游标 FOR 循环语句隐含声明的索引变量,该变量为记录变量,其结构与游标查询语句
declare
v_name cafs_announcement.ann_name%type;
begin
select ann_name into v_name from cafs_announcement where ann_type ='1';
exception
when too_many_rows then dbms_output.put_line('太多行');
when others then dbms_output.put_line('其他异常');
end;
3 非预定义 使用语句关联:pragma exception_init(异常情况,错误代码)
示例:
declare
v_name cafs_announcement.ann_name%type;
e_deletedid_exception exception;
pragma exception_init(e_deletedid_exception,-2292);
begin
delete from employee where employee_id = 100;
exception
when e_deletedid_exception then dbms_output.put_line('违反唯一约束');
when others then dbms_output.put_line('其他异常');
end;
4 用户自定义 raise抛出异常
declare
e_too_high_sal exception;
v_sal employee.sal%type;
begin
select sal into v_sal from employee where id =100;
if sal>10000 then
raise e_too_high_sal;
end if;
exception
when e_too_high_sal then dbms_output.put_line('工资太高了');
when others then dbms_output.put_line('其他异常');
end;
5 在 PL/SQL 中使用 SQLCODE, SQLERRM
SQLCODE 返回错误代码数字
SQLERRM 返回错误信息.
示例:
create or replace noneditionable function get_salary(emp_count out number,v_delete varchar2)
return number
is
v_sum employee.sal%type;
begin
select sum(sal),count(sal) into v_sum,emp_count from employee where delete_flag = v_delete;
return v_sum;
exception
when no_data_found then
dbms_output.put_line('您要的数据不存在');
when others then
dbms_output.put_line(sqlcode||':'||sqlerrm);
end;
六、存储函数和过程
IN, OUT 或 IN OUT 标记. 参数之间用逗号隔开.
IN :参数 标记表示传递给函数的值在该函数执行中不改变;
OUT :标记表示一个值在函数中进行计算并通过该参 数传递给调用语句;
IN OUT :标记表示传递给函数的值可以变化并传递给调用语句. 若省略标记, 则参数 隐含为 IN。
1 存储函数
语法如下: CREATE [OR REPLACE] FUNCTION function_name [ (argment [ { IN | IN OUT }] Type, argment [ { IN | OUT | IN OUT } ] Type ] [ AUTHID DEFINER | CURRENT_USER ] RETURN return_type { IS | AS } <类型.变量的说明> BEGIN FUNCTION_body EXCEPTION 其它语句 END;
示例
create or replace function get_salary(emp_count out number,v_delete varchar2)
return number
is
v_sum employee.sal%type;
begin
select sum(sal),count(sal) into v_sum,emp_count from employee where delete_flag = v_delete;
return v_sum;
exception
when no_data_found then
dbms_output.put_line('您要的数据不存在');
when others then
dbms_output.put_line(sqlcode||':'||sqlerrm);
end;
create or replace function hello_world
return varchar2
is
begin
return 'hello world';
end;
******带参数的存储函数********
create or replace function hello_world(v_logs varchar2)
return varchar2
is
begin
return 'hello world'||v_logs;
end;
*****带参数的存储函数************************
create or replace function hello_world(v_i number,v_j number)
return number
is
v_sum number:=0;
begin
v_sum := v_i+v_j;
return v_sum;
end;
***************
---查询保单号下的所有申请总和
create or replace function hello_world(v_policy varchar2)
return number
is
v_sum number :=0;
v_base_limit number :=0;
cursor limit_cursor is select base_limit from cafs_buyer_limit where policy_no = v_policy;
begin
open limit_cursor;
fetch limit_cursor into v_base_limit;
loop
v_sum := v_sum + v_base_limit;
exit when limit_cursor%notfound;
fetch limit_cursor into v_base_limit;
end loop;
close limit_cursor;
return v_sum;
end;
---查询保单号下的所有申请总和
create or replace function hello_world(v_policy varchar2)
return number
is
v_sum number(10) ;
v_base_limit number(10) ;
v_count number;
cursor limit_cursor is select base_limit from cafs_buyer_limit where policy_no = v_policy;
begin
select count(1) into v_count from cafs_buyer_limit where policy_no = v_policy;
dbms_output.put_line('数量:'||v_count);
v_sum:=0;
open limit_cursor;
fetch limit_cursor into v_base_limit;
while limit_cursor%found loop
if v_base_limit is null then
goto label;
end if;
v_sum := v_sum+v_base_limit;
<>
fetch limit_cursor into v_base_limit;
end loop;
/* loop
if v_base_limit is null then
goto label;
end if;
v_sum := v_sum+v_base_limit;
dbms_output.put_line('总额:'||v_sum);
fetch limit_cursor into v_base_limit;
exit when limit_cursor%notfound;
<>
dbms_output.put_line(v_sum);
end loop;*/
close limit_cursor;
dbms_output.put_line(v_sum);
return v_sum;
end;
1.1 执行存储函数方式两种
1 select test_fun from dual;
2 使用plsql块
declare
v_date date;
begin
v_date:=test_fun();
dbms_output.put_line(v_date);
end;
创建过程语法: CREATE [OR REPLACE] PROCEDURE Procedure_name [ (argment [ { IN | IN OUT }] Type, argment [ { IN | OUT | IN OUT } ] Type ] [ AUTHID DEFINER | CURRENT_USER ] { IS | AS } <类型.变量的说明> BEGIN <执行部分> EXCEPTION <可选的异常错误处理程序> END;
示例:
create or replace procedure sum_sal_procedure(v_delete employee.delete_flag%type,v_sumsal out employee.sal%type)
is
begin
select sum(sal) into v_sumsal from employee where delete_flag = v_delete;
exception
when no_data_found then
dbms_output.put_line('您要的数据不存在');
when others then
dbms_output.put_line(sqlcode||':'||sqlerrm);
end;
BEFORE 和 AFTER 指出触发器的触发时序分别为前触发和后触发方式,前触发是在执行触发事件之前触
发当前所创建的触发器,后触发是在执行触发事件之后触发当前所创建的触发器。
FOR EACH ROW 选项说明触发器为行触发器。行触发器和语句触发器的区别表现在:行触发器要求当一个 DML 语句操做影响数据库中的多行数据时,对于其中的每个数据行,只要它们符合触发约束条件,均激 活一次触发器;而语句触发器将整个语句操作作为触发事件,当它符合约束条件时,激活一次触发器。当 省略 FOR EACH ROW 选项时,BEFORE 和 AFTER 触发器为语句触发器,而 INSTEAD OF 触发器则为行触发 器。
WHEN 子句说明触发约束条件。Condition 为一个逻辑表达时,其中必须包含相关名称,而不能包含查 询语句,也不能调用 PL/SQL 函数。WHEN 子句指定的触发约束条件只能用在 BEFORE 和 AFTER 行触发器 中,不能用在 INSTEAD OF 行触发器和其它类型的触发器中。
CREATE [OR REPLACE] PACKAGE BODY package_name{IS | AS}
[私有数据类型定义[私有数据类型定义]…]
[私有变量、常量声明[私有变量、常量声明]…]
[私有子程序声明和定义[私有子程序声明和定义]…]
[公有游标定义[公有游标定义]…]
[公有子程序定义[公有子程序定义]…]
BEGIN
PL/SQL 语句
END [package_name];
其中:在包主体定义公有程序时,它们必须与包定义中所声明子程序的格式完全一致
3 示例
1 创建的包为 demo_pack, 该包中包含一个记录变量 DeptRec、两个函数和一个过程。
CREATE OR REPLACE PACKAGE demo_pack
IS
DeptRec dept%ROWTYPE;
FUNCTION add_dept(dept_no NUMBER, dept_name VARCHAR2, location VARCHAR2)
RETURN NUMBER;
FUNCTION remove_dept(dept_no NUMBER)
RETURN NUMBER;
PROCEDURE query_dept(dept_no IN NUMBER);
END demo_pack;
//包主体的创建方法,它实现上面所声明的包定义
CREATE OR REPLACE PACKAGE BODY demo_pack
IS
FUNCTION add_dept
(dept_no NUMBER, dept_name VARCHAR2, location VARCHAR2)
RETURN NUMBER
IS
empno_remaining EXCEPTION;
PRAGMA EXCEPTION_INIT(empno_remaining, -1);
/* -1 是违反唯一约束条件的错误代码 */
BEGIN
INSERT INTO dept VALUES(dept_no, dept_name, location);
IF SQL%FOUND THEN
RETURN 1;
END IF;
EXCEPTION
WHEN empno_remaining THEN
RETURN 0;
WHEN OTHERS THEN
RETURN -1;
END add_dept;
FUNCTION remove_dept(dept_no NUMBER)
RETURN NUMBER
IS
BEGIN
DELETE FROM dept WHERE deptno=dept_no;
IF SQL%FOUND THEN
RETURN 1;
ELSE
RETURN 0;
END IF;
EXCEPTION
WHEN OTHERS THEN
RETURN -1;
END remove_dept;
PROCEDURE query_dept(dept_no IN NUMBER)
IS
BEGIN
SELECT * INTO DeptRec FROM dept WHERE deptno=dept_no;
EXCEPTION
WHEN NO_DATA_FOUND THEN
DBMS_OUTPUT.PUT_LINE('数据库中没有编码为'||dept_no||'的部门');
WHEN TOO_MANY_ROWS THEN
DBMS_OUTPUT.PUT_LINE('程序运行错误!请使用游标');
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE(SQLCODE||’----‘||SQLERRM);
END query_dept;
BEGIN
Null;
END demo_pack;
九、merge into using on语句写法及作用
MERGE INTO 目标表 a
USING 源表 b
ON (a.字段1 = b.字段2 and a.字段n = b.字段n)
WHEN MATCHED THEN
UPDATE SET a.新字段 = b.字段 WHERE 限制条件
WHEN NOT MATCHED THEN
INSERT (a.字段名1,a.字段名n) VALUES(b.字段值1, b.字段值n)WHERE 限制条件123456789
在网上无意中看到淘宝提交的hotspot patch,共四个,有意思,记录一下。
7050685:jsdbproc64.sh has a typo in the package name
7058036:FieldsAllocationStyle=2 does not work in 32-bit VM
7060619:C1 should respect inline and
CREATE TABLE sessions (
id CHAR(32) NOT NULL,
data TEXT,
last_accessed TIMESTAMP NOT NULL,
PRIMARY KEY (id)
);
<?php
/**
* Created by PhpStorm.
* User: michaeldu
* Date
public Vector<CartProduct> delCart(Vector<CartProduct> cart, String id) {
for (int i = 0; i < cart.size(); i++) {
if (cart.get(i).getId().equals(id)) {
cart.remove(i);
问题是首页在火狐、谷歌、所有IE中正常显示,列表页的页面在火狐谷歌中正常,在IE6、7、8中都不中,觉得可能那个地方设置的让IE系列都不认识,仔细查看后发现,列表页中没写HTML模板部分没有添加DTD定义,就是<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3
com.jcraft.jsch.JSchException: Auth cancel
at com.jcraft.jsch.Session.connect(Session.java:460)
at com.jcraft.jsch.Session.connect(Session.java:154)
at cn.vivame.util.ftp.SftpServerAccess.connec
centos p安装
yum -y install tree
mac os安装
brew install tree
首先来看tree的用法
tree 中文解释:tree
功能说明:以树状图列出目录的内容。
语 法:tree [-aACdDfFgilnNpqstux][-I <范本样式>][-P <范本样式
一. 实体类简述
实体类其实就是俗称的POJO,这种类一般不实现特殊框架下的接口,在程序中仅作为数据容器用来持久化存储数据用的
POJO(Plain Old Java Objects)简单的Java对象
它的一般格式就是
public class A{
private String id;
public Str