oracle的一些语句

仅作为自己笔记用,如果正好别人也需要就更好了



--前提:如果发现输出窗口没有显示我们的输出内容,那就要执行一下下面这句话
set serveroutput on;

--1.执行普通的代码
declare 
arg1 VARCHAR2(222) := 123; --定义对象赋值,oracle里面 := 代表赋值的意思
arg2 VARCHAR2(222) := 333;
begin
    --假设arg1是输入,arg2是输出   
    用户.存储过程(arg1, arg2); --执行存储过程
    dbms_output.put_line(arg1);--输出字符串
end;

--2.查询前n行
select * from 表名 where rownum <= n

--3.建表
create table 表名
(
    id number not null,
    string varchar(20),
    string2 varchar(20)            
);

--4.给上面这张表添加注释
comment on column 表名.字段名 is '注释';

--5.给上面那张表创建主鍵
alter table 用户名.表名 add constraint 主键名 primary key (主键字段)

--6.创建序列(主键自增用)
create sequence 序列名 -- 建议使用表名+字段名+seq后缀
increment by 1 -- 每次加几个
start with 1 -- 从1开始计数
nomaxvalue --不设置最大值
nocycle -- 一直累加,不循环
nocache -- 不建缓冲区

--7.把上面的序列和表绑定(需要启用)
create or replace trigger 触发器名字
before insert on 表名
for each row
begin
select 序列名.nextval into :new.主键名字 from dual;
end 触发器名字;

--8.给上面那张表创建索引,和sql server一样,如果没有建立组合索引,在where string = 'xxx' and string2 = 'xxx'的时候单个索引不起作用,且和where时候使用的字段顺序有关,如果 where string2 = 'xxx' and string = 'xxx'则下面这段索引就不起作用
create index 索引名字 on 表名 (字段1, 字段2);

--9.创建存储过程
create or replace procedure pro_test(string1 in varchar2, string2 in varchar2)--pro_test为存储过程名
is
temp varchar2(128);--temp为存储过程临时变量
begin
    insert into mytesttable (string1, string2) values(string1, string2);
    commit;--切记commit一下(提交)
    select count(*) into temp from mytesttable;--存储过程里面查询必须要有个存放的地方不然会报语法错误
    dbms_output.put_line('行数:'||temp);--orcale里面 || 代表拼接符号
    exception
    when others
    then
    begin
        dbms_output.put_line('出错了:'||SQLERRM);
        rollback;--回滚
    end;
end;

--10.执行带参数存储过程:
exec 存储过程(参数1,参数2);    
--11.执行无参数存储过程:
exec 存储过程名字();

--12.if语句的写法
if (条件)
then
语句一;
语句二;
else--else if要写成 elsif,且写了if一定要补then,比如:elsif 条件 then xxxx
语句三;
语句四;
end if;

--13.查询所有用到某字符串的存储过程、触发器和函数,有时候不是所有的存储过程和触发器都在同一用户下,我们可以使用"all_source"代替"user_source"
select * from user_source where text like '%字符串%';

--14.时间格式转换
to_char(sysdate, "yyyy")--各种时间,yyyyMMdd这种,随意组合

to_date('2010-01-01','yyyy-mm-dd') --字符串转时间

--存储过程中的循环

--创建一个存储过程
create or replace procedure sj_mytestpro as
part_no VARCHAR2 (200);
rate_value number;

CURSOR part_info
IS
SELECT function_name,parame_value FROM SAJET.SYS_MODULE_PARAM
WHERE MODULE_NAME = 'PassCfg' AND PARAME_ITEM = 'Rate'
AND ENABLED = 'Y';--定義集合要放在begin前(就是declar下)
begin
FOR part_info_item IN part_info
LOOP
part_no := part_info_item.function_name;
rate_value := part_info_item.parame_value;
end loop;
end;

--15.查询创建的作业
select job,broken,what,interval,t.* from user_jobs t

--16.创建作业
declare
job number;
BEGIN
DBMS_JOB.SUBMIT(
JOB => job, /*自动生成JOB_ID*/
WHAT => 'proc_add_test;', /*需要执行的存储过程名称或SQL语句*/
NEXT_DATE => sysdate+3/(24*60), /*初次执行时间-下一个3分钟*/
INTERVAL => 'trunc(sysdate,''mi'')+1/(24*60)' /*每隔1分钟执行一次*/
);
commit;
end;


--17.跨数据库读取数据并插入现有数据库的表
SELECT * FROM DBA_DB_LINKS ORDER BY DB_LINK;--获取对应的数据库的DB_LINK连接名,假如叫'TESTDB'

 
INSERT INTO TABEL_A--从名为'TESTDB'库中拉取数据,插入当前数据库
SELECT * FROM TABEL_A@TESTDB WHERE ID = 1000220848;        

 

 

posted on 2022-07-18 16:23  炼金师  阅读(52)  评论(0编辑  收藏  举报

导航