SQL开发常见细小知识点

111;
111;
--content: sql开发常见知识点
--created: 20120113
--updated: 20140730 13:50

--目录
/*1-- SQL grammer -- Time --*/
/*2-- SQL grammer -- decode --*/
/*3-- SQL grammer -- group function --*/
/*4-- SQL grammer -- synonym -- 同义词 --*/
/*5-- SQL grammer -- comment --*/
/*6-- SQL grammer -- lpad,rpad -- 在左边或右边补充字符--*/
/*7-- SQL grammer -- modify -- 只是修改字段长度 --*/
/*8-- SQL grammer -- rename -- 给字段重命名 --*/
/*9-- SQL grammer -- drop column -- 删除字段 --*/
/*10-- SQL grammer -- add column -- 添加字段 --*/
/*11-- SQL grammer -- sequence -- 创建序列 --*/
/*12-- SQL grammer -- grant/revoke -- 授权/取消授权 --*/
/*13-- SQL grammer -- trigger/enable/disable/drop trigger -- 触发器 --*/
/*14-- SQL grammer -- substr(str,a,b) -- 从第a个字符起取b个字符做子串a为首字符,0/1都指1 --*/
/*15-- SQL grammer -- DBMS_OUTPUT.put_line -- PL/SQL中输出内容 --*/
/*16-- SQL grammer -- PL/SQL中的大对象-- 相关应用在pkg_bv_cgi中有 --*/
/*17-- SQL grammer -- 关于 trunc() 的一些常例 --*/
/*18-- SQL grammer -- 索引 index 创建和使用-- created_by yangzhengwei056 2012-07-18 11:01:00*/
/*19-- SQL grammer --  ltrim() -- created_by yangzhengwei056 2012-10-08 16:17 --*/
/*20-- SQL grammer -- pkg授权与权限传递访问 --*/
/*21-- SQL grammer -- 查询收权到的表 --*/
/*22-- SQL grammer -- 取整函数ceil,floor,round,months_between --*/
/*23-- SQL grammer -- 取后三位的前两位substr('tcust_id',-3,2) --*/
/*24-- SQL grammer -- (待续) --*/

--正文
/*1-- SQL grammer -- Time --*/
sELECT l.rpy_info_flag rpyInfoFlag FROM l_bank_mas l;

SELECT to_number(to_char(last_day(to_date('2012-09-12','yyyy-mm-dd hh24:mi:ss')),'dd')) FROM dual;
                  SELECT last_day(to_date('2011-02-05','yyyy-mm-dd hh24:mi:ss')) FROM dual;       --计算该日期所在月份的最后一天
          SELECT to_char(last_day(to_date('2011-02-21','yyyy-mm-dd hh24:mi:ss')),'dd') FROM dual; --取该日期所在月份的最后一天 的号数
SELECT to_number(to_char(last_day(to_date('2011-02-04','yyyy-mm-dd hh24:mi:ss')),'dd')) FROM dual; --号数转为数值

add_months(v_due_date,-1) ;--计算下一月的这一天的日期
SELECT add_months(to_date('2011-02-04','yyyy-mm-dd'),-1) FROM dual;

SELECT * FROM i_pl_ledg_mas l WHERE l.INST_NO='999';
I_BOF_DETAIL_MAS
SELECT * FROM tmpa ;
/*2-- SQL grammer -- decode --*/
DECLARE
 v_age VARCHAR2(1) := 'n';
BEGIN
  UPDATE tmpa a
     SET a.age = decode(v_age,'y','20','n','30','60')
   WHERE a.aid = '5';
END;

SELECT * FROM tmpa;

/*3-- SQL grammer -- group function --*/
SELECT  a.age age
        , a.ANAME aname
        , MAX(a.age) sumAge
FROM tmpa a
--WHERE a.age = 19
GROUP BY a.age, a.aname;
SELECT * FROM tmpa FOR UPDATE;
ALTER TABLE tmpa MODIFY aid NUMBER(2);
ALTER TABLE tmpa ADD sex VARCHAR2(1);
COMMENT ON COLUMN tmpa.sex IS '性别';

