Oracle编程

CREATE TABLE DEP(
    id int not null primary key,
    name varchar2(50) not null unique
);

CREATE SEQUENCE seq_test;

INSERT INTO DEP VALUES(seq_test.nextval, '开发部');


COMMIT;

SELECT * FROM DEP;

DECLARE
  v_name dep.name%type;
BEGIN
  SELECT name INTO v_name FROM DEP WHERE id=&id; --输入一个数作为条件
  dbms_output.put_line(v_name);
EXCEPTION    --异常
   WHEN NO_DATA_FOUND THEN
      dbms_output.put_line('没有数据');
   WHEN TOO_MANY_ROWS THEN
      dbms_output.put_line('太多的数据');
   WHEN others THEN
      dbms_output.put_line('有异常发生');
END;
--过程
CREATE OR REPLACE PROCEDURE findDepNameById(v_id int, v_name out varchar2)
AS
   v_temp_name varchar2(50);
BEGIN
   SELECT name INTO v_temp_name FROM DEP WHERE id=v_id;
   v_name := v_temp_name;
EXCEPTION
   WHEN others THEN
      dbms_output.put_line('有异常发生');
END;

DECLARE
   v_name varchar2(50);
BEGIN
   findDepNameById(1, v_name);   --调用存储过程
   dbms_output.put_line(v_name);  --打印
END;

--函数
CREATE OR REPLACE FUNCTION funFindNameById(v_id int)
   RETURN varchar2  --函数有返回值
AS
   v_name varchar2(50);
BEGIN
   SELECT name INTO v_name FROM DEP WHERE id=v_id;
   return v_name;
END;

DECLARE
  v_name varchar2(50);
BEGIN
  v_name := funFindNameById(1);  --调用函数
  dbms_output.put_line(v_name || '  NEW'); --打印返回结果
END;

declare
a VARCHAR2(30);
b CHAR(10);
c NUMBER(10,2);
d date;
e boolean;
begin
 a := '12345';
 b := '2';
 c := 3.11;
 d := sysdate;
 e := true;
 dbms_output.put_line(a||'!');
 dbms_output.put_line(b||'!');
 dbms_output.put_line(c);
 dbms_output.put_line(d);
 if(e)then
     dbms_output.put_line('ok');
 end if;
end;

TYPE dep_record IS RECORD(
    id dep.id%type,
    name dep.name%type
);

DECLARE
  TYPE dep_record IS RECORD(
    id dep.id%type,
    name dep.name%type
  );
  v_record dep_record;
BEGIN
  SELECT * INTO v_record FROM dep WHERE id=1;
  dbms_output.put_line(v_record.id || '   ' || v_record.name);
END;

 

DECLARE
  v_username VARCHAR2(20);
BEGIN
  SELECT u_username INTO v_username FROM tuser where u_id=&no;
  dbms_output.put_line('UserName:' || v_username);
EXCEPTION
  WHEN NO_DATA_FOUND THEN
    dbms_output.put_line('请输入正确的uID');
END;

--测试过程
CREATE sequence seq_test;
CREATE PROCEDURE insert_dept(dept_name varchar) is
BEGIN
  --往dept表中插入一个部门,seq_test是一个序列
  INSERT INTO dept values(seq_test.nextval, dept_name);
END;
call insert_dept('开发部');
--查询结果
SELECT * FROM dept;

--测试函数
CREATE FUNCTION findDeptNameById(v_id int) RETURN VARCHAR2 is
  v_dept_name VARCHAR2(20);
BEGIN
  SELECT dept_name INTO v_dept_name FROM dept WHERE dept_id=v_id;
  RETURN v_dept_name;
END;
--调用函数
call dbms_output.put_line(findDeptNameById(1));
DECLARE
  v_result VARCHAR2(20);
BEGIN
  v_result := findDeptNameById(1);
  dbms_output.put_line(v_result);
END;

--创建包
CREATE OR REPLACE PACKAGE dept_pkg IS
  TYPE dept_table_name_type IS TABLE OF VARCHAR2(50) INDEX BY BINARY_INTEGER;
  PROCEDURE insert_sql(dname dept.dept_name%TYPE);
  FUNCTION findDeptNameById(dId dept.dept_id%TYPE) RETURN dept.dept_name%TYPE;
END;
--创建包体
CREATE OR REPLACE PACKAGE BODY dept_pkg IS
  PROCEDURE insert_sql(dname dept.dept_name%TYPE) IS
  BEGIN
    INSERT INTO dept VALUES(seq_test.nextval, dname);
  END;
 
  FUNCTION findDeptNameById(dId dept.dept_id%TYPE) RETURN dept.dept_name%TYPE IS
    v_result dept.dept_name%TYPE;
  BEGIN
    SELECT dept_name INTO v_result FROM dept WHERE dept_id=dId;
    RETURN v_result;
  END;
END;
--调用包的过程和函数
call dept_pkg.insert_sql('市场部');
call dbms_output.put_line(dept_pkg.findDeptNameById(2));

--创建触发器
CREATE TRIGGER insert_dept_trg AFTER INSERT ON dept
BEGIN
  dbms_output.put_line('插入了一条记录');
END;
--测试触发器
call dept_pkg.insert_sql('行政部');
--定义Record数据类型
TYPE dept_record_type IS RECORD(
  dId dept.dept_id%TYPE,
  dName dept.dept_name%TYPE
);
--定义一个自定义类型dept_record_type的变量
v_dept_record dept_record_type;

DECLARE
  --定义Record数据类型
  TYPE dept_record_type IS RECORD(
    dId dept.dept_id%TYPE,
    dName dept.dept_name%TYPE
  );
  --定义一个自定义类型dept_record_type的变量
  v_dept_record dept_record_type;
  --用%ROWTYPE定义记录变量
  v_dept_record2 dept%ROWTYPE;
