任何人都可以在以下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;
答案 0 :(得分:2)
EXECUTE IMMEDIATE
(dynamic 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语句。