SELECT * FROM tmpa;
SELECT sex s,addr a,SUM(age),(SELECT SYSDATE FROM dual) tim FROM tmpa GROUP BY addr,sex;
SELECT sex s,addr a,SUM(age),(SELECT SYSDATE FROM dual) tim FROM tmpa GROUP BY sex,addr;

1 01 zlj 6 29 罗湖 2012-03-22 15:23:00
2 02 yl 5 27 南山 2012-02-24 15:46:13
3 03 yyf 5 28 福田上梅林 2012-03-22 15:00:00
4 05 czx 2 24 福田泥岗 2012-03-22 15:03:03
5 04 yfc 2 25 福田泥岗 2012-03-22 15:02:01
6 06 zdb 1.5 25 福田泥岗 2012-03-22 15:03:03
7 07 yzw .5 24 南山 2012-03-22 15:03:03
8 08 ly .3 26 福田泥岗 2012-03-22 15:03:03
9 09 jzz .1 26 福田泥岗 2012-03-22 15:03:03
10 00 ls .1 30 - 2012-03-22 15:03:03
11 11 mzp .1 30 - 2012-03-22 15:03:03
    //-- having 子句
SELECT l.appl_no FROM l_loan_stat_log l
WHERE l.status_code = 'AP'
GROUP BY l.appl_no
HAVING COUNT(appl_no)>1;

SELECT * FROM l_loan_stat_log l WHERE l.appl_no = '000100100293';  -- 未用 having 子句筛选数量,该笔申请appl_no只有一条记录

SELECT * FROM l_loan_stat_log l WHERE l.appl_no = '000300100318';  -- 采用 having 子句进行数据量筛选,该笔 appl_no 记录数大于1

/*4-- SQL grammer -- synonym -- 同义词 --*/
GRANT SELECT ON tmpa TO cgicde;
REVOKE SELECT ON draftdata.tmpa FROM cgicde;
CREATE OR REPLACE PUBLIC SYNONYM aaatmpa FOR draftdata.tmpa ;
DROP PUBLIC SYNONYM tmpb;
SELECT * FROM aaatmpa;
SELECT * FROM tmpb;
SELECT * FROM draftdata.tmpa;

CREATE TABLE aaat AS SELECT * FROM tmpa;
SELECT * FROM draftdata.aaat;--
GRANT SELECT ON aaat TO cgicde;--授权后可以访问,不过得带表属主;
CREATE OR REPLACE PUBLIC SYNONYM synaaat FOR aaat;
SELECT * FROM synaaat;-- 用同义词访问就可以不用属主了
SELECT * FROM aaat;
DROP PUBLIC SYNONYM synaaat;
DROP TABLE aaat;      -- 删除表后同义词还在,只是用它查询已经no longer valid了


/*5-- SQL grammer -- comment --*/
-- Add comments to the columns
comment on column tmpa.age IS '年龄';

SELECT * FROM tmpa;
COMMENT ON COLUMN tmpa.age IS '年龄';
COMMENT ON COLUMN tmpa.arec IS '入司年限';
 -- 增添一个字段 并加注释-0-
ALTER TABLE tmpa ADD addr VARCHAR2(100);
 COMMENT ON COLUMN tmpa.addr IS '居住地址'; 

UPDATE tmpa SET addr='shenzhen' WHERE aid='5';

SELECT * FROM user_triggers ;

2009-05-23 2:02:59;
SELECT trunc(i.fcd) FROM i_rpy_plan_mas i WHERE i.lnacct = '8015600066470'AND i.inst_no = '1';
SELECT * FROM  i_rpy_plan_mas i WHERE i.lnacct = '8015600066470';
/*6-- SQL grammer -- lpad,rpad -- 在左边或右边补充字符--*/
SELECT rpad(l.lnacct, 15, '-') FROM i_rpy_plan_mas l WHERE l.lnacct = '8015600066470';
SELECT rpad('abc',10,'-') FROM dual;  -- abc-------
SELECT lpad('abc',10,'*') FROM dual;  -- *******abc