BEGIN
  SELECT * INTO v_dept_record FROM dept WHERE dept_id=1;
  dbms_output.put_line(v_dept_record.dName || TO_CHAR(v_dept_record.dId));
 
  SELECT * INTO v_dept_record2 FROM dept WHERE dept_id=1;
  dbms_output.put_line(v_dept_record2.dept_id || TO_CHAR(v_dept_record2.dept_name));
END;

DECLARE
  --定义表类型
  TYPE dept_table_name_type IS TABLE OF dept.dept_name%TYPE INDEX BY BINARY_INTEGER;
  --定义自定义表类型的变量
  v_dept_type_name dept_table_name_type;
BEGIN
  --给表类型变量的-1和0下标位置赋值
  SELECT dept_name INTO v_dept_type_name(-1) FROM dept WHERE dept_id=1;
  SELECT dept_name INTO v_dept_type_name(0) FROM dept WHERE dept_id=2;
  --获取表类型变量中存储的数据
  dbms_output.put_line(v_dept_type_name(-1));
  dbms_output.put_line(v_dept_type_name(0));
END;
SELECT * FROM dept;

--返回表类型的存储过程
CREATE OR REPLACE PROCEDURE testTableType(out_param out dept_pkg.dept_table_name_type) IS
  v_dept_name dept.dept_name%TYPE;
BEGIN
  SELECT dept_name INTO v_dept_name FROM dept WHERE dept_id=1;
  --要方便Java调用,下标必须从1开始
  out_param(1) := v_dept_name;
  SELECT dept_name INTO v_dept_name FROM dept WHERE dept_id=2;
  out_param(2) := v_dept_name;
END;

DECLARE
  v_result dept_pkg.dept_table_name_type;
BEGIN
  testTableType(v_result);
  dbms_output.put_line(v_result(0));
END;

--定义一个author_type自定义对象类型
CREATE OR REPLACE TYPE author_type AS OBJECT(
  firstName VARCHAR(20),
  secondName VARCHAR(20),
  sex CHAR(4),
  age int
);
--定义一个author_type嵌套表类型
CREATE OR REPLACE TYPE author_array IS TABLE OF author_type;
--将嵌套表类型运用到表列
CREATE TABLE book(
  id INT NOT NULL PRIMARY KEY,
  b_name VARCHAR2(20),
  author author_array
)NESTED TABLE author STORE AS author_table;
DECLARE
BEGIN
  --往book表中插入一个数据
  INSERT INTO book VALUES(seq_test.nextval, 'JAVA技术',
    author_array(
      author_type('Noble','Yang','男',31),
      author_type('Steve','Yang','男',10)
    )
  );
END;
select * from book;
--基本类型的表嵌套类型
CREATE OR REPLACE TYPE add_array IS TABLE OF VARCHAR2(20);
CREATE TABLE bookUser(
  id INT NOT NULL PRIMARY KEY,
  user_name VARCHAR(20) unique not null,
  password VARCHAR(20),
  address add_array
)NESTED TABLE address STORE AS address_table;
INSERT INTO bookUser VALUES(
  seq_test.nextval, 'zhangsan','23',add_array('湖南','广东','海南')
);
SELECT * FROM bookUser;
--建立ARRAY类型
CREATE TYPE au_array_type IS VARRAY(20) OF author_type;
--建立一个author列时au_array_type类型的表
CREATE TABLE book_array(
  id INT NOT NULL PRIMARY KEY,
  b_name VARCHAR2(20),
  author au_array_type
);
INSERT INTO book_array VALUES(
  seq_test.nextval, 'Oracle数据库',
  au_array_type(
    author_type('Noble','Yang','男',31),
    author_type('Steve','Yang','男',10)
  )
);
COMMIT;
SELECT * FROM book_array;
DECLARE
 v_author au_array_type;
BEGIN
 SELECT author INTO v_author FROM book_array WHERE id=23;
 --测试COUNT方法
 dbms_output.put_line(TO_CHAR(v_author.COUNT()));
END;


--创建一个存放作者对象的表
CREATE TABLE authors OF author_type;
--插入数据
INSERT INTO authors VALUES('ANDY','Yang','男', 10);
INSERT INTO authors VALUES('Noble','Yang','男', 30);
COMMIT;
--创建一个表,里面包含一个REF引用字段
CREATE TABLE book_ref_author(
  id int not null primary key,
  book_name varchar2(30),
  author REF author_type
);
--往表中插入一条记录,author字段里面的值是authors表中对象的地址
INSERT INTO book_ref_author
  SELECT seq_test.nextval, 'Java', ref(a)
  FROM authors a where lower(a.firstname)='andy';
commit;
SELECT * from book_ref_author;


DECLARE
  v_author_array ref author_type;
BEGIN
  SELECT author INTO v_author_array FROM book_ref_author WHERE id=41;
  dbms_output.put_line(v_author_array.firstName);
END;

SELECT value(o) FROM authors o;
SELECT REF(o) FROM authors o;
SELECT id, book_name, DEREF(author) FROM book_ref_author;

--测试LOB类型建立表
CREATE TABLE book_info(
  id int NOT NULL PRIMARY KEY,
  bookName VARCHAR2(50) NOT NULL,
  remark   CLOB,
  img      BLOB,
  bookZip  BFILE
);
SELECT * FROM book_info;
DELETE FROM book_info;
--建立目录,注意名称用双引号,值用单引号
CREATE DIRECTORY "bookZip" AS 'c:/data/temp';
SELECT * FROM dba_directories;

SELECT * FROM book_info ORDER BY ID FOR UPDATE;
COMMIT;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值