有谁知道为什么我的执行立即不能在PRO * C中编译?

时间:2015-05-13 11:12:28

标签: sql c oracle embedded-sql

任何人都可以在以下PRO * C代码中弄清楚我的错误是什么?我无法编译:

int v1 = 5096;
int v2 = 8110;
int v3 = 8111;
int v4 = -1;
char stmt[6000];

strcpy(stmt, " MERGE INTO LDX_STYLE_MOVEMENTS ssd  USING (SELECT :1 pk from dual) ssd_pk   ON (ssd.style_movements_pk = ssd_pk.pk)  WHEN NOT MATCHED THEN insert (style_movements_pk, style, from_subclass, to_subclass, reclassified_date, change_type_fk) values(LDX_STYLE_MOVEMENTS_SEQ.nextval , null, :2, :3, null, :4 )");   

EXEC SQL execute immediate  :stmt using :v1, :v2, :v3, :v4;

1 个答案:

答案 0 :(得分:2)

EXECUTE IMMEDIATEdynamic SQL method 1)不支持USING条款。

您可以改为准备并执行它(使用dynamic SQL method 2):

EXEC SQL PREPARE ora_stmt FROM :stmt;
EXEC SQL EXECUTE stmt USING :v1, :v2, :v3, :v4;

看起来你根本不需要动态地执行此操作,但如果您选择这样做,那么您需要使用适当的方法。

文档中的更多详细信息:

  

方法1解析,然后使用EXECUTE IMMEDIATE命令立即执行SQL语句。该命令后跟一个包含要执行的SQL语句的字符串(主机变量或文字),该字符不能是查询。

     

EXECUTE IMMEDIATE语句的语法如下:

EXEC SQL EXECUTE IMMEDIATE { :host_string | string_literal };

...

  

使用方法2,SQL语句可以包含输入主变量和指示符变量的占位符......

     

PREPARE语句的语法如下:

EXEC SQL PREPARE statement_name 
    FROM { :host_string | string_literal }; 
     

PREPARE解析SQL语句并为其命名。

     

statement_name是预编译器使用的标识符,而不是主机或程序变量,不应在Declare Section中声明。它只是指定您想要执行的PREPAREd语句。

     

EXECUTE语句的语法是

EXEC SQL EXECUTE statement_name [USING host_variable_list];
     

其中host_variable_list代表以下语法:

:host_variable1[:indicator1] [, host_variable2[:indicator2], ...] 
     

EXECUTE使用为每个输入主机变量提供的值执行已解析的SQL语句。