📄 script_86_proc_witherrorprocess.txt
字号:
---------- .txt ----------
/*
范例名称:使用demo_proc.mk编译连接PRO*C程序
文件名称:
*/
make -f demo_proc.mk .pc文件名
--注意:本部分练习使用sm_emp,scott用户内置emp表
---------- create_table_sm.txt ----------
--sm_emp建表语句
create table sm_emp
(EmpID char(10) primary key,
Name varchar2(10),
salary number(8,2),
TelNo char(8));
insert into sm_emp values('0000000007','007',77,'77777777');
insert into sm_emp values('0000000009','009',99,'99999999');
---------- connect.pc ----------
/*
* name:pro*c c程序,使用scott完成数据库连接,并取回sysdate显示
* file name :connect.pc
*/
/*必须首先包含相应头文件*/
#include <stdlib.h>
#include <stdio.h>
/*宿主变量声明区*/
EXEC SQL BEGIN DECLARE SECTION;
/*VARCHAR型必须指定长度*/
/*如果不指定长度,编译报错*/
/*VARCHAR v_date*/
VARCHAR v_date[20];
/*用户USERNAME,PASSWORD*/
char* userid;
EXEC SQL END DECLARE SECTION;
/*需包含SQLCA.H,使用以下两种方法都可以*/
/*EXEC SQL INCLUDE SQLCA.H;*/
#include <sqlca.h>
int main(int argc, char *argv[])
{
/*用户USERNAME和PASSWORD*/
userid="scott/tiger";
/*使用用户名,口令连接本地服务器*/
EXEC SQL CONNECT :userid;
printf("user scott connected to oracle\n");
/*嵌入式SQL语句取得sysdate*/
EXEC SQL SELECT SYSDATE INTO :v_date FROM DUAL;
/*在c语言中引用varchar变量的成员:v_date.arr*/
/*须指定printf的显示格式为%s,字符串*/
printf("get sysdate :%s",v_date.arr);
/*在c语言中引用varchar变量的成员:v_date.len*/
printf("\nget sysdate lenth:%d",v_date.len);
/*结束数据库连接,commit*/
EXEC SQL COMMIT WORK RELEASE;
printf ("\nEnd of the Pro*C Sample example program.\n");
return 0;
}
---------- dml.pc ----------
/*
* name:pro*c c程序,使用scott完成数据库连接,向sm_emp插入
* file name :dml.pc
*/
/*必须首先包含相应头文件,stdlib.h中包括了string.h*/
#include <stdlib.h>
#include <stdio.h>
/*宿主变量声明区*/
EXEC SQL BEGIN DECLARE SECTION;
/*VARCHAR型必须指定长度*/
/*如果不指定长度,编译报错*/
/*VARCHAR v_id*/
VARCHAR v_id[10];
VARCHAR v_name[10];
VARCHAR v_telno[8];
float f_sal;
/*用户USERNAME,PASSWORD*/
char* userid;
EXEC SQL END DECLARE SECTION;
/*需包含SQLCA.H,使用以下两种方法都可以*/
/*EXEC SQL INCLUDE SQLCA.H;*/
#include <sqlca.h>
int main(int argc, char *argv[])
{
/*用户USERNAME和PASSWORD*/
userid="scott/tiger";
server = "ora8";
/*使用用户名,口令连接本地服务器*/
EXEC SQL CONNECT :userid;
printf("user scott connected to oracle\n");
/*方法1:嵌入式SQL语句插入纪录 empid='0000000008'
EXEC SQL INSERT INTO SM_EMP (empid,name,salary,telno) VALUES('0000000008','008',888,'88888888');
printf("\ninsert ok");
*/
/*方法2:使用宿主变量,插入数据*/
/*v_id.arr="0000000008";编译出错!*/
/*strcpy完成对varchar赋字符串*/
strcpy((char *)v_id.arr,"0000000008");
/*strlen完成对varchar.len赋值,如果未赋值varchar.len,只赋值varchar.arr插入可能不成功*/
v_id.len = (short) strlen((char *)v_id.arr);
strcpy((char *)v_name.arr,"008");
v_name.len = (short) strlen((char *)v_name.arr);
strcpy((char *)v_telno.arr,"88888888");
v_telno.len = (short) strlen((char *)v_telno.arr);
f_sal = 888;
/*即使是varchar宿主变量,在嵌入式sql中也只用:宿主变量名引用(如:v_id),不必指明其.arr*/
EXEC SQL INSERT INTO SM_EMP (empid,name,salary,telno) VALUES(:v_id,:v_name,:f_sal,:v_telno);
/*EXEC SQL INSERT INTO SM_EMP (empid,name,salary,telno) VALUES(:v_id,'008',888,'88888888');*/
printf("\ninsert ok");
EXEC SQL DELETE FROM sm_emp WHERE empid='0000000007';
/*delete record*/
printf("\ndelete ok");
/*结束数据库连接,commit*/
EXEC SQL COMMIT WORK RELEASE;
printf ("\nEnd of the Pro*C Sample example program.\n");
return 0;
}
---------- error_process_r.pc ----------
/*
* name:pro*c c程序,使用scott完成数据库连接,向sm_emp插入
* file name :error_process_r.pc
*/
/*必须首先包含相应头文件,stdlib.h中包括了string.h*/
#include <stdlib.h>
#include <stdio.h>
/*宿主变量声明区*/
EXEC SQL BEGIN DECLARE SECTION;
/*VARCHAR型必须指定长度*/
/*如果不指定长度,编译报错*/
/*VARCHAR v_id*/
VARCHAR v_id[10];
VARCHAR v_name[10];
VARCHAR v_telno[8];
float f_sal;
/*用户USERNAME,PASSWORD*/
char* userid;
/*字符指针存储service名*/
char* server;
EXEC SQL END DECLARE SECTION;
/*需包含SQLCA.H,使用以下两种方法都可以*/
/*EXEC SQL INCLUDE SQLCA.H;*/
#include <sqlca.h>
int main(int argc, char *argv[])
{
/*用户USERNAME和PASSWORD*/
userid="scott/tiger";
server = "ora8";
/*运行时错误处理语句,出现sql错误跳到标号errexit,处理错误*/
EXEC SQL WHENEVER SQLERROR GOTO errexit;
/*使用用户名,口令连接本地服务器
EXEC SQL CONNECT :userid;*/
/*使用service名连接远端服务器*/
EXEC SQL CONNECT :userid USING :server;
printf("user scott connected to oracle\n");
/*方法1:嵌入式SQL语句插入纪录 empid='0000000008'
EXEC SQL INSERT INTO SM_EMP (empid,name,salary,telno) VALUES('0000000008','008',888,'88888888');
printf("\ninsert ok");
*/
/*方法2:使用宿主变量,插入数据*/
/*v_id.arr="0000000008";编译出错!*/
/*strcpy完成对varchar赋字符串*/
strcpy((char *)v_id.arr,"0000000008");
/*strlen完成对varchar.len赋值,如果未赋值varchar.len,只赋值varchar.arr插入可能不成功*/
v_id.len = (short) strlen((char *)v_id.arr);
strcpy((char *)v_name.arr,"008");
v_name.len = (short) strlen((char *)v_name.arr);
strcpy((char *)v_telno.arr,"88888888");
v_telno.len = (short) strlen((char *)v_telno.arr);
f_sal = 888;
/*即使是varchar宿主变量,在嵌入式sql中也只用:宿主变量名引用(如:v_id),不必指明其.arr*/
EXEC SQL INSERT INTO SM_EMP (empid,name,salary,telno) VALUES(:v_id,:v_name,:f_sal,:v_telno);
/*EXEC SQL INSERT INTO SM_EMP (empid,name,salary,telno) VALUES(:v_id,'008',888,'88888888');*/
printf("\ninsert ok");
EXEC SQL DELETE FROM sm_emp WHERE empid='0000000007';
/*delete record*/
printf("\ndelete ok");
/*结束数据库连接,commit*/
EXEC SQL COMMIT WORK RELEASE;
printf ("\nEnd of the Pro*C Sample example program.\n");
return 0;
errexit:
/*错误处理语句,显示sqlca.sqlerrm.sqlerrmc中的信息*/
printf("%.70s \n", sqlca.sqlerrm.sqlerrmc);
printf("%d\n", -sqlca.sqlcode);
/*截断WHENEVER SQLERROR GOTO errexit的作用范围,变为WHENEVER SQLERROR CONTINUE*/
EXEC SQL WHENEVER SQLERROR CONTINUE;
/*ROLLBACK,并断开连接*/
EXEC SQL ROLLBACK WORK RELEASE;
return;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -