Oracle经验积累

--查找数据库脚本中汉字全角字符
    SELECT * FROM ALL_SOURCE WHERE LENGTH(TEXT) != LENGTHB(TEXT) AND TEXT LIKE '%''%'--ORACLE 常用FUNTION
    ----行转列 开始----
    SELECT U_ID, WMSYS.WM_CONCAT(GOODS) GOODS_SUM   FROM SHOPPING   GROUP BY U_ID ;
    SELECT U_ID, WMSYS.WM_CONCAT(GOODS || '(' || NUM || '斤)' ) GOODS_SUM   FROM SHOPPING   GROUP BY U_ID ;
    SELECT SKUNO, ROUTEID, ROUTE
              FROM (SELECT VAR_SEARCHDATA AS SKUNO,
                           ROUTEID,
                           LISTAGG(EVENTPOINT, '->') WITHIN GROUP(ORDER BY ROUTEID, EVENTSEQNO) AS ROUTE
                      FROM SFCROUTEDEFB
                     WHERE ROUTEID IN (SELECT SFCROUTE
                                         FROM SFCCODELIKE
                                        WHERE SKUNO = VAR_SEARCHDATA)
                     GROUP BY ROUTEID)
             WHERE ROWNUM BETWEEN TO_NUMBER(VAR_STARTINDEX) AND
                   TO_NUMBER(VAR_ENDINDEX);
    ----行转列 结束----
    LEFT(ARG,LENGTH)、RIGHT(ARG,LENGTH) --LEFT、RIGHT函数返回ARG最左边、右边的LENGTH个字符串,ARG可以是CHAR或BINARY STRING。
    INSTR('源字符串' , '目标字符串' ,'开始位置(缺省默认为 1)','第几次出现(缺省默认为 1)'--查找字符串中是否存在某一字符,存在就返回位置的索引,不存在则返回0 。
    NVL(EXPR1,EXPR2);     --判断字符串是否为空,如果为空,返回指定值,不为空直接返回;如果EXPR1为NULL,返回EXPR2的值,否则返回EXPR1的值 
    LOWER(CHAR);          --把字符串转换为小写格式;  
    UPPER(CHAR);          --把字符串转换为大写格式;
    LENGTH(CHAR) ;        --返回字符串的字符个数 (每个中文占一个1个字符);
    LENGTHB(CHAR);        --返回字符串的字节个数 (每个中文占一个2个字节);  
    SUBSTR(CHAR,M,N);     --截取字符串的字串;
    REPLACE(CHAR,SEARCH_CHAR,REPLACE_STR);--把字符串中的某个字符替换为指定的字符;
    TO_NUMBER(CHAR)--将字符串转换为NUMBER
-----ORACEL 数学FUNCTION------
    ROUND(N,[M])--四舍五入,省略M则四舍五入到整数位,M为小数点的位数;
    TRUNC(N,[M])--保留小数位,M为小数位的个数;  (截取日期或数字)
    MOD(N,M)    --取余;
    FLOOR(N)    --返回小于等于N的最大整数;
    CEIL(N)     --返回大于等于N的最小整数;
    ABS(N)      --返回数字N的绝对值。 
-----ORACEL 数学FUNCTION-----
  
-----ORACEL 时间FUNCTION-----
    SYSDATE--该函数返回系统时间,精确到秒。
    SYSTIMESTAMP--系统时间,精确到微妙。
    ADD_MONTHS(DATE,N)--某一时间过了N个月后的时间,返回时间。
    LAST_DAY(D)--返回当前日期该月的最后一天。
    NEXT_DAY(SYSDATE,N)--当前时间的下N天,N必须为大于或等于1的正数。
    TO_TIMESTAMP(TIMESTAMP_VARCHAR)--将时间戳字符转换为时间戳(TIMESTAMP)数据格式。
    TO_DATE('2017-10-13','YYYY-MM-DD')--字符串转为日期格式(DATE);
-----ORACEL 时间FUNCTION-----
 
-----ORACLE中日期和字符串互相转换  ----- 
    TO_CHAR()--把数据转换为字符串类型:TO_CHAR(字符串,类型);
    --1.日期转换
    SELECT TO_CHAR(SYSDATE,'YYYY/MM/DD HH24:MI:SS') FROM DUAL;
    --2.显示1980年入职的员工信息
    SELECT * FROM EMP WHERE TO_CHAR(EMP.HIREDATE,'YYYY')=1980;
-----ORACLE中日期和字符串互相转换  -----
      
----- ORACLE中的系统函数:SYS_CONTEXT();   -----
    --1) TERMINAL 当前会话客户所对应的终端标识符
    SELECT SYS_CONTEXT('USERENV','TERMINAL') FROM DUAL;
    --2) LANGUAGE 语言
    SELECT SYS_CONTEXT('USERENV','LANGUAGE') FROM DUAL;
    --3)DB_NAME 当前的数据库实例名称
     SELECT SYS_CONTEXT('USERENV','DB_NAME') FROM DUAL;
    --4)SESSION_USER 当前会话所对应的数据库
    SELECT SYS_CONTEXT('USERENV','SESSION_USER') FROM DUAL;
    --5)CURRENT_SCHEMA:查看当前方案
    SELECT SYS_CONTEXT('USERENV','CURRENT_SCHEMA') FROM DUAL;
