ORACLE删除表锁的方法

数据库中容易引起死锁的问题很多,其中一个就是使用子查询删除数据的时候很容易引起,尽量避免通过子查询来删除数据,当存在锁的时候表基本上查询不了数据或者程序会发生nowait的异常提示,清除数据锁的方法如下:

declare cursor mycur is

select b.sid,b.serial#
from v$locked_object a,v$session b
where a.session_id = b.sid group by b.sid,b.serial#;
   
begin
for cur in mycur
loop
execute immediate ( 'alter system kill session '''||cur.sid || ','|| cur.SERIAL# ||''' ');
end loop;
end;

执行上面的sql后数据库中的所有锁全部清除。

ORACLE ORA-28545: 连接代理时 Net8 诊断到错误 解决办法

oralce透明网关很好很强大,可以把多种数据库当成一个数据库来使用,比如在你的oracle数据库里面想和db2里面的数据一起使用,通过透明网关就可以将db2连接到oracle中,具体怎么配置可以参见官网文档,这里记录一下一个错误的处理办法

ORA-28545: 连接代理时 Net8 诊断到错误
Unable to retrieve text of NETWORK/NCR message 65535
ORA-02063: 紧接着 2 lines (起自 )

在有所配置检查都正确的情况下,实在找不错错误的原因,归根结底还是网络的问题,看tnsping你的服务是否可以行

然后查看文件network/admin/sqlnet.ora中配置成如下

NAMES.DIRECTORY_PATH= (TNSNAMES, EZCONNECT)

SQLNET.AUTHENTICATION_SERVICES=(NONE)

这样重启监听 lsnrctl stop/start,透明网关运行正常。

ORACLE监听日志过大导致无法连接的问题

最近公司windows服务器上的oracle突然无法连接了,分成的奇怪,数据实例照常启动没有什么问题,监听在服务面板也能正常启动,貌似都没看到什么异常。

经过各种途径分析始终发现不了什么问题,后来使用命令行来启动监听发现启动非常之慢,lsnrctl start /stop.

后来想看看监听的日志,于是在oracle的bin目录下执行命令adrci.exe,然后执行命令show alert,看到日志路径如下

diag\tnslsnr\win-1stle0m8d7m\listener

这是oracle安装路径里面的路径,找到这个路径看里面的日志文件,发现listener\trace\listener.log这个文件超级巨大达到4g

于是将监听器关闭之后删除该文件,然后重启监听器一切恢复正常。

ORACLE存储过程中使用游标

游标的使用方式相当之多,可以作为参数返回,也可以在存储过程内部使用当做局部的变量,存储过程里面使用的时候也是多种多样,这里记录一下最简单的一种使用方式,如下所示:

    DECLARE
  	      --类型定义
        CURSOR C_CUST_INFO IS
            SELECT  
            A.BUREAU_NO,
            B.YHBH AS YHBH,
            B.YHMC AS YHMC,
            B.YDDZ AS YDDZ,
            B.CBQDBH AS CBQDBH,
            B.YHMC AS YHMC2,
            B.LXDH AS LXDH
            FROM YX_READING_TASK A , YX_READING_TASK_DATA B 
            WHERE A.TASKID = B.TASKID 
            ORDER BY B.YHBH;
        --定义一个游标变量
        C_ROW C_CUST_INFO%ROWTYPE;
        --V_CUST_ID VARCHAR2(32);
    BEGIN
        FOR C_ROW IN C_CUST_INFO LOOP
            
            INSERT INTO CUST_INFO
            (
              BUREAU_NO,
              CUST_ID,
              CUST_NAME,
              CUST_ADDR,POWERZONE,LINK_MAN,LINK_PHONE
            )VALUES(
              C_ROW.BUREAU_NO,
              C_ROW.YHBH,
              C_ROW.YHMC,
              C_ROW.YDDZ,
              C_ROW.CBQDBH,
              C_ROW.YHMC2,
              C_ROW.LXDH
            );
            
            --V_CUST_ID := C_ROW.YHBH;
            
        END LOOP;
    END;

注意游标的select语句里面不能有相同列名,要不然会报错,可以用别名来处理相同列名。在declare块里面可以定义很多变量,然后在loop里面可以使用,这样就能够处理很多复杂的业务逻辑了。