Oracle Prc C学习 之 Oracle动态SQL

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

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

#include <oraca.h>

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

然后我把这个改成了

EXEC SQL INCLUDE oraca;

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

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

应用程序接收外界输入构造SQL 语句到一个字符串,然后调用
EXECUTE IMMEDIATE 命令执行这个SQL 语句。这种SQL 语句不能为SELECT 语句,不
能包含输入变量的占位符。

5.pc

#include <stdio.h>
#include <string.h>
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 <stdio.h>
#include <string.h>
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);

/* 这里我还是通过从终端输入一个值来执行 */  
    char temp[10];
    gets(temp);
    empno = atoi(temp);
    EXEC SQL PREPARE delete_sql FROM :dynstmt;
    EXEC SQL EXECUTE delete_sql USING :empno;
    EXEC SQL COMMIT WORK RELEASE;
    return 0;
}

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

第三种: 通过接受或构建SQL 语句,用DELCARE、PREPARE 和OPEN、FETCH、CLOSE 语句执行动态查询SQL 语句,

并访问查询结构。
适用于已知 SELECT 查询语句查询的各列、列类型、输入宿主变量数目、输入宿主变
量类型的情况

7.pc

  #include <stdio.h>
#include <string.h>
EXEC SQL BEGIN DECLARE SECTION;
EXEC SQL INCLUDE sqlca;
EXEC SQL INCLUDE oraca;
EXEC ORACLE OPTION(ORACA=YES);
#define USERNAME "scott"
#define PASSWD "xx"
char *username = USERNAME;
char *passwd = PASSWD;
VARCHAR dynstmt[80];
VARCHAR ename[10];
EXEC SQL END DECLARE SECTION;
int main(int argc, char *argv[])
{
    EXEC SQL BEGIN DECLARE SECTION;
    int deptno = 10;
    EXEC SQL END DECLARE SECTION;
    oraca.orastxtf = ORASTFERR;
    EXEC SQL CONNECT :username IDENTIFIED BY :passwd;
    strcpy(dynstmt.arr, "SELECT ename FROM EMP WHERE deptno = :v1");
    dynstmt.len = strlen(dynstmt.arr);
    EXEC SQL PREPARE select_sql FROM :dynstmt;
    EXEC SQL DECLARE select_cur CURSOR FOR select_sql; 
 
/*自己输入要找的条件来查找*/
    char temp[10];
    gets(temp);
    deptno = atoi(temp); 
    EXEC SQL OPEN select_cur USING :deptno;
    EXEC SQL WHENEVER NOT FOUND DO break;
    while (1) {
        EXEC SQL FETCH select_cur INTO :ename;
        ename.arr[ename.len] = ‘\0‘;
        puts((char *)ename.arr);
    }
    printf("\nQuery returned %d row %s.\n\n", sqlca.sqlerrd[2],
            (sqlca.sqlerrd[2] == 1)?"":"s");
    EXEC SQL CLOSE select_cur;
    EXEC SQL COMMIT WORK RELEASE;
    return 0;
}
时间: 2024-08-03 07:49:36

Oracle Prc C学习 之 Oracle动态SQL的相关文章

MyBatis学习总结_11_MyBatis动态Sql语句

MyBatis中对数据库的操作,有时要带一些条件,因此动态SQL语句非常有必要,下面就主要来讲讲几个常用的动态SQL语句的语法 MyBatis中用于实现动态SQL的元素主要有: if choose(when,otherwise) trim where set foreach 1.if 对属性进行判断,如果不为空则执行判断条件 [html] view plaincopy <select id="selectByCriteria" parameterType="com.mu

MyBatis学习总结(六)——动态SQL

MyBatis的动态SQL是基于OGNL表达式的,它可以帮助我们方便的在SQL语句中实现某些逻辑. MyBatis中用于实现动态SQL的元素主要有: if choose(when,otherwise) foreach where set trim 下面我们主要说 where set trim 这三个标签 1,where标签 <!-- 查询学生list,like姓名,=性别 --> <select id="getStudentListWhere" parameterTy