----- ORACLE中的系统函数:SYS_CONTEXT();   -----
  
----- ORACLE部分函数 -----
     CAST(VALUE AS DATA_TYPE)--数据类型转换,【VALUE】为需要转换的值,【DATA_TYPE】为需要转换的数据类型(如:VARCHAR(20) , NUMBER ,  DECIMAL)。
     DECODE(条件,值1,返回值1,值2,返回值2,...值N,返回值N,缺省值)
     --当(条件)的值等于(值1),则返回(返回值1);等于(值2),则返回(返回值2);等于(值N),则返回(返回值N);如都不相等,则返回(缺省值)。与(CASE WHEN THEN END)的用法相似。
     SIGN(NUMBER)--NUMBER 是0、正数还是负数,分别返回0、1、-1
     SELECT LPAD('123',5,'T')  FROM DUAL      --返回(TT123),左填充
     SELECT RPAD('123',5,'@')  FROM DUAL      --返回(123@@),右填充
     CONVERT (CHAR,CHAR_SET,[SOURCE_CHAR_SET])--ORACLE中字符集转换。
    --【CHAR】参数是要转换的值。它可以是任何的数据类型CHAR , VARCHAR2 , NCHAR , NVARCHAR2 ,CLOB或NCLOB 。  
    --【CHAR_SET】参数是【CHAR】转换的字符集的名称。
    --【SOURCE_CHAR_SET】参数是【CHAR】存储在数据库中的字符集名称,默认是数据库的字符集,可缺省。

    -- ORACLE常用字符集: UTF8 ,  ZHS16GBK ,  US7ASCII   ……
     ASCIISTR(CHAR)-- 用于返回字符的ASCII形式的字符串 ;
     ASCII(CHAR)-- 返回单个字符的ASCII 值 ; 
----- ORACLE函数 -----
 
-----ORACEL 数据表的部分操作 ----- 2018-02-27
    ALTER TABLE TABLENAME RENAME COLUMN OLDCNAME TO NEWCNAME;-- 修改字段名
    ALTER TABLE TABLENAME MODIFY (CLOUMNNAME 数据类型);       -- 修改数据类型
-----ORACEL 数据表的部分操作-----
 