/*7-- SQL grammer -- modify -- 只是修改字段长度 --*/
SELECT * FROM tmpa;
ALTER TABLE tmpa MODIFY  aname VARCHAR2(35);
ALTER TABLE cgidata.i_pl_ledg_mas  MODIFY  notice_no VARCHAR2(32);

/*8-- SQL grammer -- rename -- 给字段重命名 --*/
alter table tmpa rename column anaming to aname ; -- 字段名不用加引号""  2012-02-17

/*9-- SQL grammer -- drop column -- 删除字段 --*/
ALTER TABLE tmpa DROP COLUMN per_consume;
--删除多个字段时
ALTER TABLE tmpa DROP (per_consume,a1,a2);
SELECT * FROM tmpa;

/*10-- SQL grammer -- add column -- 添加字段 --*/
ALTER TABLE tmpa ADD per_consume number(10,4);  -- number(a,b): a总长度,b小数位数(多了会自动四舍五入截取)
COMMENT ON COLUMN tmpa.per_consume IS '每日消费';
SELECT * FROM tmpa;
UPDATE tmpa t SET t.per_consume = '164271.342553452' WHERE t.aid = '7';

/*11-- SQL grammer -- sequence -- 创建序列 --*/
create sequence draftdata.Seq_tmpa_aid
minvalue 1
maxvalue 4
start with 1
increment by 1
cache 2
CYCLE
NOORDER;
-- 访问
SELECT lpad(draftdata.seq_tmpa_aid.NEXTVAL,20,'0') FROM dual;
SELECT draftdata.seq_tmpa_aid.currval FROM dual;
DROP SEQUENCE Seq_tmpa_aid;
SELECT seqtmpaaid.nextval FROM dual;
-- 为序列创建同义词
CREATE PUBLIC SYNONYM dseqtmpaaid FOR draftdata.seq_tmpa_aid
SELECT dseqtmpaaid.nextval FROM dual;
-- 删除序列同义词
DROP PUBLIC SYNONYM dseqtmpaaid;

/*12-- SQL grammer -- grant/revoke -- 授权/取消授权 --*/
GRANT SELECT,INSERT,UPDATE ON draftdata.tmpa TO cgicde;  -- 授权
REVOKE SELECT ON tmpa FROM cgicde;  -- 取消授权

GRANT SELECT,DELETE,UPDATE,INSERT ON tmpa TO tloancde;  -- 授权
REVOKE SELECT,DELETE,UPDATE,INSERT ON tmpa FROM tloancde;  -- 取消授权

SELECT * FROM draftdata.tmpa;
SELECT * FROM tmpa;

/*13-- SQL grammer -- trigger/enable/disable/drop trigger -- 触发器 --*/
-------------- I_ENDORSE_BACK_MAS LCD/UPDATE --------------
create or replace trigger draftdata.TR_tmpa_Bu
    before update on  draftdata.tmpa             
    for each row                                 
declare
v_trigger_date DATE := sysdate;  
begin          
    :new.date_updated := v_trigger_date;                        
end;                                             
/

ALTER TRIGGER draftdata.TR_tmpa_Bu DISABLE;
DROP TRIGGER draftdata.TR_tmpa_Bu;

SELECT * FROM tmpa FOR UPDATE;

ALTER TABLE tmpa ADD date_updated DATE;
ALTER TABLE tmpa ADD date_created DATE;

 COMMENT ON COLUMN tmpa.date_updated IS '修改时间';
 
 
 DROP TRIGGER CFSTRG.TR_I_I_ENDORSE_BACK_MAS;
 DROP TRIGGER CFSTRG.TR_U_I_ENDORSE_BACK_MAS;
 
 
