我正在试验Pro*C代码。
我有3个表( emp、mgr、all);所有3个表都包含emp_id和emp_name。我尝试了下面的代码,这给我带来了错误。如果可能的话请告诉我?
const char table_name[3]={'emp','mgr','all'}
int counter = 0;
while(counter < 3)
{
. . .
EXEC SQL SELECT emp_name INTO :ename
From :table_name[counter++]
where emp_id=:emp_id;
}我们可以为SELECT和FROM使用变量吗?
发布于 2012-09-28 10:00:47
这称为动态SQL:
使用此信息:
动态SQL 虽然嵌入式SQL适用于固定的应用程序,但有时程序动态创建整个SQL语句是很重要的。 使用动态SQL,可以发出存储在字符串变量中的语句。 准备将字符串转换为SQL语句,并执行该语句。考虑下面的例子。 char *s =“插入emp值(1234,'jon',3)";EXEC SQL准备Q从:s;EXEC SQL执行q; 或者,准备和执行可以合并成一个语句: char *s =“插入emp值(1234,'jon',3)";EXEC SQL立即执行:s;
来源:http://infolab.stanford.edu/~ullman/fcdb/oracle/or-proc.html
发布于 2013-08-11 10:46:15
不,我们不能使用主机变量为Pro*C中的静态SQL语句提供表名。
引用Oracle11.2g的C程序员指南:
不能使用输入主机变量来提供SQL关键字或数据库对象的名称。。。如果需要在运行时更改数据库对象名称,请使用动态SQL。另见第13章,"Oracle动态SQL“。
在Pro*C中,Oracle提供了执行SQL语句的不同方法。主要区别是静态方法和动态方法。对于动态,有几个子方法允许不同的自由度。
静态SQL语句不是100%静态的--您可以在where子句表达式中使用输入/输出主机-变量(作为操作数),在insert语句中提供值,作为选择目标等,但不能指定表名。对于静态嵌入式SQL来说,这太“动态”了。
请注意,仍然可以在动态准备的SQL语句中使用主机变量。建议这样做可以避免SQL注入问题,并提高性能(当多次执行语句时)。
示例(使用Oracle动态SQL方法3):
const char *table_name[3] = {"emp", "mgr", "all"};
unsigned table_name_size = 0;
unsigned i = 0;
for (i = 0; i<table_name_size; ++i) {
char stmt[128] = {0};
snprintf(stmt, 128,
"SELECT emp_name "
" FROM %s "
" WHERE "
" emp_id = :emp_id",
table_name[i]);
EXEC SQL PREPARE emp_stmt FROM :stmt;
// check sqlca.sqlcode ...
EXEC SQL DECLARE emp_cursor CURSOR FOR emp_stmt;
EXEC SQL OPEN emp_cursor USING :emp_id;
// check sqlca.sqlcode ...
EXEC SQL FETCH emp_cursor INTO :ename;
// check sqlca.sqlcode ...
EXEC SQL CLOSE emp_cursor;
// check sqlca.sqlcode ...
// ...
}https://stackoverflow.com/questions/12637477
复制相似问题