-----ORACEL 存储过程规范和注意事项-----
    --1.每一句SQL必须以分号 【;】结束。
    --2.变量声明无需关键词【DECLARE】和标识【@】(与SQL SERVER 不同)。
    --3.变量赋值  VARIABLE :=  'HELLO'   , 赋值标识符【:=】(与SQL SERVER 需标识SET 关键词 不同)。
    --4.BEGIN END 只需在存储过程正文前后标识,其他分支可不标识 (与SQL SERVER 每段分支都必须标识 不同)。
    --5.  VARIABLE := 'HELLO' || 'WORLD'     字符串拼接,关键字符【||】。
    --6.  判断两个数值是否相等,关键字符【=】 (与SQL SERVER 使用两个等号 == 不同)
        IF  A = B THEN
        END IF      
    --7. IF 语句格式
        IF VARIABLE1 >= 10 AND VARIABLE1 < 50
            THEN
                VARIABLE2 := VARIABLE1 + VARIABLE2;
                VARIABLE3 := 'OK';
            ELSE
                VARIABLE2 := VARIABLE1 - VARIABLE2;
                VARIABLE3 := 'FAIL';
        END IF; 
    --8. 文本输出,【VAR_MSG】为需要输出的文本。
        DBMS_OUTPUT.PUT_LINE(VAR_MSG); 
    --9. LOOP 循环
        DECLARE VAR_COUNT INT;  VAR_COUNTER INT;
        BEGIN
        VAR_COUNT := 100 ;
        VAR_COUNTER :=0;
        LOOP
            VAR_COUNT := VAR_COUNT - 1 ;
            VAR_COUNTER := VAR_COUNTER + 1;
            DBMS_OUTPUT.PUT_LINE(TO_CHAR( SYSTIMESTAMP,'YYYY-MM-DD HH24:MI:SS:FF') || '   ' || VAR_COUNTER);
            EXIT WHEN VAR_COUNT < 1;        ---- 跳出循环,关键词【EXIT WHEN】
        END LOOP;
        END;
    --10. WHILE 循环
        WHILE 条件语句 LOOP
        BEGIN
        END;
        END LOOP;
    --11. FOR 循环 , 如下CASE 为循环遍历游标
        FOR ITEM IN CURSOR LOOP
            BEGIN
                DBMS_OUTPUT.PUT_LINE(ITEM); 
            END;
        END LOOP;
    --12. 把查找的结果【COLUMNNAME】赋值给变量【VARIABLE】。
        SELECT  COLUMNNAME INTO VARIABLE FROM TABLENAME WHERE ROWNUM = 0 
    --13. GOTO 使用 , 跳转位置的字符需用【<<>>】标注起来。
        GOTO EXITTAG
        <<EXITTAG>>     
    --14.删除存储过程  
        DROP PROCEDURE MES1.WMS_MATERIELALLOT_SP 
    --15.  TOAD 中SQL执行存储过程  (如下例子为执行MES转换工单的存储过程)
            DECLARE
            VAR_O_MESSAGE         VARCHAR2 (5000);
            VAR_WO_PREFIX         VARCHAR2 (100);
            VAR_LASTEDITBY        VARCHAR2 (100);
            VAR_DATA1             VARCHAR2 (100);
            VAR_DATA2             VARCHAR2 (100);
            VAR_DATA3             VARCHAR2 (100);
            VAR_DATA4             VARCHAR2 (100);
            BEGIN
                AP.R_AUTO_CONVERT_WO ( VAR_O_MESSAGE ,VAR_WO_PREFIX, VAR_LASTEDITBY , VAR_DATA1,  VAR_DATA2 , VAR_DATA3 ,VAR_DATA4 ) ;
                COMMIT ;       ---- 提交执行
            END ;
    --16. 查询存储过程的参数   (ALL_ARGUMENTS 为系统视图)
        SELECT * FROM ALL_ARGUMENTS WHERE OBJECT_NAME = 'WH_WEBUTILITY_SP' ORDER BY SEQUENCE
    --17.C#调用存储过程获取输出参数时    ,如获取到输出参数为空值,先检查定义输出参数的大小,可以尝试把参数的大小改为不大于2000,然后再进行调试。
    --当输出参数的大小定义比较小或没有定义,而存储过程输出较长字符串时,也会引发异常,如(ORA-06502: PL/SQL: 数字或值错误 :  字符串缓冲区太小)。
    --18. ORACLE 用户自定义异常处理
        DECLARE  
            V_EMPNO EMPLOYEES.EMPLOYEE_ID%TYPE :=&EMPNO;  
            VAR_ERROR  EXCEPTION;--1、定义异常 
        BEGIN  
            UPDATE EMPLOYEES SET SALARY = SALARY+100 WHERE EMPLOYEE_ID = V_EMPNO;  
            IF SQL%NOTFOUND THEN  
                RAISE VAR_ERROR;--2、抛出异常  
            END IF;  
        EXCEPTION  
            WHEN VAR_ERROR THEN--3、处理异常 
                    DBMS_OUTPUT.PUT_LINE('你的数据更新语句失败了!');  
                    ROLLBACK;
            WHEN OTHERS THEN  
                    DBMS_OUTPUT.PUT_LINE(SQLCODE||'---'||SQLERRM);  
                    ROLLBACK;-- 事物回滚
        END;     
-----ORACEL 存储过程规范和注意事项-----

----------TOAD 常用快捷键---------- 2017/11/17
    1、TOAD 如何进行表分析?
    (1)选中表名按F4,然后弹出对话框有个按钮叫ANALYZE TABLE,点击后按绿色的三角符号
    (2)进行表分析的作用是整理索引,提高执行效率
    2、TOAD中如何查看SQL的执行计划
    (1)通过TOAD中的RUN EXPLAIN PLAN FOR CURRENT STATEMENT或者通过快捷键CTRL+E来看
    3、TOAD中常用快捷键
    F4 看表的结构
    F5 执行对话框中的SQL,注意最后需要以;结尾
    F7 清除当前编辑框中所有的SQL
    F8 查看历史的SQL语句
    F9 执行当前行的SQL
    F10 看菜单
    CTRL + F12 保存SQL为文档
    CTRL +. 补全TABLE_NAME
    CTRL + T 补全TABLE_NAME,或者显示字段
    CTRL + E 查看当前SQL的执行计划
    CTRL+ENTER 直接执行当前SQL   
    CTRL+SHIFT+F 格式化SQL语句   
    ALT+箭头上下 看SQL HISTORY
    CTRL+F 查找
    CTRL+R 替换 要全部替换需要选中对话框中的ENTIRE SCOPE
    CTRL+U 将选中SQL语句全部大写
    CTRL+L 将选中SQL语句全部小写
    CTRL+B 将选中SQL语句语句注释,COMMET BLOCK
    CTRL+SHIFT+B 将选中SQL语句取消注释,UNCOMMET BLOCK
    4、如何在TOAD中设置快捷键
    VIEW -->TOAD OPTIONS --> AUTO REPLACE --> IMPORT 导入一个TEXT文件设置一批快捷键
    --文件中的内容:例如将S设置为SELECT * FROM 则 S=SELECT * FROM
    VIEW -->TOAD OPTIONS --> AUTO REPLACE --> ADD 增加一个快捷键
----------TOAD 常用快捷键-----

