精华内容
下载资源
问答
  • 案例虽然简单,但是基本的分析方法和推导过程还是一致的,我主要想讲的是原始需求是怎么通过层层分析和推导而形成最后可执行代码的,限于自己的个人能力,如果有谬论和错误之处,还望同行多指教和帮助,共同进步。...
  • 面向对象案例.zip

    2020-03-30 19:17:30
    python的pickle实战代码 pickle模块实现了用于序列化和反序列化Python对象结构的二进制协议。 “Pickling”是将Python对象层次结构转换为字节流的过程, ...pickle模块对于错误或恶意构造的数据是不安全的。
  • Oracle数据泵(Data Dump)使用过程当中经常会遇到一些奇奇怪怪的错误案例,下面总结一些自己使用数据泵(Data Dump)过程当中遇到的问题以及解决方法。都是在使用过程中遇到的问题,以后陆续遇到数据泵(Data Dump)的...
  • 类与对象案例-童年回忆之打字游戏一、玩家类二、等级类三、游戏类四、等级地图五、测试类 这次要做的案例是一个打字游戏的案例,相信大家小时候都玩过金山打字通的警察抓小偷和飞机大战,这次的案例是类似的简易版。...


    这次要做的案例是一个打字游戏的案例,相信大家小时候都玩过金山打字通的警察抓小偷和飞机大战,这次的案例是类似的简易版。
    首先对于这个案例,我们要解决的是如何生成随机的字符串,如何判断生成的字符串和输入的字符串是否相等。

    一、玩家类

    package com.yc.oop6.hc0705;
    
    public class Player {
    	private int score;			//积分
    	private long startTime;		//各级别的开始时间
    	private long dis;           //每次闯关剩余时间
    	private int levelNo;		//级别号码
    	public int getScore() {
    		return score;
    	}
    	public void setScore(int score) {
    		this.score = score;
    	}
    	public long getStartTime() {
    		return startTime;
    	}
    	public void setStartTime(long startTime) {
    		this.startTime = startTime;
    	}
    	public int getLevelNo() {
    		return levelNo;
    	}
    	public void setLevelNo(int levelNo) {
    		this.levelNo = levelNo;
    	}
    	public Player(int score, long startTime, int levelNo) {
    		super();
    		this.score = score;
    		this.startTime = startTime;
    		this.levelNo = levelNo;
    	}
    	public Player() {
    		super();
    	}
    	public long getDis() {
    		return dis;
    	}
    	public void setDis(long dis) {
    		this.dis = dis;
    	}
    	
    	
    }
    
    

    二、等级类

    package com.yc.oop6.hc0705;
    
    public class Level {
    	private int levelNo;		//第几关
    	private int strLength;		//字符串长度
    	private int strTime;		//需要输入的次数
    	private int timeLimit;		//时间限制
    	private int score;			//答对一次获得的积分
    	public int getLevelNo() {
    		return levelNo;
    	}
    	public int getStrLength() {
    		return strLength;
    	}
    	public int getStrTime() {
    		return strTime;
    	}
    	public int getTimeLimit() {
    		return timeLimit;
    	}
    	public int getScore() {
    		return score;
    	}
    	public Level(int levelNo, int strLength, int strTime, int timeLimit, int score) {
    		super();
    		this.levelNo = levelNo;
    		this.strLength = strLength;
    		this.strTime = strTime;
    		this.timeLimit = timeLimit;
    		this.score = score;
    	}
    	public Level() {
    		super();
    	}
    	
    }
    
    

    三、游戏类

    package com.yc.oop6.hc0705;
    
    import java.util.Random;
    import java.util.Scanner;
    
    public class Game {
    	private Player player;
    	private Random r = new Random();
    	private Scanner  sc = new Scanner(System.in) ;
    	
    	public Game(Player player) {
    		this.player = player;
    	}
    	
    	//开始游戏
    	public void startGame() {
    		System.out.println("游戏开始");
    		
    		//开始闯关
    		for(int i = 0; i < Levels.ls.length; i++) {
    			System.out.println("开始进入第" + (i+1)  + "关");
    			//每一关的开始在这里
    			player.setLevelNo(player.getLevelNo() + 1);
    			player.setStartTime(System.currentTimeMillis());
    			
    			//循环,这一关要输入多少次
    			
    			for(int j = 0 ; j < Levels.ls[player.getLevelNo() - 1].getStrTime() ; j++ ) {
    				String out = printStr();
    				System.out.println(out);
    				String in = sc.nextLine();
    				
    				boolean flag = result(in, out);
    				if(flag == false) {
    					System.exit(1);;
    				}
    				
    			}
    			//每剩下1s 增加20分
    			player.setScore(player.getScore() + (int)player.getDis() * 20);
    			System.out.println("完成第" +  (i+1)  + "关,您现在的积分为:" + player.getScore());
    			
    			System.out.println("进入下一关");
    			
    		}
    	}
    	
    	//随机字符串
    	
    	public String printStr( ) {
    		
    		
    		
    		String str = "";
    		double rNum = 0;
    		
    		
    		for(int i = 0; i < Levels.ls[player.getLevelNo()-1].getStrLength(); i++ ) {
    			rNum = r.nextDouble();
    			if(rNum < 0.3333) {
    				str += (r.nextInt(9)+1);
    			}else if(rNum < 0.6667){
    				str += (char)(r.nextInt(26)+65);
    			}else {
    				str += (char)(r.nextInt(26)+97);
    			}
    		}
    		return str;
    	}
    	
    	//字符串对比
    	
    	public boolean result(String in, String out) {
    		//字符串判断
    		if(out.equals(in)) {
    			//先获取一下当前的系统时间
    			long endTimes = System.currentTimeMillis();
    			long startTimes = player.getStartTime();
    			//获得下一关的时间
    			long dis = Levels.ls[player.getLevelNo() -1 ].getTimeLimit();
    			
    			if((endTimes - startTimes)/1000 > dis) {
    				System.out.println("游戏超时,游戏结束,您的最终得分为:" + player.getScore());
    				return false;
    			}else {
    				//输入正确,且没有超时
    				//加积分
    				int score = Levels.ls[player.getLevelNo()].getScore();
    				player.setDis(dis - (endTimes - startTimes)/1000); 
    				player.setScore(player.getScore() + score );
    				
    				
    				System.out.println("输入正确,您现在的积分为:"+ player.getScore() +"  ,这一关您还有: " + player.getDis() + " 秒钟");
    				return true;
    			}
    		}else {
    			System.out.println("输入错误,游戏结束,您的最终得分为:" + player.getScore());
    			return false;//输入错误
    		}
    		
    		
    	}
    }
    
    

    四、等级地图

    
    package com.yc.oop6.hc0705;
    
    public class Levels {
    	//定义一个静态的对象数组
    	public static Level ls[] = new Level[7];
    	
    	static {
    		ls[0] = new Level(1,2,5,20,10);
    		ls[1] = new Level(2,3,5,18,20);
    		ls[2] = new Level(3,4,4,16,30);
    		ls[3] = new Level(4,5,4,15,40);
    		ls[4] = new Level(5,6,4,15,50);
    		ls[5] = new Level(6,7,3,15,60);
    		ls[6] = new Level(7,8,3,15,70);
    	}
    }
    
    

    五、测试类

    package com.yc.oop6.hc0705;
    
    
    
    public class Test {
    	public static void main(String[] args) {
    		
    		Player p = new Player();
    		Game g = new Game(p);
    		g.startGame();
    		
    		
    
    	}
    }
    
    
         详细的解释都在代码的注释里了,大家细品~
    
    展开全文
  • cocos2dx从零开始 ------内存管理(错误案例分析)

    本篇内容文字比较较多,但是这些都是建立在前面三章写代码特别是传值的时候崩溃的基础上的。可能表达的跟正确的机制有出入,还请指正。 如果有不理解的可以联系我,大家可以讨论一下,共同学习。


    首先明确一个事实,retainrelease是一一对应的,跟new和delete一样


    1.引用计数retain release

    这里请参考一下引用计数的书籍肯定说的比我讲的详细

    简单一点理解就是new的指针加一个计数器每引用一次这块内存计数就加1。在析构的时候减1,如果等于0的时候就delete这个指针并置空

     

    2.自动释放autolease

    autorelease后的对象默认计数是1,并且autorelease的对象会被放到自动释放池里自动释放池这里有一个需要注意的地方自动释放池存储了当前帧所有的autorelease的对象在帧结束时对其中所有对象release一次处理完后这个释放池就不再拥有对这些对象的处理权也就是说自动释放池只会最其中的对象进行一次release操作释放的同时使用一个新的释放池存储后一帧定义的autorelease对象,如此循环下去。

     

    精灵们create函数执行后会被放到自动释放池释放池会在每帧结束的时候调用对于引用计数为1的内存进行释放如果没有其他操作比如retain或者addchild的话那么引用计数没有增加当前帧结束后计数减10这个指针也就不复存在了


    什么时候计数会加1

    手动调用retain使引用技术加1;

    cocos2dx我所见过的create静态方法都是调用autorelease计数默认为1。

    每引用一次比如使用频率最多的addChild()会使其引用技术加1。


    什么时候计数会减1?

    手动调用release使引用技术减1;

    自动释放池里的会在当前帧结束的时候减1。注意是当前帧后面的释放池里存储的是后面帧运行时定义的autorelease对象

    如果一个场景析构会对所有的子节点release一次,这被称为链式反应

    链式反应解释如下我们当前运行这一个场景,场景初始化,添加了很多层,层里面有其它的层或者精灵,而这些都是 CCNode节点,以场景为根,形成一个树形结构,场景初始化之后(一帧之后),这些节点将完全 依附 (内部通过 retain) 在这个树形结构之上,全权交由树来管理,当我们 砍去一个树枝,或者将树 连根拔起,那么在它之上的“子节点”也会跟着去除(内部通过release),这便是链式反应。来自 <http://www.tairan.com/archives/4184>

     

    错误案例

    我们在create如果不使用retain使引用计数加1的话,那么自动释放池会使其引用计数减1,如果在回调函数中使用addchild(sp)会崩溃

    要想解决这个问题create后添加使用sp->retain();来增加它的引用计数

     

    如下

         auto temp = Sprite::create("CloseNormal.png");
        temp->retain();//如果注释掉会崩溃。
        auto item4 =MenuItemLabel::create(Label::createWithBMFont("fonts/futura-48.fnt","Hell"), \
            [=](Ref * ref){
            addChild(temp);
        });

    有些人可能会使用引用lambda表达式如下

        auto  temp =Sprite::create("CloseNormal.png");
        temp->retain();
        auto item4 =MenuItemLabel::create(Label::createWithBMFont("fonts/futura-48.fnt","Hell"), \
            [&](Ref * ref){
            addChild(temp);
        });

    崩溃了引用的话 即使retain也会崩溃这个为什么呢

    引用的话我们使用的是temp的别名引用也就指向指针的指针temp。当这个函数执行完的时候temp做为局部变量就会被释放所以我们在回调函数中使用的temp已经不存在了 如果是=赋值的话精灵的指针会拷贝一份传到lambda表达式中所以不会崩溃

     

    要想解决引用崩溃的问题我们只要使temp不会被释放就好所以定义为成员变量可以解决引用的lambda表达式造成的问题大家可以尝试一下


    深入理解CC_SYNTHESIZE_RETAIN

    假装我们从未学习过CC_SYNTHESIZE_RETAIN第二篇讲过场景之间的正向传值如果我们在主场景create一个精灵然后赋值给下一个场景的成员变量Sprite *sp,对于这种autorelease的变量我们应该怎么进行传值操作呢

    autorelease变量会在每一帧结束的时候计数减1进行销毁所以我们应该对其计数加1,避免下个场景使用的时候已经被删除


    我们应该在主场景切换场景的时候这样写

    voidMainScene::Morning_0623_MemoryManage(cocos2d::Ref * ref)
    {
        auto scene = MemoryManage::createScene();
        auto memLayer = (MemoryManage *)scene->getChildren().at(0);
        tmpSp =Sprite::create("coc/buildings_lowres/59.0.png");//注意斜杠的方向
        tmpSp->retain();//引用计数加1,否则当前帧结束会被销毁
        memLayer->sp = tmpSp;//如果不retain的话会被自动释放掉   在切换场景的时候会被释放掉。
       Director::getInstance()->pushScene(scene);
    }

    在下个场景MemoryManage定义成员变量sp的时候应该对其进行初始化因为它是一个指针

    我们应该定义Sprite *sp = nullptr;

    否则在MainScene复制的时候会崩溃因为它的一个未知的指针指向了内存中未知的区域

    崩溃的地方如下

    断言失败    CCASSERT(_referenceCount > 0,"reference count should greater than 0");

    因为这个时候sp是一个未知的指针


    下面我们对主场景中

     tmpSp =Sprite::create("coc/buildings_lowres/59.0.png");创建的精灵的整个生命周期的引用计数进行分析


    主场景createautorelease(1)->retain(2)->autorelease自动释放池release(1)->在子场景中被addchild(2)->子场景析构的链式反应(1)->???

    请看子场景析构的时候计数还是1,这会造成内存泄露所以我们应该在析构函数中执行一次sp->release().手动减1。

     

    CC_SYNTHESIZE_RETAIN的出现就是为了解决上述问题它只是把retainrelease操作包装了一下

    这个时候你再去看一遍CC_SYNTHESIZE_RETAIN的源码

    #defineCC_SYNTHESIZE_RETAIN(varType, varName, funName)    \
    private: varTypevarName; \
    public: virtualvarType get##funName(void) const { return varName; } \
    public: virtual voidset##funName(varType var)   \
    { \
        if (varName != var) \
        { \
            CC_SAFE_RETAIN(var); \
            CC_SAFE_RELEASE(varName); \
            varName = var; \
        } \
    }

     

    调用CC_SYNTHESIZE_RETAIN来给成员变量赋值时会对原来的变量进行一次retain操作然后需要我们在析构函数的时候添加对应的 CC_SAFE_RELEASE(varName);

     

    现在说一下为什么在CC_SYNTHESIZE_RETAIN中对成员变量varName执行CC_SAFE_RELEASE(varName);

    varName如果被不同的变量多次赋值会怎么样 每一次的赋值原来的变量都要做一次retain操作如果我们直接改变了varName的值而不改变它原来指向的内存的引用计数的话那么就会造成内存泄露 所以每次赋值都会对原来的内存进行一次release。

     

     

    总结:retainrelease是一一对应的但是我们应该使用它们的加强版宏定义CC_SAFE_RETAINCC_SAFE_RELEASE。这两个可不是一一对应的比如我们 CC_SYNTHESIZE_RETAIN定义的变量只在析构函数中加一句CC_SAFE_RELEASE。

    展开全文
  • Oracle的ORA-00604错误案例学习

    千次阅读 2009-12-25 23:06:00
    案例三:使用网络应用程序的时候出现递归SQL错误 问题描述:当我使用网络应用程序的时候,遇到了下面的这个错误。 ORA-00604: 递归SQL1级的时候出现错误。 ORA-04031: 无法分配4200字节的共享内存,"RBKS_BK_...

    ORA-00604 error occurred at recursive SQL level string

    Cause:An error occurred while processing a recursive SQL statement (a statement applying to internal dictionary tables).

    Action:If the situation described in the next error on the stack can be corrected, do so; otherwise contact Oracle Customer Support.

    ORA-00604: 递归某个SQL 层时出现错误

    原因:在运行一条递归SQL语句(该语句将应用于对内部表或数据字典的操作)时,发生错误。

    方案:如果上述描述的错误所在栈可以被修复,则修复并继续运行;否则,请联系Oracle客服。当然,那是Oracle官方的解决办法。我曾经记得有个高手总结了关于ORA-00604/ORA-04031问题的解决:

    修改INIT.ora

    添加

    _db_handles_cached = 0
     

    并重新启动数据库.

    分析:ORA-00604这个信息表明,在数据库执行内部SQL语句时,发生了错误。比如,要往表中插入一行数据,但没有可扩展的空间。ORACLE于是去查寻,哪儿可以建立下一个扩展空间,它有多大小,但没有成功。一般在发生ORA-00604错误时,还伴随着其它的错误,例如:ORA-1547等。

    首先,应当检查警告文件alertSID.log,查找有关ORA-600类的信息。

    该错误最常见的原因是数据库文件initSID.ora中的参数OPEN_CURSORS值太小。可以修改initSID.ora文件,OPEN_CURSORS的值一般为255。修改完后,宕下ORACLE,再重新启动。

    还可以设置并启动数据库的事件跟踪功能。在initSID.ora中加上一行:

    event = "00604 trace name errorstack"
     

    宕下并重新启动ORACLE,使这个事件跟踪参数起作用。这样,当再发生ORA-604错误时,有关信息就保存在TRACE文件中。

    造成ORA-604错误的其它原因可能有:

    - initSID.ora中,参数DC_FREE_EXTENTS或ROW_CACHE_ENQUEUES太低。可以根据操作系统和数据库的情况,适当增加这两个参数的值,宕下并重新启动ORACLE。

    - 运行超出空间(伴随ORA-1547错误)。这时,要对表空间添加新文件,即增加表空间的大小。

    - 达到了MAX_EXTENTS(伴随ORA-1556错误)。如果这样,就要修改表,允许更多的扩展。请从技术手册中查找MAX_EXTENTS的最大值。如果已经达到了最大值,必须用compress extents选项,把表卸出(export),再导入(import)数据库中。

     

    案例一:Oracle执行递归查询的时候出错

    问题描述:我经常遇到ORA-00604 和ORA-01000(开启游标数量达到最大值)错误。然而,当我检查代码的时候,所有的结果集和语句对象都在最后的块中关闭了(我使用的是JDBC)。我执行的查询是一个Oracle递归查询(以这个开始并通过这个连接)。您能告诉我是哪里出现了问题,以及在什么样的情况下会出现上述的错误吗?

    解决方案:可能是init.ora 文件中的open_cursors 参数值的设置太低了。这个参数的默认值是非常低的(50)。它应该设置为200或者更高。即使是你关闭了结果集,但是你并没有在JAVA代码中关闭SQL语句,就会导致这个问题。

    如果设置为yes的话,那么确保你的活动连接池启用了(为了性能的原因),否则设置为no。

    请你的数据库管理员监视数据库,并看看使用V$OPEN_CURSORS 和 V$SYSSTAT数据字典视图的条目。

     

    案例二:Exp出错的一个案例

    问题描述:客户用的Linux系统,Redhat 企业版(RHEL 3.0).数据库,安装的9iR2, 前一段时间升级过.现在的版本是9204.

    客户准备要做Exp导出,以前一直系统没有空间.先给给系统扩了一些空间。Linux下的LVM还算比较好用。虽然文件系统用的是ext3 ,要暂时停机.

    进行导出操作,不成功,发现系统报告错误:

    EXP-00056: ORACLE error 942 encountered
    ORA-00942: table or view does not exist
    EXP-00000: Export terminated unsuccessfully
     

    很多朋友可能对这个错误都很熟悉.

    哦,对了,客户说是升级过数据库,首先猜测是不是升级有问题?毕竟在论坛上类似升级不成功的问题看过很多了.

    执行$ORACLE_HOME/rdbms/admin/catpatch.sql 脚本.

    同时要注意调大java_pool_size 和shared_pool_size这两个参数的大小,要不重新来就耽误时间了,不要犯低级错误

    SQL>shutdown immediate;
    SQL>startup migrate;
    SQL>@?/rdbms/admin/catpatch.sql
     

    之后查看Spool 出来的日志. 发现有编译错误,重新执行了第二次. 等待......之有这个时候我才想起才抱怨CPU不够快,内存不够大 ;)

    这次Log没错误.不料想....................用户连接报告错误:

    ERROR at line 1:
    ORA-00604: error occurred at recursive SQL level 1
    ORA-04045: errors during recompilation/revalidation of LBACSYS.LBAC_EVENTS
    ORA-06508: PL/SQL: could not find program unit being called
    ORA-06512: at line 2
    ORA-06508: PL/SQL: could not find program unit being called
    ORA-06512: at line 2
     

    发现connect / as sysdba 还是可以登陆进去的。

    看来是 LBACSYS.LBAC_EVENTS的状态有点问题。联接进去,编译一下如何? 我的如意算盘是@?/rdbms/admin/utlrp.sql执行一下就没有问题了,不料根本没有用,错误依然。当时有些头晕,这系统还没有备份呢,看来有些麻烦了(心里暗地埋怨客户,一直不让备份,总说"等等再说",作为一个DBA说话总不被重视也挺悲哀的不是? ,虽然我自己偷着有个备份,不过还是上次升级时候的呢),赶紧上网Metalink查查,这里网络速度还不错 LBACSYS.LBAC_EVENTS 作为关键词,找到如下的信息:

    The reason for this problem seems to be an Upgrade for Label-Security
    even if it's not installed.  //Label security 没有安装,居然补丁去默认给升级?
     

    解决方案:

    shutdown immediate;
    startup migrate;
    alter view lbacsys.lbac$all_table_policies compile;
    alter package lbacsys.lbac_events compile body;
    shutdown immediate;
    startup;
     

    支持人员说这是个Bug.但是普通用户不可见. 不太放心,再找找,在Suse.com站点的Maillist也发现了一则类似的案例,看来还可以,心里有底了。

    按照上面的执行,重新检查,OK。

    总结一下

    其实是一个很没有技术含量的Case。首先以前升级的时候至少要测试一下Export是否可以(Export已经成为升级成功的一个标志了!) 其次,准备不够充分,早成了手忙脚乱.所幸不是关键系统,用户还可以容忍.Oracle 总说微软是个烂公司,其实他们才真的够栏.Bug多的不可胜数.

     

    案例三:使用网络应用程序的时候出现递归SQL错误

    问题描述:当我使用网络应用程序的时候,遇到了下面的这个错误。

    ORA-00604: 递归SQL1级的时候出现错误。

    ORA-04031: 无法分配4200字节的共享内存,"RBKS_BK_INFO", "sga_heap", "library cache"。

    这些错误信息是什么意思?我该如何解决它们?它们是在应用程序里面还是数据库里面?

    解决方案:您应该使用的是Oracle 8.1.7.4之前版本的Oracle。第一个错误信息告诉你Oracle针对你的行为执行的SQL 语句失败了。ORA-4031告诉你为什么它会失败。ORA-4031错误信息的意思是你没有获得足够的空闲空间。你可以增加你的SHARED_POOL_SIZE,重新启动数据库再拭一次。这个bug已经在后续的补丁包中修复了。如果你使用的不是这个版本,你可以应用一下补丁包。

     

    案例四:Sql_trace进行Oracle诊断案例

    问题说明:很多时候,在我们进行数据库操作时,比如drop user,drop table等,经常会遇到这样的错误

    ORA-00604: error occurred at recursive SQL level 1 .

    这样的提示,很多时候是没有丝毫用处的.本案例就这一类问题提供一个思路及方法供大家参考.

    1. drop user出现问题

    报出以下错误后退出

    ORA-00604: error occurred at recursive SQL level 1

    ORA-00942: table or view does not exist .

    关于 recursive SQL 错误我们有必要做个简单说明.

    我们知道,当我们发出一条简单的命令以后

    Oracle数据库要在后台解析这条命令,并转换为Oracle数据库的一系列后台操作.

    这些后台操作统称为递归sql.

    比如create table这样一条简单的DDL命令,Oracle数据库在后台,实际上要把这个命令转换为对于obj$,tab$,col$等底层表的插入操作.Oracle所作的工作可能比我们有时候想的要复杂的多.

    2.跟踪问题

    我们知道Oracle提供sql_trace的功能

    可以用于跟踪Oracle数据库的后台递归操作.

    通过跟踪文件,我们可以找到问题的所在

    以下是格式化(tkprof)后的输出:

    The following statement encountered a error during parse:
    DELETE FROM SDO_GEOM_METADATA_TABLE WHERE SDO_OWNER = 'WAPCOMM'
    Error encountered: ORA-00942
     

    Oracle把错误信息首先呈现出来,我们看到ORA-00942错误是由于SDO_GEOM_METADATA_TABLE表/视图不存在所致,问题由此可以定位.

    对于这一类的错误,定位问题以后解决的方法就要依据具体问题原因而定了。

    3.问题定位

    对于本案例,通过Metalink获得以下解释:

    Problem Description
    The Oracle Spatial Option has been installed and you are encountering
    the following errors while trying to drop a user, who has no spatial tables,
    connected as SYSTEM:
    ERROR at line 1:
    ORA-00604: error occurred at recursive SQL level 1
    ORA-00942: table or view does not exist
    ORA-06512: at line 7
    A 942 error trace shows the failing SQL statement as:
    DELETE FROM SDO_GEOM_METADATA_TABLE WHERE SDO_OWNER = ''
    Solution Description
     

    (1)

    Create a synonym for SDO_GEOM_METADATA_TABLE under SYSTEM which points to
    MDSYS.SDO_GEOM_METADATA_TABLE.
     

    对于本例,为MDSYS.SDO_GEOM_METADATA_TABLE创建一个同义词即可解决,是相对简单的情况.

    (2)

    Now the user can be dropped connected as SYSTEM.
    Related Documents
    ORA-604 and ORA-942 Reported During DROP USER CASCA
     

    4.实际处理

    MDSYS.SDO_GEOM_METADATA_TABLE为Spatial对象

    如果未使用Spatial选项,可以删除

    SQL> connect / as sysdbaConnected.
    SQL> select * from dba_sdo_geom_metadata order by owner;
    select * from dba_sdo_geom_metadata order by owner
    *
    ERROR at line 1:
    ORA-00942: table or view does not exist
    ORA-04063: view "MDSYS.DBA_SDO_GEOM_METADATA" has errors
    SQL> select object_name from dba_objects where object_name like '%SDO%';
    OBJECT_NAME
    ALL_SDO_GEOM_METADATA
    ALL_SDO_INDEX_INFO
    ALL_SDO_INDEX_METADATA
    DBA_SDO_GEOM_METADATA
    DBA_SDO_INDEX_INFO
    DBA_SDO_INDEX_METADATA
    ....
    DBA_SDO_GEOM_METADATA
    DBA_SDO_INDEX_INFO
    ...
    SDO_WITHIN_DISTANCE
    USER_SDO_GEOM_METADATA
    USER_SDO_INDEX_INFO
    USER_SDO_INDEX_METADATA
    88 rows selected.
    SQL> drop user MDSYS cascade;
    User dropped.
    SQL> select owner,type_name from dba_types where type_name like 'SDO%';
    no rows selected
    SQL>
    SQL> alter session set sql_trace=true;
    Session altered.
    SQL> drop user wapcomm;
    User dropped.
    SQL> alter session set sql_trace=false;
    Session altered.
    SQL> exit
    Disconnected from Oracle8i Enterprise Edition Release 8.1.7.4.0 - 64bit Production
    With the Partitioning option
    JServer Release 8.1.7.4.0 - 64bit Production
     

    这时用户得以顺利drop

    5.一点总结

    使用sql_trace可以跟踪数据库的很多后台操作有利于我们发现问题的所在,很多时候,我们想要研究Oracle的内部活动或后台操作,也可以通过sql_trace跟踪,sql_trace/10046 是Oracle提供的最为有效的诊断工具之一.

     

    案例五:表更新时发生递归SQL2级失败错误

    问题描述:表更新的时候失败了,并且生成了一条ORA-00604 错误信息。这个错误发生在递归SQL 2级。

    解决方案:不幸的是,这个错误并不能告诉你Oracle数据库在错误发生的时候正要做什么。当你执行一条SQL语句的时候,Oracle数据库辉为你在幕后做很多事情。例如,考虑下面的SQL语句:

    UPDATE emp SET sal = sal*1.05 WHERE empno=1001;
     

    这条SQL语句给号码为1001的雇员涨5%的工资。当你执行这条语句的时候,Oracle查询数据目录来确定是否有这个表或者你是否使用了同义字。一旦它找到了数据库对象,Oracle查询数据字典来判断你是否拥有访问这个对象的权限。那么,Oracle到底是如何与数据字典进行交互的呢?它执行一条自己的SQL 语句。这些Oracle为你执行的SQL语句被称为“递归”SQL语句。你最初的SQL 语句是0级。Oracle为你执行的递归SQL语句是1级。有时候,一条递归SQL语句又会引起自己的递归SQL语句,就是2级。

    在你的案例中,有一个2级的递归SQL语句正在执行,并且产生了问题。为了解决问题,你需要找出执行的是什么递归SQL语句引起的错误。要做到这一点,你必须启动会话中的追踪。首先,执行下面的SQL 语句:

      ALTER SESSION SET sql_trace=TRUE;
     

    然后,执行你的更新语句。你会看到ORA-604 错误。接下来,执行下面的语句:

      ALTER SESSION SET sql_trace=FALSE;
     

    现在到你为数据库定义的USER_DUMP_DEST 起始参数上的路径去。那里应该有一个时间戳为当前时间的文件。那个就是你生成的追踪文件。你可以打开文件并检查递归SQL语句,其中包括引起错误的一条。(接近追踪文件的末尾)。

     

     

    案例六:连接数据库用户的时候遇到ORA-00604错误

    问题描述:当我试图连接到数据库用户的时候,得到了如下的错误信息:ORA-00604:递归SQL 1级的时候出现错误。但是如果我使用数据库管理员的角色的时候,用户就能够连接。系统用户可以连接,但是scott 就不能连接。

    解决方案:Oracle为你在幕后做了很多的工作。它在自己的SQL 语句的全过程中进行这项工作。Oracle发布给你的任何的SQL 语句都是“递归的SQL”语句。应该有很多的SQL 语句会引起你遇到的问题。我建议你所做的就是在INIT.ORA文件中设置SQL_TRACE=TRUE,然后重新启动数据库。然后复制ORA-604错误。这会在你的USER_DUMP_DEST目录中生成所有用户进程的大量追踪文件。在错误发生之后,立即关闭数据库,并设置SQL_TRACE=FALSE。然后再一次启动数据库。现在通过追踪文件,你就可以USER_DUMP_DEST目录中生成的追踪文件中查找ORA-604错误那一条信息。就在那里,你就发现ORA-604错误是哪一个递归SQL语句产生的,以及实际发生的错误情况。你的解决方案依赖于语句和实际的错误。

     

    案例七:有人Move了系统表Dependencie$表, Crash了

    今天有人问我这样之后能不能恢复, 我想基本上已经不能了. 在open时报ORA-01092号错误, 我查了一下event也没有这方面的合适的event啊, 我推荐用不完全恢复, 不过好象是没有备份, 运行在noarchivelog模式.

    从trc文件中得到的内容:

    KCRA: buffers claimed = 0/0, eliminated = 0
    ORA-00704: bootstrap process failure
    ORA-00604: error occurred at recursive SQL level 1
    ORA-01502: index 'SYS.I_DEPENDENCY1' or partition of such index is in unusable state
    oerr ora 704
    00704, 00000, "bootstrap process failure"
    // *Cause: Failure in processing bootstrap data - see accompanying error.
    // *Action: Contact your customer support representative.
    SQL_TRACE打开的情况下生成的Trace:
    PARSING IN CURSOR #9 len=84 dep=2 uid=0 oct=3 lid=0 tim=18446744073254091198
    hv=2287793623 ad='66f6c06c'
    select o.name, u.name from obj$ o, user$ u where o.obj# = :1 and o.owner# = u.user#
    END OF STMT
    PARSE #9:c=0,e=343,p=0,cr=0,cu=0,mis=1,r=0,dep=2,og=0,tim=18446744073254091193
    EXEC #9:c=0,e=186,p=0,cr=0,cu=0,mis=0,r=0,dep=2,og=4,tim=18446744073254091456
    FETCH #9:c=0,e=28019,p=2,cr=5,cu=0,mis=0,r=1,dep=2,og=4,tim=18446744073254119501
    STAT #9 id=1 cnt=1 pid=0 pos=1 obj=0 op='NESTED LOOPS '
    STAT #9 id=2 cnt=1 pid=1 pos=1 obj=18 op='TABLE ACCESS BY INDEX ROWID OBJ#(18) '
    STAT #9 id=3 cnt=1 pid=2 pos=1 obj=36 op='INDEX UNIQUE SCAN OBJ#(36) '
    STAT #9 id=4 cnt=1 pid=1 pos=2 obj=22 op='TABLE ACCESS CLUSTER OBJ#(22) '
    STAT #9 id=5 cnt=1 pid=4 pos=1 obj=11 op='INDEX UNIQUE SCAN OBJ#(11) '
    ORA-00704: 引导程序进程失败
    ORA-00604: 递归 SQL 层 1 出现错误
    ORA-01502: 索引'SYS.I_DEPENDENCY1'或这类索引的分区处于不可用状态
    EXEC #1:c=109375,e=5578667,p=44,cr=616,cu=1,mis=0,r=0,dep=0,og=4,
    tim=18446744073255895570
    ERROR #1:err=1092 tim=23012387
     

    DBA做事一定要细心, 在运行批处理时一定要审了再审.

     

    补充:

    后来我用AnySQL UnLoader去恢复数据了, 和客户一起花了24小时, 最后他们说OK了.

    Eygle和Chensq对这个问题也有研究, 他们想出了更好的办法解决此事, 不过最后原来的库肯定是不能再用了, 必须要exp/imp到别的库了, 我是用AUL帮客户恢复数据的, 数据量在30G以上.

     

    案例八:ORA-00604:递归SQL产生的错误

    问题描述:我有一个Pro*c 的程序,有时候会给出下列的错误信息:

    ORA-00604:递归SQL 1级上产生错误

    你能告诉为什么会出现这个错误,它什么时候出现,以及可能的解决方案是什么吗?

    解决方案:无论你什么时候执行查询,系统都会在后台执行一些查询来判断许多事情,例如“你是否有权限来执行这个查询?”,“你要访问的这个对象是否存在?”。这些系统执行的查询被称为“递归SQL”。有时候,一个递归SQL语句需要调用自身的递归SQL。那么这些执行的递归SQL语句就是另一个级别的,2级。

    你不会在SQL*Plus 中看到递归SQL语句。要查看它们的最好的方式就是开启会话中的追踪。启动SQL*Plus ,执行下列命令:

    ALTER SESSION SET sql_trace=TRUE;
     

    然后运行你的进程,直到崩溃。继续,并关闭SQL*Plus 。现在到USER_DUMP_DEST 目录中。那里会生成一个追踪文件给你。查看追踪文件中的有关ORA错误的信息。这就是问题产生的根源。纠正ORA错误就会防止ORA-600错误再次出现。

    大多数的ORA-600错误都可以通过以SYS登录,并从ORACLE_HOME/rdbms/admin 运行CATALOG 和 CATPROC 来予以纠正。

    展开全文
  • 面向对象_多态版猫狗案例

    千次阅读 2016-10-07 12:16:55
    多态练习:猫狗案例 */ class Animal{ public void eat(){ System.out.println("吃饭"); } } class Dog extends Animal{ public void eat(){ System.out.println("狗吃肉"); } public void lookDoor(){ ...
    /*
    	多态练习:猫狗案例
    */
    class Animal{
    	public void eat(){
    		System.out.println("吃饭");
    	}
    }
    
    class Dog extends Animal{
    	public void eat(){
    		System.out.println("狗吃肉");
    	}
    	
    	public void lookDoor(){
    		System.out.println("狗看门");
    	}
    }
    
    class Cat extends Animal{
    	public void eat(){
    		System.out.println("猫吃鱼");
    	}
    	
    	public void playGame(){
    		System.out.println("猫捉迷藏");
    	}
    }
    
    class DouTaiTest{
    	public static void main(String[] args){
    		//定义为狗
    		Animal a = new Dog();
    		a.eat();
    		System.out.println("----------------------");
    		//还原成狗
    		Dog d = (Dog)a;
    		d.eat();
    		d.lookDoor();
    		System.out.println("----------------------");
    		//变成猫
    		a = new Cat();
    		a.eat();
    		System.out.println("----------------------");
    		//还原成猫
    		Cat c = (Cat)a;
    		c.eat();
    		c.playGame();
    		
    		//错误的内容
    		//编译错误
    		//Dog dd = new Animal();
    		//Dog ddd = new Cat();
    		//ClassCastException:类型转换异常(运行错误)
    		Dog dd = (Dog)a;
    	}
    }

    展开全文
  • 最近由于要处理大量图像并将图像拼接为一个大图形,每个图像像素都很大(1280x960),拼接后更大,并且需要对图像频繁进行标记等操作,遇到了很多问题,内存不足,一般性错误,对象错误等等等等。 通过自己的摸索与...
  • 解决ActiveX部件不能创建对象错误

    万次阅读 2007-05-31 11:47:00
    在asp中,出现下列错误提示:Microsoft VBScript 运行时错误 错误 800a01ad ActiveX 部件不能创建对象 这个错误是asp组件未注册,而导致。解决方法如下:1、如果是你自己开发的组件,请使用 regsvr32 路径/组件....
  • 首先放出GitOS的项目地址...ossdemo-aliyunoss:阿里OSS使用案例(尚未完成) ossdemo-qcloudcos :腾讯云COS使用案例 ossdemo-qiniu :七牛云存储使用案例 pom.xml 腾讯云COS1、官方的使用API介绍地址:https://www
  • 今天,帮一网友改程序,非常郁闷,一个小bug找了很就,于是把程序写下,作下记录: ...所以,我们得记住重载paintEvent()函数的时候,里面的Qpainter()对象一定不能带self,不然就会出现析构错误.
  • “大象装进冰箱”案例 1.面向过程怎么做? 打开冰箱门;装进大象;关闭冰箱门。 面向过程:面向着具体的每一个步骤和过程,把每个步骤和过程完成,然后由这些功能方法相互调用,完成需求。 2.面向对象怎么做? ...
  • SpringMVC入门案例出现网页404错误的问题 代码部署 目的:Tomcat服务器实现通过控制类(HelloController)来进行一个页面(index.jsp)向另一个页面(success.jsp)跳转 项目的目录: 代码 Hellocontroller package ...
  • 通过上一篇文章[JSP内置对象 https://blog.csdn.net/weixin_44989801/article/details/112132063]...application等内置对象以及相关的使用方法,接下来,我们用几个小案例来练习使用以上内置对象及内置对象的相关方法。
  • 经常出现没有将对象先实例化就使用的情况。这里只是总结了个人认为最简单的情况。
  • 案例学习Oracle错误:ORA-00600

    千次阅读 2010-05-19 16:55:00
    ora-600的错误经常伴随跟踪文件的状态转储(系统状态和进程状态),系统状态存储将包括ORACLE RDBMS持有的当前对象的信息,进程状态转储则将显示特殊进程持有的对象,当进程符合了某错误条件时,经常是由于一些信息取...
  • 1.取得host   String host=request.getHeader("Host"); ...告诉服务器请求来自哪里,所以服务器可以判断请求来至哪里,如果不是本网站或者不是希望的网址...就会正确显示,否则跳转到错误页面
  • 案例:用户根据提示信息输入一组数字,输入0退出,求出最大值和最小,当用户输入的不是整数时提示用户重新输入 public class Test1 { /** * 输入一组整数,求取最大值,最小值,输入0退出 */ public static ...
  • C++复杂对象之子对象

    千次阅读 2015-03-06 23:31:49
    其实吧,在C++程序中,还是复杂的对象比较多,这篇就开始逐渐梳理一下复杂的类对象。  一个对象作为另一个类的成员时,该对象称为类的子对象。子对象实际上是用对象作为某类的数据成员。  比如: class A { }...
  • UML案例:BBS系统一

    2018-07-29 22:02:35
    UML案例:BBS系统一。对BBS论坛系统进行了面向对象的分析与建模,内容详细,图形完整,错误较少
  • 博客地址: ... 案例:本人在使用IntelliJ idea 2017.2 开发SSM应用,做Junit Test测试时,通过Resource注解装配DAO时出现了ERROR的错误提示(Could not autowire. no beans of "XXX" type found...
  • 在其他步骤正确的情况下,执行代码,弹出错误提示 【解决方法】 // 设置读取的查询语句. sSql = "SELECT A, B FROM [Sheet1$]"; 【分析】 1,对于用代码创建的excel和表,原始代码访问并不会...
  • 案例三:使用网络应用程序的时候出现递归SQL错误  问题描述:当我使用网络应用程序的时候,遇到了下面的这个错误。  ORA-00604: 递归SQL1级的时候出现错误。  ORA-04031: 无法分配4200字节的共享内存...
  • 深入理解Java类型信息(Class对象)与反射机制

    万次阅读 多人点赞 2017-05-01 23:19:19
    【版权申明】未经博主同意,谢绝转载!(请尊重原创,博主保留追究权) ...深入理解Java类型信息(Class对象)与反射机制 深入理解Java枚举类型(enum) 深入理解Java注解类型(@Annotation) 深入理解
  • 一元谓词案例与二元谓词案例

    千次阅读 2017-11-26 18:24:22
    一元谓词案例与二元谓词案例
  • 海伦约会数据预测介绍案例介绍案例步骤代码部分包模块...我的朋友海伦一直使用在线约会网站寻找适合自己的约会对象。尽管约会网站会推荐不同的 人选,但她没有从中找到喜欢的人。经过一番总结,她发现曾交往过三种...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 131,828
精华内容 52,731
关键字:

对象错误案例