/*14-- SQL grammer -- substr(str,a,b) -- 从第a个字符起取b个字符做子串a为首字符,0/1都指1 --*/
SELECT substr('01223456',3,3) FROM dual; 

/*15-- SQL grammer -- DBMS_OUTPUT.put_line -- PL/SQL中输出内容 --*/
DECLARE
 rsltMsg VARCHAR2(20) := 10;
 
BEGIN
 IF rsltMsg <= 10 THEN
  dbms_output.put_line('小于等于10');
 ELSE
  DBMS_OUTPUT.put_line('大于10');
 END IF;
END;

/*16-- SQL grammer -- PL/SQL中的大对象-- 相关应用在pkg_bv_cgi中有 --*/
-- 直接在cgicde用户下执行这个脚本即可创建
CREATE OR REPLACE TYPE Claim_pay_rslt_obj IS OBJECT                                                            --
(
   refNo NUMBER(12),        -- 流水号
   businessRefNo VARCHAR2(20), -- 支付编号,即凭证表的业务流水号                                               --
   payBy VARCHAR2(30),      -- 支付人
   payDate VARCHAR2(30),    -- 支付时间
   backBy VARCHAR2(30),     -- 退回人
   backDate VARCHAR2(30),   -- 退回时间
   backReason VARCHAR2(400) -- 原因
);
/
CREATE OR REPLACE TYPE ClaimPayRsltTable IS TABLE OF Claim_pay_rslt_obj;
/
-- 消除对象
DROP TYPE claim_pay_rslt_obj;
DROP TYPE claimpayrslttable;
-- 给对象授权/消权
grant execute on Claim_pay_rslt_obj TO cgiopr;
grant execute on ClaimPayRsltTable TO cgiopr;
grant execute on pkg_bv_cgi TO cgiopr;
REVOKE EXECUTE ON Claim_pay_rslt_obj FROM cgiopr;

/*17-- SQL grammer -- 关于 trunc() 的一些常例 --*/
--
--------------------------
描述                    INTERVAL参数值
每天午夜12点            'TRUNC(SYSDATE + 1)'
每天早上8点30分         'TRUNC(SYSDATE + 1) + (8*60+30)/(24*60)'
每星期二中午12点         'NEXT_DAY(TRUNC(SYSDATE ), ''TUESDAY'' ) + 12/24'
每个月第一天的午夜12点    'TRUNC(LAST_DAY(SYSDATE ) + 1)'
每个季度最后一天的晚上11点 'TRUNC(ADD_MONTHS(SYSDATE + 2/24, 3 ), 'Q' ) -1/24'
每星期六和日早上6点10分    'TRUNC(LEAST(NEXT_DAY(SYSDATE, ''SATURDAY"), NEXT_DAY(SYSDATE, "SUNDAY"))) + (6×60+10)/(24×60)'

SELECT to_char(TRUNC(SYSDATE + 1),'yyyy-mm-dd hh24:mi:ss') FROM dual;
--------------------------

1:每分钟执行

Interval => TRUNC(sysdate,'mi') + 1/ (24*60)

2:每天定时执行

例如:每天的凌晨1点执行

Interval => TRUNC(sysdate) + 1 +1/ (24)

3:每周定时执行

例如:每周一凌晨1点执行

Interval => TRUNC(next_day(sysdate,'星期一'))+1/24

4:每月定时执行

例如:每月1日凌晨1点执行

Interval =>TRUNC(LAST_DAY(SYSDATE))+1+1/24

5:每季度定时执行

例如每季度的第一天凌晨1点执行

Interval => TRUNC(ADD_MONTHS(SYSDATE,3),'Q') + 1/24

6:每半年定时执行

例如:每年7月1日和1月1日凌晨1点

Interval => ADD_MONTHS(trunc(sysdate,'yyyy'),6)+1/24

7:每年定时执行

例如:每年1月1日凌晨1点执行

