您的位置:首页 > 数据库

常用PLSQL子程序

2016-04-09 17:17 267 查看
01.清空回收站

begin

EXECUTE IMMEDIATE 'purge recyclebin';

end;

/

02.截断表

declare

begin

execute immediate 'truncate table person_bak2';

end;

/

03.修改表列可以为空

--修改时间:2014年9月1日

--修改内容:修改表BT_SALE_CONTRACT字段TRANS_TIME允许为空

--修改原因:销售合同导入时报TRANS_TIME为NULL不能插入

DECLARE

VN_NULLABLE VARCHAR2(1);

BEGIN

SELECT nullable

INTO VN_NULLABLE

FROM user_tab_columns

WHERE table_name = 'BT_SALE_CONTRACT'

AND column_name = 'TRANS_TIME';

IF VN_NULLABLE = 'N' THEN

EXECUTE IMMEDIATE ' ALTER TABLE BT_SALE_CONTRACT MODIFY TRANS_TIME DATE NULL ';

END IF;

COMMIT;

END;

/

04.修改列列长度(字符型,只允许变长,不允许变短)

--修改时间:2014年9月3日

--修改内容:修改表BT_BUY_DETAIL字段PRODUCT_NAME的长度

-- 修改表BT_BUY_FPRECORD 字段PRODUCT_NAME的长度

--修改原因:导入时报其字段的长度不够

--修改产品名称字段地,采购明细导入报其字段的长度不够

alter table BT_BUY_DETAIL modify(PRODUCT_NAME varchar2(500));

--修改产品名称字段,发票表导入报其字段的长度不够

alter table BT_BUY_FPRECORD modify(PRODUCT_NAME varchar2(500));

commit;

05.创建表

--修改人:易小群

--修改内容:新增预投产品/返修产品库,在招标采购时可供选择

DECLARE

VC_STR VARCHAR2(5000);

VN_COUNT NUMBER;

BEGIN

--查看现有系统是否有BT_PRODUCT_MODEL表

SELECT COUNT(*)

INTO VN_COUNT

FROM USER_TABLES

WHERE TABLE_NAME = 'BT_PRODUCT_MODEL';

--如果没有则新增表,如果有就不处理

IF VN_COUNT < 1 THEN

VC_STR := ' create table BT_PRODUCT_MODEL

(

product_model_id NUMBER not null,

product_code VARCHAR2(30),

product_name VARCHAR2(30),

product_type VARCHAR2(30),

product_desc VARCHAR2(100),

constraint PK_PRODUCT_MODEL_ID primary key (PRODUCT_MODEL_ID)

)';

EXECUTE IMMEDIATE VC_STR;

END IF;

END;

/

06.表列增加字段

--修改时间:2014-9-16

--修改内容:销售合同表增加合同标记

DECLARE

VN_COUNT NUMBER;

VC_STR VARCHAR2(1000);

BEGIN

--查看该表中该字段是否存在

SELECT COUNT(*)

INTO VN_COUNT

FROM USER_TAB_COLUMNS

WHERE TABLE_NAME = 'BT_SALE_CONTRACT' AND COLUMN_NAME = 'CONTRACTFLAG';

IF VN_COUNT < 1 THEN

VC_STR := ' ALTER TABLE BT_SALE_CONTRACT ADD CONTRACTFLAG VARCHAR2(30)';

EXECUTE IMMEDIATE VC_STR;

END IF;

END;

/

07.开启回收站

begin

execute immediate 'alter session set recyclebin=on';

end;

/

08.创建序列

DECLARE

VC_STR VARCHAR2(5000);

VN_COUNT NUMBER;

BEGIN

SELECT COUNT(*)

INTO VN_COUNT

FROM ALL_SEQUENCES

WHERE SEQUENCE_NAME = 'AUDIT_SEQ';

IF VN_COUNT < 1 THEN

VC_STR := 'CREATE SEQUENCE audit_seq

START WITH 1000

INCREMENT BY 1

NOMAXVALUE

NOCYCLE NOCACHE;';

EXECUTE IMMEDIATE VC_STR;

END IF;

END;

/

09.解锁用户

SQL> SELECT OBJECT_NAME,S.SID, S.SERIAL#

2 FROM GV$LOCKED_OBJECT L, DBA_OBJECTS O, GV$SESSION S

3 WHERE L.OBJECT_ID  = O.OBJECT_ID

4 AND L.SESSION_ID = S.SID;

OBJECT_NAME

-----------------------------------------------------------------------

SID SERIAL#

---------- ----------

BT_USER

132 37

SQL> alter system kill session '132,37';

系统已更改。

SQL> SELECT OBJECT_NAME,S.SID, S.SERIAL#

2 FROM GV$LOCKED_OBJECT L, DBA_OBJECTS O, GV$SESSION S

3 WHERE L.OBJECT_ID  = O.OBJECT_ID

4 AND L.SESSION_ID = S.SID;

未选定行

SQL>

SQL注意

各位在写SQL脚本的时候注意下面的情况:

1、SQL脚本中单引号中嵌套单引号问题,如:需要在一个字段中插入字符串"ab'1'cd",不能写成'ab'1'cd',需要写成'ab''1''cd'

2、SQL遇到字符串中有取地址符&问题,需要修改成'||'&'||' 例如:'abc&def' 需要修改成'abc'||'&'||'def'

或使用函数CHR(38)

SQL> select chr(38) from dual;

C

-

&

说明:本人于ITEYE创建于2013年,现转移到CSDN
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: