0

谁能弄清楚我在以下 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;
4

1 回答 1

2

EXECUTE IMMEDIATE动态 SQL 方法 1)不支持该USING子句。

您可以改为准备并执行它(使用动态 SQL 方法 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 是预编译器使用的标识符,而不是主机或程序变量,不应在声明部分中声明。它只是指定您想要执行的 PREPAREd 语句。

EXECUTE 语句的语法是

EXEC SQL EXECUTE statement_name [USING host_variable_list];

其中 host_variable_list 代表以下语法:

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

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

于 2015-05-13T11:32:14.193 回答