Your SlideShare is downloading. ×
企业常用Sql
Upcoming SlideShare
Loading in...5
×

Thanks for flagging this SlideShare!

Oops! An error has occurred.

×

Saving this for later?

Get the SlideShare app to save on your phone or tablet. Read anywhere, anytime - even offline.

Text the download link to your phone

Standard text messaging rates apply

企业常用Sql

102
views

Published on

sql

sql

Published in: Technology

0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total Views
102
On Slideshare
0
From Embeds
0
Number of Embeds
0
Actions
Shares
0
Downloads
0
Comments
0
Likes
0
Embeds 0
No embeds

Report content
Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
No notes for slide

Transcript

  • 1. SQL FAQPCCW 企业解决方案 CMCC ERP Project
  • 2. [ Q ] 怎样查询数据中包含特殊字符的数据,例如: % _[ A ] 使用关键字 “ E s c a p e ”例如:SELECT * FROM Mtl_System_Items_B WHERE DESCRIPTION LIKE Cr_% ESCAPE ‘其结果为查询 D E S C RIP TIO N 字段中以 C r_ 开头的数 据,其中字符 “ ” 因为在 E S C A P E 中定义,则在 L IKE 条件中其 后边的字符 “ _”则不作为通配符使用,而是作为一个基本的字符。
  • 3. [ Q ] 怎样将如 “ ” 、 “ &” 等字符插入到数据库中[ A ] 使用函数 C hr 处理例如:INSERT INTO Tab(a) VALUE (A|| Chr(38)||B)其中 C hr( 38) 表示字符 “ &” , C hr( 39) 表示字符 “ ”其它字符对应 A S C II 码请参照 A S C II 码表
  • 4. ASCII 码表
  • 5. [ Q ] 进制转换[ A ] 8I 以上版本可以使用 to _C ha r 、 to _Numb e r 函数例如:SELECT to_Char(155,XX),to_Number(AA,XX) FROM Dual注意: X 的数量不能少于 16 进制数的位数
  • 6. 进制转换函数 十进制转换六十二以内的进制 FUNCTION Get_nJz(v_Num NUMBER, v_Jz NUMBER) RETURN VARCHAR2 IS v_Sang_Num NUMBER; v_Yu_NUm NUMBER; v_Ch VARCHAR2(66) := 0123456789ABCDEFGHIJKLMNOPQRSTU ||VWXYZabcdefghijklmnopqrstuvwxyz; v_Ch1 VARCHAR2(1000); BEGIN IF v_Jz < 2 OR v_Jz > 62 THEN RETURN -1; END IF; v_Sang_Num := Abs(v_Num); LOOP v_Yu_NUm := MOD(v_Sang_Num, v_Jz); v_Ch1 := SUBSTR(v_Ch, v_Yu_NUm + 1, 1) || v_Ch1; v_Sang_Num := TRUNC(v_Sang_Num / v_Jz); EXIT WHEN v_Sang_Num = 0; END LOOP; IF v_Num < 0 THEN v_Ch1 := -||v_Ch1; END IF; RETURN v_Ch1; END;
  • 7. [ Q ] 怎样删除重复记录[ A ] 根据 Ro wID 进行删除例如:DELETE Tab A WHERE A.ROWID <> (SELECT MAX(ROWID) FROM Tab B WHERE A.Col = B.Col)
  • 8. [ Q ] 怎样设置自治事务处理[ A ] 使用 PRAGMA AUTONOMOUS_TRANSACTION;例如:FUNCTION Get_SerialNo(i_SerialType NUMBER) RETURN VARCHAR2 IS PRAGMA AUTONOMOUS_TRANSACTION;BEGIN ......END;自治事务处理的作用是其它程序调用该过程的时候,本 过程的事务(提交或回滚)不影响调用它的程序中的事务 。
  • 9. [ Q ] 怎样创建临时表[ A] 8I 以上版本中CREATE GLOBAL TEMPORARY tablename(COLUMN LIST)ON COMMIT PRESERVE[DELETE] ROWS;PRESERVE : 会话临时表 数据在整个会话中存在DELETE : 事务临时表 当发生事务时删除数据O ra c le 中的临时表是在程序实现前定义,每一个会话 维护的数据只对该会话可见。
  • 10. [ Q ] 怎样加密程序[ A ] 使用 Wra p 命令例如:Wrap iname= 脚本 .sql其结果会输出一个文件:脚本 . p lb ,执行脚本 . p lb 就 可以创建加密了的程序(过程、函数、包等)。
  • 11. [ Q ] 怎样实现不存在就插入、存在就更新(一条 S Q L 语句)[ A ] 使用关键字 “ Me rg e ” , 9I 及以上版本例如:ME RG E INTO Ta b bU S ING ( S E L E C T P k_C o l, C o l1, C o l2, C o l3 F RO M Ta b 1) a O N ( a . P k_C o l = b . P k_C o l) WHE N MA TC HE D THE N U P D A TE S E T b . C o l1 = a . C o l1, b . C o l2 = a . C o l2, b . C o l3 = a . C o l3WHE N NO T MA TC HE D THE N INS E RT ( P k_C o l, C o l1, C o l2, C o l3) VA L UE S ( a . P k_C o l, a . C o l1, a . C o l2, a . C o l3)
  • 12. [ Q ] 怎样实现一条记录根据条件多表插入[ A ] 使用 Ins e rt A ll , 9I 及以上版本例如:INSERT ALL WHEN (Id = 1) THEN INTO Tab1(Id, NAME) VALUES (Id, NAME) WHEN (Id = 2) THEN INTO Tab2(Id, NAME) VALUES (Id, NAME) ELSE INTO Tab3(Id, NAME) VALUES (Id, NAME) SELECT Id, NAME FROM Tab如果没有 Whe n 条件,则表示每个表都插入。
  • 13. [ Q ] 怎样构造 30 天的日期[ A ] 使用伪表 D ua l ,同时使用 C o nne c t B y例如:SELECT Trunc(SYSDATE)+(LEVEL-1) AS Dat FROM Dual CONNECT BY LEVEL <= 30Level 在 Connect By 语句中表示层次
  • 14. [ Q ] 怎样一次更新多行多列[ A]例如:UPDATE Tab1 a SET (Col1,Col2) = (SELECT Col1,Col2 FROM Tab2 b WHERE a.Col = B.Col) WHERE .......其中需要更新的记录( Ta b 1 表中)对应用来更新的记 录( Ta b 2 表中)必须只有一条或者没有,即就是说: Ta b 1. C o l
  • 15. [ Q ] 怎样动态执行带输入、输出参数的S Q L 语句[ A ] 8I 以上版本使用 EXECUTE IMMEDIATE例如:DECLARE v_Input NUMBER := Trunc(Dbms_Random.VALUE(1,100)); v_Out VARCHAR2(30); v_Sql VARCHAR2(100);BEGIN v_Sql := SELECT to_Char(sysdate + :a’ ||’,YYYY-MM-DD) FROM DUAL; EXECUTE IMMEDIATE v_Sql INTO v_Out USING v_Input; Dbms_Output.Put_Line(Input=||v_Input); Dbms_Output.Put_Line(Out=||v_Out);END;
  • 16. [ Q ] 怎样连接查询中具有层次关系的数据[ A ] 使用函数 “ SYS_CONNECT_BY_PATH”例如:SELECT MenuID,SYS_CONNECT_BY_PATH(MenuName, /) FPath FROM t_Pub_Menu WHERE FunMenuFlag = 0CONNECT BY PRIOR MenuID = SuperID START WITH SuperID = ROOT‘上边查询中的每一条菜单数据都将他们的菜单名跟上层 (以及上层的上层)的菜单名称通过符号 ’ /’ 连接起来。格式如下:首层菜单 /1 层菜单 /2 成菜单 /…
  • 17. [ Q ] 怎样实现字符串拆分,类似 J a va 中的 S p lit 函数[ A ] 自定义 P ip e 函数,如:CREATE OR REPLACE TYPE ArrNum AS TABLE OF NUMBER;CREATE OR REPLACE FUNCTION SplitNum( i_Nums VARCHAR2, i_Flag VARCHAR2) RETURN ArrNum PIPELINED AS v_Nums VARCHAR2(4000); v_Instr PLS_INTEGER; v_Sigle NUMBER;BEGIN v_Nums := i_Nums; LOOP v_Instr := Instr(v_Nums,i_Flag); IF v_Instr > 0 THEN v_Sigle := to_Number(Substr(v_Nums,1,v_Instr - 1)); v_Nums := Substr(v_Nums,v_Instr + 1); ELSE v_Sigle := to_Number(v_Nums); v_Nums := NULL; END IF; PIPE ROW(v_Sigle); EXIT WHEN v_Nums IS NULL; END LOOP RETURN;END;
  • 18. [ Q ] 怎样利用游标更新数据[ A]例如:DECLARE CURSOR c IS SELECT * FROM Tab WHERE ... FOR UPDATE [OF Column_List];BEGIN FOR rec IN c LOOP ... UPDATE Tab SET ... WHERE CURRENT OF rec; ... END LOOP;END;