----------ORACLE 应知应会-----
    UNION : 获取联集数据 ; (  如: SELECT * FROM TABLE1  UNION  SELECT * FROM TABLE2  )
    MINUS :  去掉重复的数据 ;  (  如: SELECT COLUMN1 FROM TABLE1  MINUS  SELECT COLUMN2 FROM TABLE2  )
    INTERSECT : 获取交集的数据 ; (  如: SELECT * FROM TABLE1  INTERSECT  SELECT * FROM TABLE2  )
    SQLERRM(ERROR_NUMBER)     :  返回指定错误代码的错误信息。参数【ERROR_NUMBER】可选。
    SQLCODE :数据库操作的返回码,其中0--成功;-1--失败;100--未找到任何数据。
    DBMS_UTILITY.FORMAT_ERROR_BACKTRACE()   :返回错误行 (ORACLE 10G及以上版本)
    
    WINDOWS CMD  连接ORACLE 数据库 :  SQLPLUS  用户名/密码@数据库名    (如:  SQLPLUS  HETMID/HETMID@MESDBSELECT F1,F2,F3 INTO V1,V2,V3 FROM TAB1;--ORACLE  INTO 多个变量
    
    ESCAPE 'ESCAPE_CHARACTER' --允许在字符串中搜索通配符而不是将其作为通配符使用。ESCAPE_CHARACTER 是放在通配符前表示此特殊用途的字符。 
    SELECT * FROM USER WHERE NAME LIKE '%AA/%BB%' ESCAPE '/'     -- 第一个和最后一个%作为通配符,中间的%作为普通字符 。
    ESCAPE '/'     --定义[/]为转义符 。
    ESCAPE '='     --定义[=]为转义符 。
    ESCAPE ' '     --定义空格为转义符 。
    --P.S:第一个和最后一个%作为通配符,中间的%作为普通字符。
    
    SELECT * FROM DBA_TAB_PRIVS   WHERE  TABLE_NAME = 'C_STATION_RULE' AND GRANTEE = 'HETUSER'    -- 查看用户:HETUSER  在表:C_STATION_RULE  中的操作权限
    SELECT * FROM DBA_OBJECTS WHERE OBJECT_NAME = 'EUSER'  -- 查询一个对象的基本信息,如查表:EUSER 的基本信息
    
    --DUAL : ORACLE提供的最小的工作表,只有一行一列,具有某些特殊功用 。(俗称:傀儡表)
    SELECT TO_CHAR(SYSDATE,'YYYY-MM-DD HH24:MI:SS') FROM DUAL;-- 获得当前系统时间
    SELECT SYS_CONTEXT('USERENV','TERMINAL') FROM DUAL;       -- 获得主机名
    SELECT SYS_CONTEXT('USERENV','LANGUAGE') FROM DUAL;       -- 获得当前LOCALE
    SELECT DBMS_RANDOM.RANDOM FROM DUAL;  -- 获得一个随机数
    
    --复制表或数据 
    CREATE TABLE TABLE_NAME_NEW AS SELECT * FROM TABLE_NAME_OLD ;            --复制表结构及其数据 
    CREATE TABLE TABLE_NAME_NEW AS SELECT * FROM TABLE_NAME_OLD WHERE 1=2 ;  --只复制表结构   
    INSERT INTO TABLE_NAME_NEW SELECT * FROM TABLE_NAME_OLD ;                --只复制表数据,如果两个表结构一样    
    INSERT INTO TABLE_NAME_NEW(COLUMN1,COLUMN2...) SELECT COLUMN1,COLUMN2... FROM TABLE_NAME_OLD ;--只复制表数据,如果两个表结构不一样 
 ----------ORACLE 应知应会-----

SELECT COUNT (*)  FROM MFWORKSTATUS @MESDB     ---- ORACLE DB LINK 使用  (【@MESDB】 为DB LINK)
1】DBA_开头.....
DBA_USERS           数据库用户信息
DBA_SEGMENTS        表段信息
DBA_EXTENTS         数据区信息
DBA_OBJECTS         数据库对象信息
DBA_TABLESPACES     数据库表空间信息
DBA_DATA_FILES      数据文件设置信息
DBA_TEMP_FILES      临时数据文件信息
DBA_ROLLBACK_SEGS   回滚段信息
DBA_TS_QUOTAS       用户表空间配额信息
DBA_FREE_SPACE      数据库空闲空间信息
DBA_PROFILES        数据库用户资源限制信息
DBA_SYS_PRIVS       用户的系统权限信息
DBA_TAB_PRIVS       用户具有的对象权限信息
DBA_COL_PRIVS       用户具有的列对象权限信息
DBA_ROLE_PRIVS      用户具有的角色信息
DBA_AUDIT_TRAIL     审计跟踪记录信息
DBA_STMT_AUDIT_OPTS 审计设置信息
DBA_AUDIT_OBJECT    对象审计结果信息
DBA_AUDIT_SESSION   会话审计结果信息
DBA_INDEXES         用户模式的索引信息
DBA_DB_LINKS        DB LINK
DBA_SOURCE          存储过程、函数、包等对象的SQL语句。

【2】USER_开头
USER_OBJECTS        用户对象信息
USER_SOURCE         数据库用户的所有资源对象信息
USER_SEGMENTS       用户的表段信息
USER_TABLES         用户的表对象信息
USER_TAB_COLUMNS    用户的表列信息
USER_CONSTRAINTS    用户的对象约束信息
USER_SYS_PRIVS      当前用户的系统权限信息
USER_TAB_PRIVS      当前用户的对象权限信息
USER_COL_PRIVS      当前用户的表列权限信息
USER_ROLE_PRIVS     当前用户的角色权限信息
USER_INDEXES        用户的索引信息
USER_IND_COLUMNS    用户的索引对应的表列信息
USER_CONS_COLUMNS   用户的约束对应的表列信息
USER_CLUSTERS       用户的所有簇信息
USER_CLU_COLUMNS    用户的簇所包含的内容信息
USER_CLUSTER_HASH_EXPRESSIONS 散列簇的信息
USER_JOBS           JOB 信息

【3】V$开头
V$DATABASE        数据库信息
V$DATAFILE        数据文件信息
V$CONTROLFILE     控制文件信息
V$LOGFILE         重做日志信息
V$INSTANCE        数据库实例信息
V$LOG             日志组信息
V$LOGHIST         日志历史信息
V$SGA             数据库SGA信息
V$PARAMETER       初始化参数信息
V$PROCESS         数据库服务器进程信息
V$BGPROCESS       数据库后台进程信息
V$CONTROLFILE_RECORD_SECTION 控制文件记载的各部分信息
V$THREAD             线程信息
V$DATAFILE_HEADER    数据文件头所记载的信息
V$ARCHIVED_LOG       归档日志信息
V$ARCHIVE_DEST       归档日志的设置信息
V$LOGMNR_CONTENTS    归档日志分析的DML DDL结果信息
V$LOGMNR_DICTIONARY  日志分析的字典文件信息
V$LOGMNR_LOGS      日志分析的日志列表信息
V$TABLESPACE       表空间信息
V$TEMPFILE         临时文件信息
V$FILESTAT         数据文件的I/O统计信息
V$UNDOSTAT         UNDO数据信息
V$ROLLNAME         在线回滚段信息
V$SESSION          会话信息
V$TRANSACTION      事务信息
V$ROLLSTAT         回滚段统计信息
V$PWFILE_USERS     特权用户信息
V$SQLAREA          当前查询过的SQL语句访问过的资源及相关的信息
V$SQL              与V$SQLAREA基本相同的相关信息
V$SYSSTAT          数据库系统状态信息

【4】ALL_开头
ALL_USERS            数据库所有用户的信息
ALL_OBJECTS          数据库所有的对象的信息
ALL_DEF_AUDIT_OPTS   所有默认的审计设置信息
ALL_TABLES           所有的表对象信息
ALL_INDEXES          所有的数据库对象索引的信息
ALL_DB_LINKS         所有的DB LINK
ALL_SOURCE           存储过程的SQL语句
ALL_ARGUMENTS        查询存储过程的参数  

【5】SESSION_开头
SESSION_ROLES    会话的角色信息
SESSION_PRIVS    会话的权限信息

【6】INDEX_开头
INDEX_STATS      索引的设置和存储信息

【7】伪表
DUAL    系统伪列表信息

【8】SYSTEM_ 开头
SELECT * FROM SYSTEM_PRIVILEGE_MAP WHERE NAME LIKE '%PROCEDURE%';    -- 查询关于存储过程的系统权限
  
-----ORACLE 常用数据类型-----
CHAR        --固定长度字符串 最大长度2000 BYTES    
VARCHAR2    --可变长度的字符串 最大长度4000 BYTES  可做索引的最大长度749 
NCHAR       --根据字符集而定的固定长度字符串 最大长度2000 BYTES    
NVARCHAR2   --根据字符集而定的可变长度字符串 最大长度4000 BYTES    
DATE --日期(日-月-年) DD-MM-YY(HH-MI-SS) 经过严格测试,无千虫问题 
TIMESTAMP   --日期时间,精确到微妙。
LONG        --超长字符串 最大长度2G(231-1) 足够存储大部头著作 
RAW         --固定长度的二进制数据 最大长度2000 BYTES  可存放多媒体图象声音等 
LONG RAW    --可变长度的二进制数据 最大长度2G 同上 
BLOB     --二进制数据 最大长度4G   
CLOB     --字符数据 最大长度4G   
NCLOB    --根据字符集而定的字符数据 最大长度4G   
BFILE    --存放在数据库外的二进制数据 最大长度4G   
ROWID    --数据表中记录的唯一行号 10 BYTES ********.****.****格式,*为0或1 
NROWID   --二进制数据表中记录的唯一行号 最大长度4000 BYTES 
NUMBER(P,S)   --数字类型 P为整数位,S为小数位 
DECIMAL(P,S)  --数字类型 P为整数位,S为小数位 
INTEGER   --整数类型 小的整数 
FLOAT     --浮点数类型 NUMBER(38),双精度 
REAL      --实数类型 NUMBER(63),精度更高
-----ORACLE 常用数据类型-----
  
-----ORACLE 查看被锁的表和解锁---------- 2018-04-28
--以下几个为相关表
SELECT * FROM V$LOCK;
SELECT * FROM V$SQLAREA;
SELECT * FROM V$SESSION;
SELECT * FROM V$PROCESS ;
SELECT * FROM V$LOCKED_OBJECT;
SELECT * FROM ALL_OBJECTS;
SELECT * FROM V$SESSION_WAIT;

--查看被锁的表 
SELECT B.OWNER,B.OBJECT_NAME,A.SESSION_ID,A.LOCKED_MODE FROM V$LOCKED_OBJECT A,DBA_OBJECTS B WHERE B.OBJECT_ID = A.OBJECT_ID;
--查看那个用户那个进程照成死锁
SELECT B.USERNAME,B.SID,B.SERIAL#,LOGON_TIME FROM V$LOCKED_OBJECT A,V$SESSION B WHERE A.SESSION_ID = B.SID ORDER BY B.LOGON_TIME;
--查看连接的进程 
SELECT SID, SERIAL#, USERNAME, OSUSER FROM V$SESSION;
--3.查出锁定表的SID, SERIAL#,OS_USER_NAME, MACHINE_NAME, TERMINAL,锁的TYPE,MODE
SELECT S.SID, S.SERIAL#, S.USERNAME, S.SCHEMANAME, S.OSUSER, S.PROCESS, S.MACHINE,
S.TERMINAL, S.LOGON_TIME, L.TYPE
FROM V$SESSION S, V$LOCK L
WHERE S.SID = L.SID
AND S.USERNAME IS NOT NULL
ORDER BY SID;
--这个语句将查找到数据库中所有的DML语句产生的锁,还可以发现,任何DML语句其实产生了两个锁,一个是表锁,一个是行锁。

--杀掉进程 SID,SERIAL#
ALTER SYSTEM KILL SESSION'210,11562';
-----ORACLE 查看被锁的表和解锁-----
  
-----ORACLE 性能检测---------- 2018-04-28
--1. 查询性能最低的十条SQL
SELECT * FROM (SELECT PARSING_USER_ID,EXECUTIONS,SORTS,COMMAND_TYPE,DISK_READS,SQL_TEXT FROM V$SQLAREA  
ORDER BY DISK_READS DESC )WHERE ROWNUM<10 ;  
-----ORACLE 性能检测---------- 
    
-----EXECUTE IMMEDIATE 的简单用法---------- 2018-05-03
CREATE OR REPLACE PROCEDURE PROC_TEST(
--参数区域
)
IS 
--变量区域
    --SQL脚本
    V_SQL VARCHAR2(2000) :='';
    --记录学生数量
    V_NUM NUMBER;
BEGIN
--执行区域
    -- EXECUTE IMMEDIATE用法1:立刻执行SQL语句
    V_SQL := 'CREATE OR REPLACE VIEW MYVIEW AS SELECT ID,NAME FROM STUDENT';
    EXECUTE IMMEDIATE V_SQL;
    
    --- EXECUTE IMMEDIATE用法2:立刻执行SQL语句,并赋值给某个变量
    V_SQL := 'SELECT COUNT(1) FROM STUDENT';
    EXECUTE IMMEDIATE V_SQL INTO V_NUM;
    
    -- EXECUTE IMMEDIATE用法3:带参数的SQL
    V_SQL:='SELECT * FROM STUDENT T WHERE T.NAME=:1 AND T.AGE=:2'; 
    EXECUTE IMMEDIATE V_SQL USING 'ZHANGSAN',23;
    
END PROC_TEST;
  
 ----------EXECUTE IMMEDIATE 的简单用法-----
    
 
 

 

转载于:https://www.cnblogs.com/turnip/p/10670236.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值