db2 在免费RPG中的嵌入式SQL中为数据库文件使用变量

xlpyo6sf  于 2023-08-05  发布在  DB2
关注(0)|答案(1)|浏览(169)

我想写一个sql statment,工程无论什么数据文件是想要的。示例:
exec sql select * from:variable;
我在“:““令牌无效时收到SQL 0104错误。有效令牌:(NEW FINAL TABLE UNNEST LATERAL MLTABLE JSON_TABLE”
我尝试在不同的语句中使用“insert into:variable”来执行此操作,但得到了相同的错误。这是不可能的,我必须把数据库文件硬编码到我的代码中,还是有办法解决?谢啦,谢啦

iaqfqrcu

iaqfqrcu1#

不能使用带有可变表名的 * 静态SQL*。
您需要通过EXECUTE IMMEDIATEPREPAREEXECUTE使用 * 动态SQL*

wMySql = 'insert into ' + wTableName + ' values (1,''ABC'')';

exec SQL
  execute immediate :wMySql;

字符串
注意,SELECT * FROM TABLE不是一个可以动态运行的语句。因此,静态版本没有意义。SELECT ... INTO :myData FROM MYTABLE是有效的静态语句,但不能动态使用。相反,您需要使用可以动态运行的VALUES (SELECT * from MYTABLE) into :myData
下面是一个使用dynamic SQL的IBM示例。注意,通常你会看到FETCH在一个循环中返回多行,正如所写的,这将只返回第一行,然后结束。这也显示了替换变量?在语句中的使用。这是一个最佳实践,因为它可以防止SQL注入攻击。但是请注意,不能对表名或列名使用替换变量。

//**************************************************
//* Declare program variables.                     *
//* STMT initialized to the                        *
//* listed SQL statement.                          *
//**************************************************
DCL-S EMPNUM CHAR(6);
DCL-S NAME CHAR(15);
DCL-S STMT CHAR(500)
  INZ('SELECT LASTNAME FROM CORPDATA.EMPLOYEE +
       WHERE EMPNO = ?');
...
//*************************************************************
//* Prepare STMT as initialized in declare section            *
//*************************************************************
EXEC SQL PREPARE S1 FROM :STMT;

//*************************************
//* Declare Cursor for STMT           *
//*************************************
EXEC SQL DECLARE C1 CURSOR FOR S1;

//*****************************************************
//* Assign employee number to use in select statement *
//*****************************************************
EMPNUM = '000110';

//**********************
//* Open Cursor        *
//**********************
EXEC SQL OPEN C1 USING :EMPNUM;

//***********************************************
//* Fetch record and put value of               *
//* LASTNAME into NAME                          *
//***********************************************
EXEC SQL FETCH C1 INTO :NAME;

//********************************
//* Program processes NAME here  *
//********************************
...
//******************
//* Close cursor   *
//******************
EXEC SQL CLOSE C1;

相关问题