Interval =>ADD_MONTHS(trunc(sysdate,'yyyy'),12)+1/24


/*18-- SQL grammer -- 索引 index 创建和使用-- created_by yangzhengwei056 2012-07-18 11:01:00*/

---- PIR_PA02346354  生产缺陷修复-PM58753  by yangzhengwei056 2012-07-18
 CREATE INDEX draftdata.IX_I_INSURAMT_FAIL_INFO_LNACCT ON i_insuredamt_fail_info(lnacct);


如该表i_insuredamt_plan_tmp有复合索引 PK_I_INSUREDAMT_PLAN_TMP ON (LNACCT, INST_NO, INPUT_DATE, BANK_NO)
--前导索引: 其中lnacct为前导索引,如果查询条件中没有lnacct,即使有inst_no,那么就不会走索引。

语句1中使用了函数,没走索引,执行计划1;
语句1:
SELECT * FROM i_insuredamt_plan_tmp i WHERE i.bank_NO = '20' AND substr(i.LNACCT,2) = '2';
执行计划1:
描述  对象 耗费 基数 字节
SELECT STATEMENT, GOAL = ALL_ROWS   11028 1 79
 TABLE ACCESS FULL  I_INSUREDAMT_PLAN_TMP 11028 1 79
--Summary:索引要单独使用,作为where子句中的一个条件,不能修饰,比如substr(i.lnacct,5),就不是索引,得建函数substr(i.lnacct,5)的索引才能有索引可走

语句2中使用了连接符,也没有走索引,执行计划2;  
语句2:
SELECT * FROM i_insuredamt_plan_tmp i WHERE i.bank_NO = '20' AND i.LNACCT||'-'||i.inst_no = '12-432';
执行计划2:
描述  对象 耗费 基数 字节
SELECT STATEMENT, GOAL = ALL_ROWS   11028 1 79
 TABLE ACCESS FULL  I_INSUREDAMT_PLAN_TMP 11028 1 79
--Summary:也不能连接符 ‘-’ 修饰索引字段

语句3中单独使用,走了索引,执行计划3;
语句3:
SELECT * FROM i_insuredamt_plan_tmp i WHERE i.bank_NO = '20' AND i.LNACCT = '2';
执行计划3:
描述  对象 耗费 基数 字节
SELECT STATEMENT, GOAL = ALL_ROWS   4 1 79
 TABLE ACCESS BY INDEX ROWID DRAFTDATA I_INSUREDAMT_PLAN_TMP 4 1 79
  INDEX RANGE SCAN  PK_I_INSUREDAMT_PLAN_TMP 3 1 

