在这里我先说遇到的一个问题

在练习的例子中加入了头文件

#include

然后我怎么编译都不行,一直说找不到oraca.h

然后我把这个改成了

EXEC SQL INCLUDE oraca;

这样就顺利的编译过去了。

第一种动态SQL语句:无宿主变量的非查询语句

应用程序接收外界输入构造SQL 语句到一个字符串,然后调用

EXECUTE IMMEDIATE 命令执行这个SQL 语句。这种SQL 语句不能为SELECT 语句,不

能包含输入变量的占位符。

5.pc

#include 

#include 

EXEC SQL INCLUDE sqlca;

EXEC SQL INCLUDE oraca;

EXEC ORACLE OPTION(ORACA=YES);

EXEC ORACLE OPTION(RELEASE_CURSOR=YES);

int main(int argc, char *argv[])

{

EXEC SQL BEGIN DECLARE SECTION;

char *username = "scott";

char *passwd = "xx";

char *dynstmt1;

char dynstmt2[10];

VARCHAR dynstmt3[80];

char dynstmt4[80];

EXEC SQL END DECLARE SECTION;

oraca.orastxtf = ORASTFERR;

EXEC SQL CONNECT :username IDENTIFIED BY :passwd;

puts("CREATE TABLE dyn1 (col1 VARCHAR2(4))");

EXEC SQL EXECUTE IMMEDIATE

"CREATE TABLE dyn1 (col1 VARCHAR2(4))";

dynstmt1 = "INSERT INTO dyn1 VALUES('TEST')";

puts(dynstmt1);

EXEC SQL EXECUTE IMMEDIATE :dynstmt1;

strncpy(dynstmt2, "COMMIT", 10);

printf("%.10s\n", dynstmt2);

EXEC SQL EXECUTE IMMEDIATE :dynstmt2;

EXEC SQL COMMIT;

/*这里我自己又完全输入一个 DROP TABLE dyn1 这个字符串,来试试*/

gets(dynstmt4);

EXEC SQL EXECUTE IMMEDIATE :dynstmt4;

EXEC SQL COMMIT WORK RELEASE;

return 0;

}

第二种:已知输入变量个数的非查询语句

应用程序接受或组建一个SQL 语句,并通过PREPARE 和EXECUTE 语

句执行这个SQL。不能是查询语句。为输入宿主变量准备的占位符数目和输入宿主变量的

类型必须已知

6.pc

#include 

#include 

EXEC SQL BEGIN DECLARE SECTION;

#define USERNAME "scott"

#define PASSWD "xx"

EXEC SQL INCLUDE sqlca;

EXEC SQL INCLUDE oraca;

EXEC ORACLE OPTION(ORACA=YES);

char *username = USERNAME;

char *passwd = PASSWD;

VARCHAR dynstmt[80];

int empno = 1234;

int deptno1 = 20;

int deptno2 = 30;

EXEC SQL END DECLARE SECTION;

int main(int argc, char *argv[])

{

oraca.orastxtf = ORASTFERR;

EXEC SQL CONNECT :username IDENTIFIED BY :passwd;

strcpy(dynstmt.arr ,"INSERT INTO EMP (EMPNO, DEPTNO) VALUES (:v1, :v2)");

dynstmt.len = strlen(dynstmt.arr);

puts((char *)dynstmt.arr);

printf("v1 = %d, v2 = %d\n", empno, deptno1);

EXEC SQL PREPARE insert_sql FROM :dynstmt;

EXEC SQL EXECUTE insert_sql USING :empno, :deptno1;

EXEC SQL COMMIT;

empno ++;

EXEC SQL EXECUTE insert_sql USING :empno, :deptno2;

printf("v1 = %d, v2 = %d\n", empno, deptno2);

EXEC SQL COMMIT;

strcpy(dynstmt.arr, "DELETE FROM EMP WHERE EMPNO = :v1");

dynstmt.len = strlen(dynstmt.arr);

EXEC SQL PREPARE delete_sql FROM :dynstmt;

EXEC SQL EXECUTE delete_sql USING :empno;

EXEC SQL COMMIT WORK RELEASE;

return 0;

}

这个就是语句中带有宿主变量的,也就是说,我们一开始不知道要删除哪个,后来通过别的渠道给定要删除的这个条件。

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