【MyBatis学习07】动态sql

1. 动态sql 动态sql是mybatis中的一个核心,什么是动态sql?动态sql即对sql语句进行灵活操作,通过表达式进行判断,对sql进行灵活拼接.组装.就拿上一篇博文中对用户的综合查询一例来说: select * from user where user.sex = #{user.sex} and user.username like '%${user.username}%' 假如这个user是null咋整?或者user.sex或者user.username为null呢?所以更严谨的做

Oracle Prc C学习 二

声明一个游标变量 EXEC SQL BEGIN DECLARE SECTION; SQL_CURSOR emp_cursor; sql_cursor dept_cursor; EXEC SQL END DECLARE SECTION; 这样定义后,如果使用前先要分配资源用ALLOCATE EXEC SQL ALLOCATE :emp_cursor; EXEC SQL ALLOCATE :dept_cursor; 使用完后,要关闭 EXEC SQL CLOSE :emp_cursor; EXEC

Oracle Prc C学习 五 事务

这个事务刚开始的时候我很不理解, 我以为是这个事务是一种结构,或者是一个package或者一个procedure, 后来我觉得我想明白点了,其实这个事务只是一件我要完成的事,这件事我不然就完成,要不然就没完成,没完成就回到开始 的状态,或者回到一个你设定的状态那. 如果在程序中就是一个SQL语句开始了,就开始了一个事务,当你觉得这个事务完成了,就调用COMMIT,这就是完成了 一个事务了,当然了,也可以用ROLLBACK,就是回滚这个事务做的事.也就当这个事务完成了,这个完成就是失败的完成 应该

Oracle 动态SQL语句

Oracle 动态SQL语句 (2012-06-18 16:36:12) 转载▼ 标签: oracle it   EXECUTE IMMEDIATE代替了以前Oracle8i中DBMS_SQLpackage包. 它解析并马上执行动态的SQL语句或非运行时创建的PL/SQL块.动态创建和执行SQL语句性能超前,EXECUTEIMMEDIATE的目标在于减小企业费用并获得较高的性能,较之以前它相当容易编码.尽管DBMS_SQL仍然可用,但是推荐使用EXECUTEIMMEDIATE,因为它获的收益在包

使用Oracle的DBMS_SQL包执行动态SQL语句

使用Oracle的DBMS_SQL包执行动态SQL语句 引用自:http://blog.csdn.net/ggjjzhzz/archive/2005/10/17/507880.aspx 引用自:http://www.cnblogs.com/simonhaninmelbourne/archive/2013/01/23/2872438.html 在某些场合下,存储过程或触发器里的SQL语句需要动态生成.Oracle的DBMS_SQL包可以用来执行动态SQL语句.本文通过一个简单的例子来展示如何利用D

【oracle】入门学习(一)

一直想学oracle但都没有下定决心.这次借了书,一定要学好oracle. 目前学习 <Oracle从入门到精通> 明日科技 的Oracle 11g 版本 关系型数据库的基本理论 数据模型:层次模型.网状模型.关系模型(最普及) 关系:由行和列交叉组成的二维表格,一行为一个元组,代表一个实体:一列为一个属性 关系的性质: ①属性值不可分解 ②没有重复的元组,即没有重复的行 ③理论上没有行序,有时候也可以有行序 ④超键:在一个关系中,唯一标示元组的属性或属性集 ⑤候选键:能唯一标示元组,且不含多

PL/SQL开发中动态SQL的使用方法

一般的PL/SQL程序设计中,在DML和事务控制的语句中可以直接使用SQL,但是DDL语句及系统控制语句却不能在PL/SQL中直接使用,要想实现在PL/SQL中使用DDL语句及系统控制语句,可以通过使用动态SQL来实现. 首先我们应该了解什么是动态SQL,在Oracle数据库开发PL/SQL块中我们使用的SQL分为:静态SQL语句和动态SQL语句.所谓静态SQL指在PL/SQL块中使用的SQL语句在编译时是明确的,执行的是确定对象.而动态SQL是指在PL/SQL块编译时SQL语句是不确定的,如根