下载此文档

01 Oracle数据库PROC编程介绍.docx


文档分类:IT计算机 | 页数:约8页 举报非法文档有奖
1/8
下载提示
  • 1.该资料是网友上传的,本站提供全文预览,预览什么样,下载就什么样。
  • 2.下载该文档所得收入归上传者、原创者。
  • 3.下载的文档,不会出现我们的网址水印。
1/8 下载此文档
文档列表 文档介绍
该【01 Oracle数据库PROC编程介绍 】是由【mazhuangzi1】上传分享,文档一共【8】页,该文档可以免费在线阅读,需要了解更多关于【01 Oracle数据库PROC编程介绍 】的内容,可以使用淘豆网的站内搜索功能,选择自己适合的文档,以下文字是截取该文章内的部分文字,如需要获得完整电子版,请下载此文档到您的设备,方便您编辑和打印。PROC是ORACLE数据库提供的编程接口之一,其应用十分的广泛,本文通过一个具体的例子,介绍PROC编程的一些经验及应注意的地方。
例子程序:
#include
#include
#include
#include
#include
EXECSQLINCLUDEsqlca;
/*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,,(char*));
EXECSQLROLLBACKRELEASE;
exit(-1);
}
main()
{
EXECSQLWHENEVERSQLERRORDOsql_error("ORACLEERROR:");
/*连接数据库*/
strcpy(,"scott/******@DEMO");
=16;
execsqlconnect:vc_user;
EXECSQLDECLAREcur_empCURSORFOR
SELECTEMPNO,ENAME,to_char(HIREDATE,'yyyy/mm/ddhh24:mi:ss'),SALFROMEMP;
EXECSQLOPENcur_emp;
while(1)
{
al_empno=0;
strcpy(ac_ename,"");
strcpy(ac_hiredate,"");
af_sal=0;
EXECSQLFETCHcur_emp
INTO:al_empno,:ac_ename:ename_ind,:ac_hiredate:hiredate_ind,:af_sal:sal_ind;
if(==1403)
{
break;
}
printf("empno=%ld,ename=%s,hiredate=%s,sal=%lf\n",al_empno,ac_ename,ac_hiredate,af_sal);
}
EXECSQLCLOSEcur_emp;
EXECSQLROLLBACKWORKRELEASE;
}
1、宿主变量的声明
在PROC中,在SQL语句中用到的变量称为宿主变量。他们应在EXECSQLBEGINDECLARE
SECTION;与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('123456789O1');会出现以下错误:
error:ORA-01401:插入的值对于列过大。
当插入的字符串长度大于15,如:EXECSQLINSERTINTOEMP(ENAME)VALUES('12345678901234');会出现以下错误:
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)对浮点型的变量,为保证精度,
型高很多.
整型可声明为LONG型(对较长的整型,而且所用的平台支持的话,如在SUN平台上,可声明为LONGLONG型).
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(,"scott/tiger");
=11;
execsqlconnect:vc_user;
(2)
strcpy(user,"scott");
strcpy(pass,"tiger");
execsqlconnect:useridentifiedby:pass;
注意:在有些平台上两种都可以,在有些平台上只能用第一种方法.
在PROC程序中,要记住用EXECSQLROLLBACKWORKRELEASE断开与数据库的连接,并释放相
关的数据库资源。
4、PROC中的NULL值的处理
如果某一字段取出的值是NULL,会报:sqlcode=-1405,sqlerr=ORA-01405:读取的列值为NULL
并且相应的宿主变量的值不会被改变,:
采用指示器变量,此时不会有-1405错误,当必须是所以为NULL的字段都有相应的指示器变量,如果某一字段没有指示器变量,但取出的值
为NULL值,则仍然会有-1405错误•当取出的值是NULL时,相应的指示器变量变量为-1,可根据指示器变量的值做响应的处理。
如果字段较多,:
structstr_emp{
longal_empno;
charac_ename;
charac_hiredate;
doubleaf_sal;
};
structstr_emp_ind{
longal_empno;
charac_ename;
charac_hiredate;
doubleaf_sal;
};
structstr_empstr_emp;
strcutstr_emp_indstr_emp_ind;
在取之前可用memset(&str_emp,0,sizeof(str_emp)).清空该结构体,这样如果是字符型的NULL,会为"”,整型的NULL会为0,
。此时不会有-1405错误。
(3)也可采用NVL()函数:举例如下:
EXECSQLDECLAREauthorsCURSORFOR
SELECT EMPNO, NVL(ENAME,chr(0)),nvl(to_char(HIREDATE,'yyyy/mm/dd
hh24:mi:ss'),chr(0)),NVL(SAL,0)FROMEMP;
这样也不会有-1405错误不,当取出的值是NULL时,自动用NVL()中指定的值代替.
CHR(O)也可直接用”代替,如下:
SELECTEMPNO,NVL(ENAME,''),nvl(to_char(HIREDATE,'yyyy/mm/ddhh24:mi:ss'),''),NVL(SAL,0)FROMEMP;
5、 PROC中的错误的处理
所有的SQL语句都有可能出错•所以都要加以判断,但每个SQL语句后都加错误判断,太麻烦,可用一个函数如sql_error()来进行错误处理,
方法:
定义ql_error()函数。
在开头加上EXECSQLWHENEVERSQLERRORDOsql_error();<0的错误时,程序自动转到sql_error():>=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,会列出所有的命令行选项来,并有说明。
储存过程:编译储存过程是要带上用户名及密码
procUSERID=scott/tigersqlcheck=SEMANTICSireclen=512iname=
PARSE=NONE对非SQL代码不进行语法分析,默认对非SQL

01 Oracle数据库PROC编程介绍 来自淘豆网m.daumloan.com转载请标明出处.

相关文档 更多>>
非法内容举报中心
文档信息
  • 页数8
  • 收藏数0 收藏
  • 顶次数0
  • 上传人mazhuangzi1
  • 文件大小15 KB
  • 时间2022-10-16
最近更新