pro*c 动态sql三

  1. 这种方法可以执行包括查询语句在内的动态SQL语句, 但它要求在预编译时刻动态SQL语句内选择列表项数,输入宿主变量占位符数据以及输入宿主变量的数据类型必须确定。 方法三以游标方式执行动态SQL语句, 它对SQL语句的处理过程为:   
  2. ①. 准执行PREPARE命令准备SQL语句;   
  3. #实际就是把要执行的动态语句调入内存, 以   
  4. 便以后对它进行操作。   
  5. ②. 执行DECLARE命令声明游标;   
  6. ③. 执行OPEN打开游标;   
  7. ④. 调用FETCH语句提取游标;   
  8. ⑤. 调用CLOSE语句关闭游标。   
  9. 动态SQL语句中的数据库对象名称和列名可以在运行时刻指定, 便此时不能以宿主变量形式指定对象名称或列名.   
  10. 其实就是多了一个游标的使用。   
  11. 如下面程序:   
  12. <连接数据库>;   
  13. strcpy(sql_stmt, "SELECT name, address, sex FROM test001");   
  14. EXEC SQL PREPARE select_stmt FROM :sql_stmt;   
  15. EXEC SQL DECLARE c1 CURSOR FOR select_stmt;   
  16. EXEC SQL OPEN c1;   
  17. EXEC SQL WHENEVER NOT FOUND DO BREAK;   
  18. while(1)   
  19. Oracle Pro*C 编程入门   
  20. {   
  21. EXEC SQL FETCH c1 INTO :Name, :address, :sex;   
  22. printf("The name is: %s, The Address is: %s, The sex is :%s\n", Name, address,   
  23. sex);   
  24. }   
  25. EXEC SQL CLOSE c1;   
  26. #include <stdio.h>
    #include <string.h>
    #include <stdlib.h>
    #include <sqlca.h>
    void connect();
    void sql_err();
    
    void dynamic_sqlthree();
    
    void main()
    {
       EXEC SQL WHENEVER SQLERROR  DO sql_err();
       connect();
       dynamic_sqlthree();
       EXEC SQL COMMIT RELEASE;
    }
    
    void sql_err()
    {
      //printf("%.*s\n",sqlca.sqlerrm.sqlerrml,,sqlca.sqlerrm.sqlerrmc);
    }
    
    
    void connect()/*数据库连接-本地数据库,不添加server*/
    {
      EXEC SQL BEGIN DECLARE SECTION;
      VARCHAR oraCN[30];
      EXEC SQL END DECLARE SECTION;
      strcpy(oraCN.arr,"scott/Tiger@TEST_dist");
      EXEC SQL CONNECT :oraCN;
    }
    
     
    
    void dynamic_sqlthree()
    {
        EXEC SQL BEGIN DECLARE SECTION;
        char name[10];
        int  salary;
        int  dno;
        EXEC SQL END DECLARE SECTION;
        printf("input deptno u want to view: ");
        scanf("%d",&dno);
        getchar();
        EXEC SQL PREPARE stat FROM 'SELECT sal,ename from emp  WHERE deptno=:a';
        EXEC SQL DECLARE emp_cursor CURSOR FOR stat;
        EXEC SQL OPEN emp_cursor USING :dno;
        EXEC SQL WHENEVER NOT FOUND DO break;
        for(;;)
        {
           EXEC SQL FETCH emp_cursor INTO :salary,:name;
           printf("name: %s,salary: %d\n",name,salary);
        }
        EXEC SQL CLOSE emp_cursor;
    
    }
    
    
     
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值