首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >我们可以在SELECT查询中使用主机变量作为表名吗?

问我们可以在SELECT查询中使用主机变量作为表名吗?
EN

Stack Overflow用户
提问于 2012-09-28 09:40:50
回答 2查看 2.3K关注 0票数 3

我正在试验Pro*C代码。

我有3个表( emp、mgr、all);所有3个表都包含emp_id和emp_name。我尝试了下面的代码,这给我带来了错误。如果可能的话请告诉我?

代码语言:javascript
复制
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使用变量吗?

EN

回答 2

Stack Overflow用户

发布于 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

票数 3
EN

Stack Overflow用户

发布于 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):

代码语言:javascript
复制
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 ...

    // ...
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12637477

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档