语句4中没有引用前导索引,就全表扫描了,执行计划4(关于前导索引具体就见http://blog.csdn.net/nickbest85/article/details/5681359了,不再累述)。
语句4:
SELECT * FROM i_insuredamt_plan_tmp i WHERE i.inst_no = '12';
执行计划4:
描述  对象 耗费 基数 字节
SELECT STATEMENT, GOAL = ALL_ROWS   10986 159533 12603107
 TABLE ACCESS FULL  I_INSUREDAMT_PLAN_TMP 10986 159533 12603107

--创建唯一索引和删除索引  2012-10-08 15:44
SELECT * FROM tmpa order BY aid;
CREATE UNIQUE INDEX uk_aname ON tmpa(aname);  -- 创建唯一索引

DROP INDEX UK_ANAME;  --- 干掉索引
DROP INDEX ix_ANAME;  --- 干掉索引

CREATE UNIQUE INDEX ix_aname ON tmpa(aname,age);   --- 创建一般索引

/*19-- SQL grammer --  ltrim() -- created_by yangzhengwei056 2012-10-08 16:17 --*/
SELECT  ltrim('00020345001','0') FROM dual; --20345001
SELECT  rtrim('000203450010000','0') FROM dual; --00020345001


/*20-- SQL grammer -- pkg授权与权限传递访问 --*/
--created by yzw056 20140304 15:56

grant execute on tloancde.PKG_CFS_DM_INTERFACE to PADMETL,r_tloandata_qry,r_tloandata_dml;

--1问题:U1和U2两个用户,U1有p1和p2两个pkg,U2有访问p1的权限,但是没有访问p2的权限,p1.a这个过程有调用p2.b这个过程,
      --当U2访问p1.a这个过程时,是否会报错?   答案--不报错,OK
--2假设:不会报错,授权的控制只作用于直接调用的对象
--3验证:
    --1draftdata将tmp表授权给cgicde,cgicde建pkg:cgicde.pkg_cgi_p1.a_deal,再建pkg:cgicde.pkg_cgi_p2.b_deal;
    create or replace package pkg_cgi_p1 is
       PROCEDURE a_deal;
       PROCEDURE a_b_deal;
    END pkg_cgi_p1;
   
    create or replace package body pkg_cgi_p1 IS
        PROCEDURE a_deal IS
        BEGIN
          INSERT INTO tmpa(aid,aname)VALUES('13','p1-20140304');
          EXCEPTION WHEN DUP_VAL_ON_INDEX THEN
          UPDATE tmpa SET aname = 'p1'||to_char(SYSDATE,'yyyymmdd') WHERE aid='13';
        END a_deal;
       
        PROCEDURE a_b_deal IS
        BEGIN
          pkg_cgi_p2.b_deal;
        END a_b_deal;
       
    END pkg_cgi_p1;

    create or replace package pkg_cgi_p2 is
        PROCEDURE b_deal;
    END pkg_cgi_p2;
   
    create or replace package body pkg_cgi_p2 IS
        PROCEDURE b_deal IS
        BEGIN
          INSERT INTO tmpa(aid,aname)VALUES('14','p2-20140304');
          EXCEPTION WHEN DUP_VAL_ON_INDEX THEN
          UPDATE tmpa SET aname = 'p2'||to_char(SYSDATE,'yyyymmddHH24MISS') WHERE aid='14';
        END b_deal;
    END pkg_cgi_p2;
   
    --2将cgicde授权p1的访问给tloancde,tloancde调用p2,不行;tloancde调用p1,OK。
    GRANT EXECUTE ON cgicde.pkg_cgi_p1 TO tloancde;
    GRANT EXECUTE ON cgicde.pkg_cgi_p2 TO cfscscde;
       SELECT * FROM tmpa ORDER BY aid;      
       SELECT to_char(SYSDATE,'yyyymmddHH24MISS') FROM dual;

    BEGIN
     cgicde.pkg_cgi_p2.b_deal;
    END;
    --3将p1.a_b_deal调用p2.b_deal,tloancde再调用p1.a_b_deal,应用到了p2.b_deal,验证OK。
--4结论: OK--  授权的控制只作用于直接调用的对象,即第一次调用的对象是有权限访问的即可。
      如上,即便cfscscde没有修改tmpa表的权限,但是由于有调用p2.b_deal的权限,通过这个过程也可以修改tmpa表;
            即便tloancde没有调用p2的权限,但是由于有调用p1的权限,通过a_b_deal这个过程也可以使用p2.b_deal来操作tmpa表;


/*21-- SQL grammer -- 查询收权到的表 --*/
--all_tab_privs或者user_tab_privs 只能查询到自己在grantee中的或者自己可访问的记录
SELECT * FROM all_tab_privs t WHERE t.table_name=upper('i_policy_mas');
GRANTOR GRANTEE TABLE_SCHEMA TABLE_NAME PRIVILEGE GRANTABLE HIERARCHY
CGIDATA TLOANCDE CGIDATA I_POLICY_MAS DELETE NO NO
CGIDATA TLOANCDE CGIDATA I_POLICY_MAS INSERT NO NO
CGIDATA TLOANCDE CGIDATA I_POLICY_MAS SELECT NO NO
CGIDATA TLOANCDE CGIDATA I_POLICY_MAS UPDATE NO NO
SELECT * FROM user_tab_privs t WHERE t.table_name=upper('i_policy_mas');
GRANTEE OWNER TABLE_NAME GRANTOR PRIVILEGE GRANTABLE HIERARCHY
TLOANCDE CGIDATA I_POLICY_MAS CGIDATA DELETE NO NO
TLOANCDE CGIDATA I_POLICY_MAS CGIDATA INSERT NO NO
TLOANCDE CGIDATA I_POLICY_MAS CGIDATA SELECT NO NO
TLOANCDE CGIDATA I_POLICY_MAS CGIDATA UPDATE NO NO

--查询是否有权限
---dba_tab_privs 可以查看到 所有的授权情况 ,开发环境只有deployop用户能查,测试和生产用户可以
 select p.grantee,p.owner,p.table_name,p.privilege
    from dba_tab_privs p
    where p.table_name in (upper('pkg_cfs_report'),
    upper('T_PACKAGE_ERROR_LOG'),
    upper('cfs_ps_employee'),
    upper('pkg_cfs_counter_customer'),
    upper('l_auto_loan_mas'),
    upper('l_epcisorg_cgicity_rel'),
    upper('l_auto_loan_log'),
    upper('l_appl_completed_info')
    --upper('l_city_code_mas'),
    --upper('l_code_map_mas'),
    --upper('l_its_book_appl_interface'),upper('l_enroll_id_mas'),
  --  upper('l_enroll_mas'),upper('l_loan_mas'),upper('l_loan_id_mas'),upper('l_loancode_mas'),
  --  upper('l_customer_tmp'),upper('l_customer_mas'),
 --   upper('l_special_cases'),
    --upper('l_ln_trx')
    )
    and (p.owner = upper('cfscountercde') or p.owner = upper(''))
    and p.grantee like '%CFSCOUNTER%';

--_tloandata_grt_
GRANT SELECT ON CFSAPVDATA.apv_bad_list_mas TO cfscountercde;
GRANT SELECT ON tloandata.cfs_ps_employee TO cfscountercde;

 select p.grantee,p.owner,p.table_name,p.privilege
    from dba_tab_privs p
    where p.table_name = upper('pkg_cfs_counter_customer');
   
--_tloancde_grt_
grant execute on tloancde.T_PACKAGE_ERROR_LOG to cfscountercde;
grant execute on tloancde.pkg_cfs_report to cfscountercde;


--i_rpy_plan_mas
--i_policy_mas
apv_bad_list_mas
cfs_ps_employee

 select p.grantee,p.owner,p.table_name,p.privilege
    from dba_tab_privs p
    where p.table_name in (
  --  upper('i_rpy_plan_mas'),
   -- upper('i_policy_mas')
   'apv_bad_list_mas'
    )
    and (p.owner = upper('tloancde') or p.owner = upper('CFSAPVDATA'))
    and p.grantee like '%CFSCOUNTER%';

;
/*22-- SQL grammer -- 取整函数ceil,floor,round,months_between --*/
SELECT ceil(months_between(DATE'2013-06-02',DATE'2013-03-20')) c, -- 向上取整
  floor(months_between(DATE'2013-06-02',DATE'2013-03-20')) f, --向下取整
  round(months_between(DATE'2013-06-02',DATE'2013-03-20')) r, --四舍五入
  months_between(DATE'2013-06-02',DATE'2013-03-20') m, -- 原值
  ceil(2.5) c1,
  floor(2.5) f1,
  round(2.5) r1,
  2.5 m1
 FROM dual;
SELECT trunc(DATE'2013-02-10','MM')-trunc(DATE'2013-10-10','MM') FROM dual;

 

/*23-- SQL grammer -- 取后三位的前两位substr('tcust_id',-3,2) --*/
SELECT substr('tcust_id',-3,2) FROM dual; -- 取后三位的前两位


/*24-- SQL grammer -- (待续) --*/

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值