ORA-01401: 插入的值对于列过大

类似问题 &
Oracle &&&&最新内容
Oracle &&&&相关内容ORA-01401安插的值对于列过大是什么意思 - 数据库当前位置:& &&&ORA-01401安插的值对于列过大是什么意思ORA-01401安插的值对于列过大是什么意思&&网友分享于:&&浏览:9次ORA-01401插入的值对于列过大是什么意思
解决方法:1、增大字段长度2、检查插入数据
12345678910
12345678910
12345678910 上一篇:下一篇:文章评论相关解决方案 12345678910 Copyright & &&版权所有您所在的位置: &
一个ORA-604错误的分析
一个ORA-604错误的分析
盖国强 杨廷琨等
电子工业出版社
《Oracle DBA手记――数据库诊断案例与性能优化实践》包含了精心挑选的数据库诊断案例与性能优化实践经验,内容涉及Oracle典型错误的分析和诊断,各种SQL优化方法(包括调整索引,处理表碎片,优化分页查询,改善执行计划等),以及优化系统性能的经验。第2篇Yangtingkun的DBA工作手记。本节说的是一个ORA-604错误的分析。
一个ORA-604错误的分析
同事遇到一个ORA-604错误,分析一下感觉还比较有趣。
出错的SQL大致如下:SQL&&&&&CREATE&TABLE&T_604&AS&&&2&&&&&SELECT&*&FROM& &&&3&&&&&(SELECT&OBJECT_TYPE,&TO_CHAR(AVG(OBJECT_ID),& &&&'')&FROM&DBA_OBJECTS &&&4&&&&&GROUP&BY&OBJECT_TYPE &&&5&&&&&ORDER&BY&2&DESC) &&&6&&&&&WHERE&ROWNUM&&&10; &(SELECT&OBJECT_TYPE,&TO_CHAR(AVG(OBJECT_ID),&'')& &FROM&DBA_OBJECTS &&*&
第 3 行出现错误:
ORA-00604: 递归 SQL 层 1 出现错误
ORA-01401: 插入的值对于列过大
由于同事并不是DBA,因此对这个错误比较困惑,不清楚为什么SELECT语句直接执行没有任何的问题,而根据SELECT的查询结果去创建表却出现了错误,因此同事认为可能是空间分配上出现了问题。SQL&&&&&SELECT&*&FROM& &&&2&&&&&(SELECT&OBJECT_TYPE,&TO_CHAR(AVG(OBJECT_ID),& &&&'')&FROM&DBA_OBJECTS &&&3&&&&&GROUP&BY&OBJECT_TYPE &&&4&&&&&ORDER&BY&2&DESC) &&&5&&&&&WHERE&ROWNUM&&&10; &OBJECT_TYPE&&&&&&&&&TO_CHAR(AVG&&DATABASE&LINK &MATERIALIZED&VIEW&&&&&&& &RULE&SET&&&&&&&&&&&&&&&& &DIMENSION&&&&&&&&&&&&&&& &DIRECTORY&&&&&&&&&&&&&&& &EVALUATION&CONTEXT&&&&&& &XML&SCHEMA&&&&&&&&&&&&&& &TRIGGER&&&&&&&&&&&&&&&&& &INDEXTYPE&&&&&&&&&&&&&&&&
已选择9行。
一般来说,ORA-604错误很少直接出现在用户调用的SQL中。对于本例的情况,后面的那个错误信息才是真正引发错误的原因。也就是说真正的错误是后面的那个ORA-1401错误。这个ORA-1401错误很好理解:插入的值比表中列的定义值要大。
不过CREATE TABLE AS SELECT语句没有为创建表的列指定数据类型和长度限制,数据类型和长度都由SELECT语句的查询结果来确定。按道理讲不应该出现这种错误。
其实问题很简单,导致错误的真正原因是列名长度太长了,因此只需将上面的CREATE TABLE语句改变一下写法就可以顺利执行了:SQL&&&&&CREATE&TABLE&T_604&(OBJECT_TYPE,&AVG_OBJECT_ID)&AS&&&2&&&&&SELECT&*&FROM& &&&3&&&&&(SELECT&OBJECT_TYPE,&TO_CHAR(AVG(OBJECT_ID), &&&&'')&FROM&DBA_OBJECTS &&&4&&&&&GROUP&BY&OBJECT_TYPE &&&5&&&&&ORDER&BY&2&DESC) &&&6&&&&&WHERE&ROWNUM&&&10; &表已创建。 &SQL&&DROP&TABLE&T_604; &表已删除。 &SQL&&&&&CREATE&TABLE&T_604&AS&&&2&&&&&SELECT&*&FROM& &&&3&&&&&(SELECT&OBJECT_TYPE,&TO_CHAR(AVG(OBJECT_ID),& &&&'')&AVG_OBJECT_ID &&&4&&&&&FROM&DBA_OBJECTS &&&5&&&&&GROUP&BY&OBJECT_TYPE &&&6&&&&&ORDER&BY&2&DESC) &&&7&&&&&WHERE&ROWNUM&&&10;&
表已创建。
当用户执行ddl操作时,Oracle通过大量的递归调用来维护数据字典。比如这个CREATE TABLE语句,Oracle就会插入或更新TAB$、COL$等表。这些操作都是递归调用操作,而在递归调用过程中出现的错误就会报错ORA-604。
出错的SQL语句由于没有指定别名,Oracle会将查询语句中的字段名称作为CREATE TABLE语句的列名。也就是说,Oracle试图将TO_CHAR(AVG(OBJECT_ID), '')作为列名,而这个列名的长度显然超过了列长度30个字符的限制,因此Oracle在插入数据字典表时出现ORA-1401错误。
而上面可以成功执行的两个SQL,一个是在CREATE TABLE时就指定了列名;而另一个是在SELECT时为超长的列指定了别名。因此这两个SQL都不会出现列名超长的问题。
当然这个错误的产生还有一定的条件:如果是TO_CHAR(AVG(OBJECT_ID), '')直接出现在SELECT的外层,在CREATE TABLE的时候,Oracle会明确要求用户提供别名。SQL&&CREATE&TABLE&T_604&AS&&&2&&SELECT&OBJECT_TYPE,&TO_CHAR(AVG(OBJECT_ID),&'')& &&&3&&FROM&DBA_OBJECTS &&&4&&GROUP&BY&OBJECT_TYPE &&&5&&ORDER&BY&2&DESC; &SELECT&OBJECT_TYPE,&TO_CHAR(AVG(OBJECT_ID),&'') &&&&&&&&&&&&&&&&&&&&&*&
第 2 行出现错误:
ORA-00998: 必须使用列别名命名此表达式
而这个错误就要比前面的ORA-604和ORA-1401错误直观多了。
【责任编辑: TEL:(010)】&&&&&&
关于&&&&&&的更多文章
本书由麦思博(北京)软件技术有限公司主编,由著名Oracle专家和
本书描述了黑客用默默无闻的行动为数字世界照亮了一条道路的故事。
讲师: 13人学习过讲师: 9人学习过讲师: 11人学习过
《Excel 2016表格应用》用于帮助读者真正提高Excel表
ES6(又名 ES2105)是 JavaScript 语言的新标准,2015
《21天学通Visual Basic(第4版)》是Visual Basic 6.
SQL Server 2005微软官方权威参考手册。
是Inside Microsoft SQL Server 2005系列书中的第一本,SQL Server类的顶尖之作。
51CTO旗下网站当前位置:
来源: 联系QQ: 作者: <
发布时间: 13/03/16
【网学网提醒】:以下是会员为您推荐的Proc,希望本篇文章对您有所帮助。&&&&PROC是ORACLE数据库提供的编程接口之一,其应用十分的广泛,本文通过一个具&&&&体的例子,介绍PROC编程的一些经验及应注意的地方。&&&&例子:&&&&#include&&&&#include&&&&#include&&&&#include&&&&#include&&&&EXECSQLINCLUDE&&&&/*RELEASE_CURSOR=YES使PROC在执行完后释放与嵌入SQL有关资源*/&&&&EXECORACLEOPTION(RELEASE_CURSOR=YES);&&&&EXECSQLBEGINDECLARESECTION;&&&&varcharvc_user[20];&&&&longal_empno=0;&&&&charac_ename[11]="";&&&&charac_hiredate[20]="";&&&&doubleaf_sal=0;&&&&EXECSQLVARac_enameISSTRING(11);&&&&EXECSQLVARac_hiredateISSTRING(20);&&&&EXECSQLENDDECLARESECTION;&&&&/*错误处理函数*/&&&&voidsql_error(char*msg)&&&&{&&&&printf("\n%s,%ld,%s\n",msg,sqlca.sqlcode,(char&&&&*)sqlca.sqlerrm.sqlerrmc);&&&&EXECSQLROLLBACKRELEASE;&&&&exit(-1);&&&&}&&&&main()&&&&{&&&&EXECSQLWHENEVERSQLERRORDOsql_error("ORACLEERROR:");&&&&/*连接数据库*/&&&&strcpy(vc_user.arr,"scott/tiger@DEMO");&&&&vc_user.len=16;&&&&execsqlconnect:vc_&&&&EXECSQLDECLAREcur_empCURSORFOR&&&&SELECTEMPNO,ENAME,to_char(HIREDATE,'yyyy/mm/ddhh24:mi:ss'),SALFROM&&&&EMP;&&&&EXECSQLOPENcur_&&&&while(1)&&&&{&&&&al_empno=0;&&&&strcpy(ac_ename,"");&&&&strcpy(ac_hiredate,"");&&&&af_sal=0;&&&&EXECSQLFETCHcur_empINTO:al_empno,:ac_ename:ename_ind,&&&&:ac_hiredate:hiredate_ind,:af_sal:sal_&&&&if(sqlca.sqlcode==1403)&&&&{&&&&&&&&}&&&&printf("empno=%ld,ename=%s,hiredate=%s,sal=%lf\n",al_empno,ac_ename,ac_hired&&&&ate,af_sal);&&&&}&&&&EXECSQLCLOSEcur_&&&&EXECSQLROLLBACKWORKRELEASE;&&&&}&&&&1、宿主变量的声明&&&&在PROC中,在SQL语句中用到的变量称为宿主变量。他们应在EXECSQLBEGIN&&&&DECLARESECTION;与EXECSQLEDNDECLARESECTION;&&&&之间声明,如上面所示.在声明宿主变量时应注意以下几点:&&&&(1)在数据库表中定义为VARCHAR2,VARCHAR,CHAR的字段,在PROC中可声明为&&&&CHAR,但长度应为它们在表中定义的长度加1,因为PROC中&&&&CHAR型变量用\0做结尾。&&&&如:ENAME在表中的定义为enamevarchar2(10),在PROC中可定义为:&&&&EXECSQLBEGINDECLARESECTION;&&&&charename[11];&&&&EXECSQLENDDECLARESECTION;&&&&常见错误说明:&&&&如果插入的字符串长度大于10,如:EXECSQLINSERTINTOEMP(ENAME)&&&&VALUES('');会出现以下错误:&&&&error:ORA-01480:STR赋值变量缺少空后缀。&&&&如果定义为:&&&&EXECSQLBEGINDECLARESECTION;&&&&charename[15];&&&&EXECSQLENDDECLARESECTION;&&&&当插入的字&&&&符串长度大于10,小于15时,如:EXECSQLINSERTINTOEMP(ENAME)&&&&VALUES('');会出现以下错误:&&&&error:ORA-01401:插入的值对于列过大。&&&&当插入的字符串长度大于15,如:EXECSQLINSERTINTOEMP(ENAME)&&&&VALUES('34');会出现以下错误:&&&&error:ORA-01401:STR赋值变量缺少空后缀。&&&&(2)从SQL语句中取字段的值到宿主变量中时,PROC不会自动给宿主变量去掉右&&&&空格。而是以在DECLARESECTION中定义的长度为准(与表中定义的无关)不足补右空&&&&格.如果不注意这一点,在PROC中进行字符串操作时(如比较相等)会出错。如:&&&&EXECSQLBEGINDECLARESECTION;&&&&charename[10];&&&&EXECSQLENDDECLARESECTION;&&&&如果ENAME在表中的值为'abc',则取出的值为'abc';&&&&可用语句EXECSQLVAR重定义CHAR型变量。这样宿主变量会自动去掉右空格。如&&&&下:&&&&EXECSQLBEGINDECLARESECTION;&&&&charename[11];&&&&EXECSQLVARac_enameISSTRING(11);&&&&EXECSQLENDDECLARESECTION;&&&&如果ENAME在表中的值为'abc',则取出的值为'abc';&&&&(3)对浮点型的变量,为保证精度,最好是声明成DOUBLE型的.因为DOUBLE型的&&&&精度比FLOAT型高很多.&&&&(4)整型可声明为LONG型(对较长的整型,而且所用的平台支持的话,如在SUN平台&&&&上,可声明为LONGLONG型).&&&&(5)DATE型的处理:DATE型一般声明为CHAR(20)。&&&&往表中插入DATE型数据时,一般用TO_DATE()函数进行类型转换,取出值时一般用&&&&TO_CHAR()函数进行类型转换.&&&&EXECSQLselectto_char(hiredate,'yyyy/mm/ddhh24:mi:ss')into&&&&:ac_hire_datefromEMPwhereempno=1234;&&&&EXECSQLinsertintoEMP(EMPNO,HIREDATE)&&&&values(123,to_date(:ac_hiredate,'yyyy/mm/ddhh24:mi:ss');&&&&2、宿主变量的作用范围&&&&如果宿主变量在所有的函数之外声明,则他们是全局变量。在使用之前要注意把&&&&变量的值初始化,宿主变量也可以在某个函数的内部定义。这时他们是局部变量。一&&&&般都习惯把宿主变量声明为全局变量。&&&&3、数据库的连接与断开&&&&数据库的连接有以下两种方法:&&&&(1)&&&&strcpy(vc_user.arr,"scott/tiger");&&&&vc_user.len=11;&&&&execsqlconnect:vc_&&&&(2)&&&&strcpy(user,"scott");&&&&strcpy(pass,"tiger");&&&&execsqlconnect:useridentifiedby:&&&&注意:在有些平台上两种都可以,在有些平台上只能用第一种方法.&&&&在PROC中,要记住用EXECSQLROLLBACKWORKRELEASE;断开与数据库的连&&&&接,并释放相关的数据库资源。&&&&4、PROC中的NULL值的处理&&&&如果某一字段取出的值是NULL,会报:sqlcode=-1405,sqlerr=ORA-01405:读取&&&&的列值为NULL&&&&并且相应的宿主变量的值不会被改变,为执行该SQ&&&&L语句之前的值.常用的处理&&&&NULL值的方法有:&&&&(1)采用指示器变量,此时不会有-1405错误,当必须是所以为NULL的字段都有相应&&&&的指示器变量,如果某一字段没有指示器变量,但取出的值&&&&为NULL值,则仍然会有-1405错误.当取出的值是NULL时,相应的指示器变量变量&&&&为-1,可根据指示器变量的值做响应的处理。&&&&(2)如果字段较多,可取字段到一个结构体中及与该结构体对应的指示器结构体中&&&&.如上面的例子中可定义结构体:&&&&structstr_emp{&&&&longal_&&&&charac_&&&&charac_&&&&doubleaf_&&&&};&&&&structstr_emp_ind{&&&&longal_&&&&charac_&&&&charac_&&&&doubleaf_&&&&};&&&&structstr_empstr_&&&&strcutstr_emp_indstr_emp_&&&&在取之前可用memset(&;str_emp,0,sizeof(str_emp)).清空该结构体,这样如果是&&&&字符型的NULL,会为"",整型的NULL会为0,&&&&浮点型的会为0.00。此时不会有-1405错误。&&&&(3)也可采用NVL()函数:举例如下:&&&&EXECSQLDECLAREauthorsCURSORFOR&&&&SELECTEMPNO,NVL(ENAME,chr(0)),nvl(to_char(HIREDATE,'yyyy/mm/dd&&&&hh24:mi:ss'),chr(0)),NVL(SAL,0)FROMEMP;&&&&这样也不会有-1405错误不,当取出的值是NULL时,自动用NVL()中指定的值代替.&&&&CHR(0)也可直接用''代替,如下:&&&&SELECTEMPNO,NVL(ENAME,''),nvl(to_char(HIREDATE,'yyyy/mm/dd&&&&hh24:mi:ss'),''),NVL(SAL,0)FROMEMP;&&&&5、PROC中的错误的处理&&&&所有的SQL语句都有可能出错.所以都要加以判断,但每个SQL语句后都加错误判断&&&&,太麻烦,可用一个函数如sql_error()来进行错误处理,&&&&方法:&&&&(1)定义ql_error()函数。&&&&(2)在开头加上EXECSQLWHENEVERSQLERRORDOsql_error();这样当发生&&&&sqlca.sqlcode&0的错误时,自动转到sql_error()中执行.注意:对&&&&sqlca.sqlcode&0的错误如sqlca.sqlcode=1403是不会转到sql_error()中执行的.&&&&另外:在UNIX下,可以用OERR来查找错误的描述。如:oraORA-1405查找错&&&&误号为-1405的描述.&&&&6、PROC中调用存储过程的方法&&&&要把存储过程放在EXECSQLEXECUTE和END-EXEC;之间,如下所示:&&&&其中:al_empno,ac_ename为输入参数,l_return,l_errno,c_errtext为输出参&&&&数。&&&&al_empno=8888;&&&&strcpy(ac_ename,"ABCD");&&&&EXECSQLEXECUTE&&&&BEGIN&&&&up_db_emp(:al_empno,:ac_ename,:l_return,:l_errno,:c_errtext);&&&&END;&&&&END-EXEC;&&&&if(l_return!=0)&&&&{&&&&printf("调用UP_PB_EMP存储过程出错&&&&,errno=%ld,errtext=%s\n",l_errno,c_errtext);&&&&}&&&&7、PROC的命令行选项:PROC编译器有很多的命令行选项,在命令行下直接不带&&&&参数运行PROC,会列出所有的命令行选项来,并有说明。&&&&&&&&(1)储存过程:编译储存过程是要带上用户名及密码&&&&procUSERID=scott/tigersqlcheck=SEMANTICSireclen=512iname=test.cpp&&&&(2)PARSE=NONE对非SQL代码不进行语法分析,默认对非SQL代码也进行语法分析&&&&.&&&&在REDHAD6.3上的ORACLE8.1.5中用PROC时,会提示:/USR/INCLUDE/STDIO.H及其&&&&他的.H文件中有错.可把PARSE=NONE加上,就好了.&&&&8、注意加上:EXECORACLEOPTION(RELEASE_CURSOR=YES);&&&&RELEASE_CURSOR=YES使PROC在执行完后释放与嵌入SQL有关资源,保证在该&&&&PROC执行完后,ORACLE不会锁住数据库资源,如锁表等。&&&&如果在PROC中用到ORACA,还要在头加上:&&&&EXECORACLEOPTION(ORACA=YES);&&&&9、PROC中的类型转换&&&&一、在C语言中:&&&&(1)字符型到整型可用ATOI()ATOL(),SSCANF()&&&&(2)整型,浮点型到字符型,可用SPRINTF()&&&&(3)字符型到浮点型用ATOF()不行,最好用SSCANF(),举例如下:&&&&EXECSQLBEGINDECLARESECTION;&&&&doubled_&&&&floatf_&&&&charac_text[20]="222";&&&&EXECSQLENDDECLARESECTION;&&&&(1)sscanf(ac_text,"%f",&;d_demo);&&&&printf("ac_text=%s,d_demo=%f\n",ac_text,d_demo);&&&&(2)sscanf(ac_text,"%lf",&;d_demo);&&&&printf("ac_text=%s,d_demo=%f\n",ac_text,d_demo);&&&&(3)sscanf(ac_text,"%f",&;d_demo);&&&&printf("ac_text=%s,d_demo=%lf\n",ac_text,d_demo);&&&&(4)sscanf(ac_text,"%lf",&;d_demo);&&&&printf("ac_text=%s,d_demo=%lf\n",ac_text,d_demo);&&&&printf("*******************\n");&&&&(5)sscanf(ac_text,"%f",&;f_demo);&&&&printf("ac_text=%s,f_demo=%f\n",ac_text,f_demo);&&&&(6)sscanf(ac_text,"%lf",&;f_demo);&&&&printf("ac_text=%s,f_demo=%f\n",ac_text,f_demo);&&&&(7)sscanf(ac_text,"%f",&;f_demo);&&&&printf("ac_text=%s,f_demo=%lf\n",ac_text,f_demo);&&&&(8)sscanf(ac_text,"%lf",&;f_demo);&&&&printf("ac_text=%s,f_demo=%lf\n",ac_text,f_demo);&&&&输出的结果:&&&&ac_text=222.00,d_demo=0.000000&&&&ac_text=222.00,d_demo=222.000000&&&&ac_text=222.00,d_demo=222.000032&&&&ac_text=222.00,d_demo=222.000000&&&&*******************&&&&ac_text=222.00,f_demo=222.000000&&&&ac_text=222.00,f_demo=0.000000&&&&ac_text=222.00,f_demo=222.000000&&&&ac_text=222.00,f_demo=0.000000&&&&d_demo=atof(ac_text);&&&&printf("ac_text=%s,atof(ac_text)=%f\n",ac_text,d_demo);&&&&d_demo=atof(ac_text);&&&&printf("ac_text=%s,atof(ac_text)=%lf\n",ac_text,d_demo);&&&&f_demo=atof(ac_text);&&&&printf("ac_text=%s,atof(ac_text)=%f\n",ac_text,f_demo);&&&&f_demo=atof(ac_text);&&&&printf("ac_text=%s,atof(ac_text)=%lf\n",ac_text,f_demo);&&&&输出的结果:&&&&ac_text=222.00,atof(ac_text)=000&&&&ac_text=222.00,atof(ac_text)=000&&&&ac_text=222.00,atof(ac_text)=000&&&&ac_text&&&&=222.00,atof(ac_text)=000&&&&从上面的结果可见:&&&&DOUBLE型应采用sscanf(ac_app_capcity,"%lf",&;d_app);打印用"%lf","%f"&&&&都可以.(2),(4)正确&&&&FLOAT型应采用sscanf(ac_app_capcity,"%f",&;d_app);打印用"%lf","%f"都&&&&可以.(5),(7)正确&&&&采用ATOF()转换的结果都是错的,所以不要用它。&&&&二、写表或从表中取数据时:&&&&(1)字符型与整型之间可不用转换,采用默认方式。&&&&(2)字符型与浮点型之间可不用转换,采用默认方式。&&&&(3)日期型与字符型之间可用TO_CHAR(),TO_DATE()。&&&&10、PROC中的4种动态SQL简介&&&&(1)动态SQL1:不能是(SELECT)语句,并且没有宿主变量.&&&&用法:拼一串动态SQL语句,并用EXECUTEIMMEDIATE执行,如:&&&&EXECSQLEXECUTEIMMEDIATE"CREATETABLEdyn1(col1VARCHAR2(4))";&&&&(2)动态SQL2:不能是(SELECT)语句,并且输入的宿主变量数目是知道的,&&&&用法:拼一串动态SQL语句,用PREPARE,EXECUTE语句执行.&&&&strcpy(c_sql,"DELETEFROMEMPWHEREEMPNO=:?");&&&&EXECSQLPREPAREsql_stmtFROM:c_&&&&EXECSQLEXECUTEsql_stmtUSING:emp_&&&&(3)动态SQL3:用于创建动态查询,并且要的字段及输入的宿主变量数目是&&&&知道的&&&&用法:拼一串动态SQL语句,用PREPARE分析该语句,并要定义一个CURSOR进行取值&&&&如:如要的数据按一年12月放到12张表中。表名为user_fee_1mon,&&&&user_fee_2mon,....可采用动态SQL3来进行&&&&strcpy(c_sql,"selectc_user_id,c_user_name,to_char(t_date,'yyyy/mm/dd&&&&hh:mi:ss'),n_fee\n");&&&&strcat(c_sql,"fromUSER_FEE_");&&&&strcat(c_sql,ac_mon);&&&&strcat(c_sql,"\nwherec_user_id=:v1");&&&&EXECSQLPREPAREsFROM:c_&&&&EXECSQLDECLAREcur_user_feeCURSORFORs;&&&&EXECSQLOPENcur_user_feeUSING:ac_user_&&&&while(1)&&&&{&&&&EXECSQLFETCHcur_user_feeinto&&&&:c_user_id,:c_user_name,:c_date,:n_fee);&&&&if(sqlca.sqlcode&0)&&&&{&&&&/*FETCHCURSOR失败*/&&&&printf("fetchcursorcur_user_fee&&&&fail,sqlcode=%ld,sqlserr=%s",sqlca.sqlcode,sqlca.sqlerrm.sqlerrmc);&&&&}&&&&if(sqlca.sqlcode==SQLNOTFOUND)&&&&{&&&&&&&&}&&&&}&&&&EXECSQLCLOSEcur_user_&&&&(4)动态SQL4:要处理的字段及输入的宿主变量数目和主变量的类型事先是不知道&&&&的,如:&&&&INSERTINTOEMP()VALUES()&&&&是最复杂的动态SQL,很少用,在此不做介绍。&&&&11、SQLCA:SQL是ORACLE的一个结构体,它的域用于最近的一条SQL语句执行后&&&&的一些信息,如错误号,错误描述,警告,状态等。常用的&&&&域介绍如下:&&&&SQLCA.sqlcode:错误号,=0正确,=1403没取到数据&&&&SQLCA.sqlserrm.sqlerrmc:错误描述&&&&SQLCA.sqlerrd[3]&&&&:最近的一条SQL语句所处理的行数,如果该语句处理失败,则它&&&&的值是不定的,如果错误在一个CURSOR操作中发生,则&&&&它的值指已成功处理的行数.在DELETE,UPDATE中,它不包含因外键约束而删除,更&&&&新的那些行,&&&&DELETEFROMEMPWHEREDEPT='SALE';&&&&在表EMP中删除20行,但如果表EMP与表ADDRESS有外键约束,导致表ADDRESS也被删&&&&除20行,则SQLCA.sqlerrd[3]=20,而不是40。&&&&
上一篇资讯:
下一篇资讯:
文章排行榜}

我要回帖

更多关于 排列三和值 上鼎狐网 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信