使用动态 SQL 方法2 执行DDL语句失败ORA-01027_MySQL, Oracle及数据库讨论区_Weblogic技术|Tuxedo技术|中间件技术|Oracle论坛|JAVA论坛|Linux/Unix技术|hadoop论坛_联动北方技术论坛  
网站首页 | 关于我们 | 服务中心 | 经验交流 | 公司荣誉 | 成功案例 | 合作伙伴 | 联系我们 |
联动北方-国内领先的云技术服务提供商
»  游客             当前位置:  论坛首页 »  自由讨论区 »  MySQL, Oracle及数据库讨论区 »
总帖数
4
每页帖数
101/1页1
返回列表
0
发起投票  发起投票 发新帖子
查看: 6672 | 回复: 3   主题: 使用动态 SQL 方法2 执行DDL语句失败ORA-01027        下一篇 
jpf_126
注册用户
等级:下士
经验:154
发帖:7
精华:0
注册:2012-4-10
状态:离线
发送短消息息给jpf_126 加好友    发送短消息息给jpf_126 发消息
发表于: IP:您无权察看 2012-4-12 9:58:22 | [全部帖] [楼主帖] 楼主

使用动态 SQL 方法2 执行DDL语句失败ORA-01027

问题描述
====================

您使用的是动态SQL方法2执行DDL语句包含绑定变量。当你执行程序,你碰到了Oracle错误ORA-01027:数据定义操作部允许绑定变量。

问题说明:
====================

在这个例子中,尝试使用动态SQL方法2创建一个视图。其结果是ORA-01027错误。

#define USERNAME "SCOTT"
#define PASSWORD "TIGER"
#include
#include
EXEC SQL INCLUDE sqlca;
EXEC SQL INCLUDE oraca;
EXEC ORACLE OPTION (ORACA=YES);
EXEC SQL BEGIN DECLARE SECTION;
char *username = USERNAME;
char *password = PASSWORD;
VARCHAR sqlstmt[80];
varchar myempno[7];
EXEC SQL END DECLARE SECTION;
main()
{
      EXEC SQL WHENEVER SQLERROR GOTO sqlerror;
      oraca.orastxtf = ORASTFERR;
      EXEC SQL CONNECT :username IDENTIFIED BY :password;
      puts((char *) "\nConnected to ORACLE.\n");
      strcpy(myempno.arr, "'7%'");
      myempno.len=strlen(myempno.arr);
      strcpy((char *) sqlstmt.arr,
      "CREATE VIEW cpview AS SELECT empno FROM emp WHERE empno LIKE :v1");
      sqlstmt.len = strlen((char *) sqlstmt.arr);
      puts((char *) sqlstmt.arr);
      printf(" v1 = %s\n", myempno.arr);
      EXEC SQL PREPARE S FROM :sqlstmt;
      EXEC SQL EXECUTE S USING :myempno;
      EXEC SQL COMMIT RELEASE;
      puts((char *) "\nHave a good day!\n");
      exit(0);
      sqlerror:
      printf("\n%.*s\n", sqlca.sqlerrm.sqlerrml,
      sqlca.sqlerrm.sqlerrmc);
      printf("in \"%.*s...\"\n", oraca.orastxt.orastxtl,
      oraca.orastxt.orastxtc);
      printf("on line %d of %.*s.\n\n", oraca.oraslnr,
      oraca.orasfnm.orasfnml,
      oraca.orasfnm.orasfnmc);
      EXEC SQL WHENEVER SQLERROR CONTINUE;
      EXEC SQL ROLLBACK RELEASE;
      exit(1);
}


解决方案描述:
=====================

这应该返回一个ORA-01027错误,因为你不能有数据定义语句中的绑定变量。为了解决这个问题,您可以连接到主机变量值的语句的其余部分,这样问题将在运行前将得到解决。然后,您可以使用动态SQL方法1,执行该语句。

解决方案说明:
=====================

例如:

这里是代码的更正版本的问题。

#define USERNAME "SCOTT"
#define PASSWORD "TIGER"
#include
#include
EXEC SQL INCLUDE sqlca;
EXEC SQL INCLUDE oraca;
EXEC ORACLE OPTION (ORACA=YES);
EXEC SQL BEGIN DECLARE SECTION;
char *username = USERNAME;
char *password = PASSWORD;
VARCHAR sqlstmt[80];
varchar myempno[7];
EXEC SQL END DECLARE SECTION;
main()
{
EXEC SQL WHENEVER SQLERROR GOTO sqlerror;
oraca.orastxtf = ORASTFERR;
EXEC SQL CONNECT :username IDENTIFIED BY :password;
puts((char *) "\nConnected to ORACLE.\n");
strcpy(myempno.arr, "'7%'");
myempno.len=strlen(myempno.arr);
strcpy((char *) sqlstmt.arr,
"CREATE VIEW cpview AS SELECT empno FROM emp WHERE empno LIKE ");
strcat(sqlstmt.arr, myempno.arr);
sqlstmt.len = strlen((char *) sqlstmt.arr);
puts((char *) sqlstmt.arr);
EXEC SQL EXECUTE IMMEDIATE :sqlstmt;
EXEC SQL COMMIT RELEASE;
puts((char *) "\nHave a good day!\n");
exit(0);
sqlerror:
printf("\n%.*s\n", sqlca.sqlerrm.sqlerrml,
sqlca.sqlerrm.sqlerrmc);
printf("in \"%.*s...\"\n", oraca.orastxt.orastxtl,
oraca.orastxt.orastxtc);
printf("on line %d of %.*s.\n\n", oraca.oraslnr,
oraca.orasfnm.orasfnml,
oraca.orasfnm.orasfnmc);
EXEC SQL WHENEVER SQLERROR CONTINUE;
EXEC SQL ROLLBACK RELEASE;
exit(1);




赞(0)    操作        顶端 
你会玩卡五星
注册用户
等级:下士
经验:187
发帖:0
精华:0
注册:2016-2-17
状态:离线
发送短消息息给你会玩卡五星 加好友    发送短消息息给你会玩卡五星 发消息
发表于: IP:您无权察看 2016-3-21 10:25:52 | [全部帖] [楼主帖] 2  楼

明白了一些



赞(0)    操作        顶端 
美炸了的菇凉
注册用户
等级:上士
经验:315
发帖:0
精华:0
注册:2016-2-17
状态:离线
发送短消息息给美炸了的菇凉 加好友    发送短消息息给美炸了的菇凉 发消息
发表于: IP:您无权察看 2016-3-22 20:26:05 | [全部帖] [楼主帖] 3  楼

学到了!



赞(0)    操作        顶端 
步步惊心
注册用户
等级:列兵
经验:115
发帖:0
精华:0
注册:2016-2-17
状态:离线
发送短消息息给步步惊心 加好友    发送短消息息给步步惊心 发消息
发表于: IP:您无权察看 2016-3-22 23:09:34 | [全部帖] [楼主帖] 4  楼

赞一个!学到了好多!



赞(0)    操作        顶端 
总帖数
4
每页帖数
101/1页1
返回列表
发新帖子
请输入验证码: 点击刷新验证码
您需要登录后才可以回帖 登录 | 注册
技术讨论